服务熔断保护实践--Hystrix

news2024/11/25 0:55:49

概述

微服务有很多互相调用的服务,构成一系列的调用链路,如果调用链路中某个服务失效或者网络堵塞等问题,而有较多请求都需要调用有问题的服务时,这是就会造成多个服务的大面积失效,造成服务“雪崩”效应。

服务“雪崩”的根本原因在于服务之间的强依赖,为了预防服务“雪崩”这一问题,可以做好服务隔离、服务熔断降级、服务限流。

服务隔离:当某个服务故障时,不波及其他模块,不影响整体服务。

服务熔断:当下游服务因为请求压力过大造成响应慢或响应失败时,上游服务为了保护系统,暂时切断对下游服务的调用,直接返回一个降级的内容,从而保全整体系统。

服务限流:限制系统的输入和输出达到保护系统的目的,例如:限制请求速率,超出的请求不处理或者暂缓处理或降级处理。

本文介绍的服务熔断组件是Hystrix。

本文的操作是在 微服务负载均衡实践 的基础上进行。

环境说明

jdk1.8

maven3.6.3

mysql8

spring cloud2021.0.8

spring boot2.7.12

idea2022

步骤

在请求的接口类使用hystrix的服务熔断
1.添加依赖

在order-service里添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.10.RELEASE</version>
</dependency>

在spring cloud 的2021.0.8版本里,找不到netflix-hystrix了,引入依赖需要单独添加版本号

2.激活hystrix

在order-service启动类上方添加注解@EnableHystrix注解

@EnableHystrix
public class OrderApplication {

3.降级处理

修改OrderController类

(1)在OrderController添加降级方法

/**
 * 降级方法
 *  和需要受到保护的方法的 返回值一致、方法参数一致
 */
public Product orderFallBack(Long id){
    Product product = new Product();
    product.setProductName("触发降级方法");
    return product;
}

(2)在需要受到保护的方法上使用@HystrixCommand配置

/**
 * 使用注解配置熔断保护
 *   fallbackmethod:配置熔断之后的降级方法
 */
@HystrixCommand(fallbackMethod = "orderFallBack")
@RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
public Product findById(@PathVariable Long id){

4.模拟网络延迟

在product-service的服务方法,添加2秒睡眠时间

		try {
            Thread.sleep(2000l);//模拟网络延迟
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

5.Hystrix配置

order-service的application.yml中添加如下配置

hystrix:
  command:
    default:
      execution:
        isolation:
          strategy: ExecutionIsolationStrategy.SEMAPHORE #信号量隔离
          #strategy: # ExecutionIsolationStrategy.THREAD 线程池隔离
          thread:
            timeoutInMilliseconds: 2000 #默认的连接超时时间1秒,若1秒没有返回数据,自动的触发降级逻辑
      circuitBreaker:
        requestVolumeThreshold: 5 #触发熔断的最小请求次数,默认20 /10秒
        sleepWindowInMilliseconds: 10000 #熔断多少秒后去尝试请求 默认 5   打开状态的时间
        errorThresholdPercentage: 50 #触发熔断的失败请求最小占比,默认50%

6.测试

启动eureka、product、order服务

浏览器访问

http://localhost:9002/order/buy/1

因为product服务方法里模拟请求网络延迟,设置有2s的睡眠时间,加上到数据库请求数据的一些耗时过程,总的请求时间将大于2s,而线程超时时间设置为2s,所以会触发降级方法。

把线程超时时间调大,例如:调整为6秒

重新启动order-service,浏览访问测试,能正常访问到数据。

7.统一的降级方法

如果每个方法都写一个降级方法,方法多的时候,很麻烦,可以统一指定降级方法。

修改OrderController类,添加统一降级方法

	/**
     * 指定统一的降级方法
     *   注意方法没有参数
     */
    public Product defaultFallBack(){
        Product product = new Product();
        product.setProductName("触发统一的降级方法");
        return product;
    }

在OrderController类上方添加@DefaultProperties注解

@DefaultProperties(defaultFallback = "defaultFallBack")
public class OrderController {

修改findById方法上方的@HystrixCommand注解,将
@HystrixCommand(fallbackMethod = "orderFallBack")
改为
@HystrixCommand

修改order-service的application.yml配置,将线程超时时间改为2000

重启order服务

测试

触发了统一的降级方法,说明统一的服务降级方法生效。

Feign结合hystrix的服务熔断
1.复制服务

复制order-service得到order-service-feign_hystrix(注意:在idea里直接复制会有问题。在文件资源管理器里复制才不会出现问题。

修改order-service-feign_hystrix的pom.xml,修改artifactId为如下

<artifactId>order-service-feign_hystrix</artifactId>

在父工程pom.xml添加一个模块

<module>order-service-feign_hystrix</module>

在order-service-feign_hystrix服务操作

2.feign中开启hystrix及相关配置

修改order-service-feign_hystrix服务application.yml在Fegin中开启hystrix

# 在feign中开启hystrix熔断
feign:
  circuitbreaker:
    enabled: true

修改 端口号及服务名称

server:
  port: 9003
spring:
  application:
    name: service-order-feign_hustrix

hystrix设置

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 2000 #默认的连接超时时间1秒,若1秒没有返回数据,自动的触发降级逻辑
      circuitBreaker:
        enabled: true
        requestVolumeThreshold: 5
        errorThresholdPercentage: 10
        sleepWindowInMilliseconds: 10000
3.接口实现类中实现降级逻辑

编写接口实现类,编写熔断降级方法

package org.example.order.feign;

import org.example.order.entity.Product;
import org.springframework.stereotype.Component;

@Component
public class ProductFeginClientCallBack implements ProductFeignClient{
    /**
     * 降级方法
     */
    @Override
    public Product findById(Long id) {
        Product product = new Product();
        product.setProductName("触发Feign熔断降级方法");
        return product;
    }
}
4.接口注解申明降级类

修改ProductFeignClient接口类

@FeignClient添加使用降级的方法所在的类 fallback = ProductFeginClientCallBack.class

@FeignClient(name = "service-product", fallback = ProductFeginClientCallBack.class)
public interface ProductFeignClient {

    /**
     * 配置需要调用的微服务接口
     * @return
     */
    @RequestMapping(value = "/product/{id}", method = RequestMethod.GET)
    Product findById(@PathVariable("id") Long id);
}
5.注释或删除之前的Hystrix相关代码

注释或删除启动类的@EnableHystrix注解

//@EnableHystrix
public class OrderApplication {

注释或删除OrderController之前的Hystrix相关的内容

6.启动及测试

启动eureka、product、order(9003)服务

浏览器访问

http://localhost:9003/order/buy/1

请求响应时间超过线程时间限制,触发了Feign熔断降级方法。

修改order的application.yml配置文件,设置线程超时时间为6000毫秒

重启order(9003)服务

浏览器访问

返回时间小于设置的超时时间,不触发降级方法,返回正常数据。

Feign实现服务熔断总结:

1.配置添加开启服务熔断,并设置hystrix超时参数

2.添加ProductFeignClient接口的实现类,在实现类里实现降级逻辑。

3.在ProductFeignClient接口类中的注解声明降级类

hystrix监控

如何才能了解断路器中的状态呢?hystrix监控可以做到这一点。

在order-service操作

1.导入依赖
        <!--监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
            <version>2.2.10.RELEASE</version>
        </dependency>

2.启用HystrixDashboard监控

在启动类上方添加@EnableHystrixDashboard注解

@EnableHystrixDashboard
public class OrderApplication {

3.启动服务

启动eureka、product、order服务

4.初步测试

浏览器访问

http://localhost:9002/hystrix

http://localhost:9002/actuator

返回的数据格式化后,如下:

{
	"_links": {
		"self": {
			"href": "http://localhost:9002/actuator",
			"templated": false
		},
		"health": {
			"href": "http://localhost:9002/actuator/health",
			"templated": false
		},
		"health-path": {
			"href": "http://localhost:9002/actuator/health/{*path}",
			"templated": true
		}
	}
}

6.修改配置

修改order服务的application.yml

给actuator暴露端点

# 给actuator暴露端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

注意:隔离设置为线程池隔离

hystrix:
  command:
    default:
      execution:
        isolation:
#          strategy: SEMAPHORE #信号量隔离
          strategy: THREAD #线程池隔离

 配置允许的主机

hystrix:
  dashboard:
    proxy-stream-allow-list: localhost
7.测试

重启order服务

浏览器访问

http://localhost:9002/actuator/hystrix.stream

正常可以看到持续输出ping: 

浏览器访问

http://localhost:9002/hystrix

在Hystrix Dashboard页面输入框中,填写

http://localhost:9002/actuator/hystrix.stream

点击Monitor Stream

此时Circuit和Threads Pools都是loading状态,还没有具体数据

访问一次9002的服务

http://localhost:9002/order/buy/1

查看hystrix的dashboard,有数据了。

 

访问多次

http://localhost:9002/order/buy/1

看到监控页面,有折线图,表示触发熔断的情况

各指标的含义

断路器的三种状态:Closed、Open、Half Open

Closed(关闭):

    所有请求都可以正常访问

Open(开启)

    所有请求都会进入降级方法中

Half Open(半开)

    维持Open状态一段时间(5s)后,断路器进入半开状态,尝试释放一个请求到远程微服务,如果服务访问正常,断路器就进入Closed状态,如果不能访问,继续保存Open状态5s。

完成!enjoy it!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1147408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React Hooks 实战案例

文章目录 一、React Hooks 简介二、React Hooks 的基本用法1. 使用 useState 创建状态2. 使用 useEffect 添加副作用 三、React Hooks 的常见问题1. 循环引用问题2. 副作用问题 四、React Hooks 实战案例1. 使用 useReducer 和 Redux&#xff1a;2. 使用 useContext&#xff1a…

HashJoin 在 Apache Arrow 和PostgreSQL 中的实现

文章目录 背景PostgreSQL HashJoin实现PG 执行器架构HashJoin 基本流程HashJoin 实现细节Join 类型HashJoin 的划分阶段HashJoin 的分批处理阶段JOIN 类型的状态机转换HashJoin 的投影和过滤 Arrow Acero HashJoin实现Acero 基本框架HashJoin 基本流程 总结 背景 近两个月转到…

C++ 中的仿函数 functor

一 仿函数的概念 1. 定义 仿函数&#xff08;functor&#xff09;是一种使用上像函数的类&#xff0c;其本质是一个实现了 operato() 函数的类&#xff0c;这种类就有了类似于函数一样的使用行为&#xff0c;这就是仿函数的类。 仿函数在 C STL标准库中被大量使用。 2. 特…

图神经网络和分子表征:5. Completeness

大家都知道 “两点确定一线&#xff0c;三点确定一平面”&#xff0c;那么多少个变量可以确定一个分子呢&#xff1f;这是最近顶刊们热烈讨论的话题。 &#xff08;据笔者不完全统计&#xff09;最早在 SphereNet &#xff08;2022 ICLR&#xff09;论文里&#xff0c;摘要上就…

【多态-动态绑定-向上转型-抽象类】

文章目录 静态绑定动态绑定多态的具体实现向上转型多态的优缺点抽象类抽象类的作用 总结 静态绑定 重载就是典型例子 动态绑定 多态的具体实现 //多态 class Animal{public String name;public int age;//无参构造方法public Animal() {}//有参构造方法public Animal(Strin…

MySQL安装『适用于 CentOS 7』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; MySQL 学习 &#x1f383;操作环境&#xff1a; CentOS 7.6 腾讯云远程服务器 &#x1f381;软件版本&#xff1a; MySQL 5.7.44 文章目录 1.MySQL 的清理与安装1.1查看是否存在 MySQL 服务1.2.卸载原有服务1.…

每日Python:十个实用代码技巧

1、Jpg转Png 示例代码&#xff1a; # 图片格式转换, Jpg转Png# 方法① from PIL import Imageimg Image.open(demo.jpg) img.save(demo_open.png)# 方法② from cv2 import imread, imwriteimage imread("demo.jpg", 1) imwrite("demo_imread.png", im…

近年来上海高考数学命题趋势和备考建议,附1990年以来真题和解析

这篇文章六分成长为您介绍上海高考数学科目的一些分析和如何备考2024年的上海高考数学&#xff0c;并且为您提供1990-2023年的34年的上海高考数学真题和答案解析&#xff0c;供您反复研究。 一、上海高考数学题近年来的命题特点和趋势 1. 注重基础知识和基本技能&#xff1a;…

一文带你在GPU环境下配置YOLO8目标跟踪运行环境

本文介绍GPU下YOLO8目标跟踪任务环境配置、也即GPU下YOLO8目标检测任务环境配置。 YOLO8不仅仅可以实现目标检测&#xff0c;其还内置有Byte-Tracker、Bot-Tracker多目标跟踪算法。可以实现行人追踪统计、车流量跟踪统计等功能。值得注意的是Byte-Tracker、Bot-Tracker多目标跟…

全面详细讲解OSEK直接网络管理,并对比Autosar网管。

搞了两年的Autosar&#xff0c;用到的网络管理都是Autosar网络管理&#xff0c;虽然偶尔有听到或看到Osek网络管理&#xff0c;但是一直没机会具体进行开发和测试。最近有机会具体接触和开发到&#xff0c;弄完之后感受就是&#xff1a;还是Autosar的网络管理好用&#xff0c;O…

10、SpringCloud -- 优化重复下单

目录 优化重复下单问题的产生:需求:思路:代码:测试:优化重复下单 之前超卖、重复下单的解决方式 问题的产生: 比如这个秒杀活动没人去玩,只有一个人去参与秒杀,然后秒杀成功了,因为有联合索引,所以这个人他没法重复下单,但是他依然去请求秒杀,在秒杀的10个商品没…

设计模式大赏(一):桥接模式,组合模式

设计模式大赏&#xff08;一&#xff09;&#xff1a;桥接模式&#xff0c;组合模式 导言 本篇文章是设计模式大赏中的第一篇文章&#xff0c;这个系列的文章中我们主要将介绍一些常见的设计模式&#xff0c;主要是我在看Android源码中发现用到的一些设计模式。本篇文章将主要…

Android 快速实现隐私协议跳转链接

首先在string.xml创建对应字串 <string name"link">我已仔细阅读并同意<annotation value"privacy_policy">《隐私政策》</annotation>和<annotation value"service_agreement">《服务协议》</annotation></st…

十八、模型构建器(ModelBuilder)快速提取城市建成区——批量掩膜提取夜光数据、夜光数据转面、面数据融合、要素转Excel(基于参考比较法)

一、前言 前文实现批量投影栅格、转为整型,接下来重点实现批量提取夜光数据,夜光数据转面、夜光数据面数据融合、要素转Excel。将相关结果转为Excel,接下来就是在Excel中进行阈值的确定,阈值确定无法通过批量操作,除非采用其他方式,但是那样的学习成本较高,对于参考比较…

c++设计模式三:工厂模式

本文通过一个例子简单介绍简单工厂模式、工厂模式和抽象工厂模式。 1.简单工厂&#xff08;静态&#xff09; 假如我想换个手机&#xff0c;换什么手机呢&#xff1f;可以考虑苹果或者华为手机&#xff0c;那我们用简单工厂模式来实现这个功能&#xff1a; 我们关注的产品是手…

人工智能与航天技术的融合:未来发展的新趋势

人工智能与航天技术的融合&#xff1a;未来发展的新趋势 随着科技的飞速发展&#xff0c;人工智能和航天技术已经成为人类探索未知世界的重要工具。本文将探讨这两个领域的结合点&#xff0c;以及未来的发展趋势和应用前景。通过了解这些技术&#xff0c;读者将更好地理解人工…

用Python定义一个函数,用递归的方式模拟汉诺塔问题

【任务需求】 定义一个函数&#xff0c;用递归的方式模拟汉诺塔问题&#xff0c;三个柱子&#xff0c;分别为A、B、C&#xff0c;其中A柱子上有N个盘子&#xff0c;从小到大编号为1到N&#xff0c;盘子大小不同。现在要将这N个盘子从A柱子移动到C柱子上&#xff0c;但移动的过…

段页式管理方式

一、分段、分页的优缺点 1.分页管理&#xff1a;内存空间利用率高&#xff0c;无外部碎片&#xff0c;只有少量页内碎片&#xff0c;以物理结构划分&#xff0c;不便于按逻辑方式实现信息共享和保护 2.分段管理&#xff1a;为段长过大分配连续空间会很不方便&#xff0c;会产生…

Nginx动静分离以及防盗链问题

目录 1.动静分离 1.1概念 1.2准备环境 1.3.测试访问 2.Nginx防盗链问题 2.1nginx 防止网站资源被盗用模块 2.2防盗链配置 2.3准备两台机器 2.4测试 ①开启防盗链 ②让盗链ip可一访问服务资源 ③防盗链不设置none参数 1.动静分离 1.1概念 为了加快网站的解析速度&…

【图像分类】钢轨表面缺陷分类数据集介绍(4个类别)

写在前面&#xff1a; 首先感谢兄弟们的支持&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…