SpringCloud微服务组件-断路器hystrix

本文详细介绍了Spring Cloud中的Hystrix断路器如何实现服务熔断和降级,包括配置步骤、超时降级、全局降级策略以及自动触发隔离与恢复的过程。通过实例演示了如何在服务提供者和调用者层面进行降级配置,并探讨了Hystrix的常见功能及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.定义

断路器:断路器可以把某个独立微服务隔离起来,提高系统的容错率,避免错误的异常的调用,他可以保证一个系统服务出了问题不会导致整体系统服务的奔溃,从而提升微服务系统的稳定性。

服务熔断:当一个服务不可用或者超时又或者发生异常再或者网络拥堵的时候,为了避免整个系统雪崩效应,那么我们会切断和这个系统的通信,这个骚操作叫做服务熔断

服务降级:服务熔断后,这个服务对外不可用了,所以此时我们可以提供一个兜底的方案,也就是提供一个方法,这个方法就是弥补服务熔断后所提供的内容,这个叫做服务降级

二.配置步骤

2.1.引入pom依赖

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

2.2 熔断-降级

2.2.1 服务提供者熔断

1 服务异常或者超时,请求过来获得兜底的方法数据,比如返回空对象或者“系统异常,请联系管理员”类似的。这个过程就是熔断该服务,不让你请求了,我会返回一个其他的方法。

// 在对应业务的controller上添加注解的熔断机制,并且写上降级方法
@HystrixCommand(fallbackMethod = "queryByIdsFallback")

// 当降级后,则调用降级代码即可
// 用于降级的方法
public GraceJSONResult queryByIdsFallback(String userIds) {
    System.out.println("进入降级方法:queryByIdsFallback");

    List<AppUserVO> publisherList = new ArrayList<>();
    List<String> userIdList = JsonUtils.jsonToList(userIds, String.class);
    for (String userId : userIdList) {
        // 手动构建空对象,详情页所展示的用户信息可有可无
        AppUserVO userVO = new AppUserVO();
        // 添加到publisherList
        publisherList.add(userVO);
    }

    return GraceJSONResult.ok(publisherList);
}

2 服务提供者的启动类开启熔断注解

@EnableCircuitBreaker

2.2.2 服务调用者降级

1.定义

一旦服务熔断后,那么就变得不可访问,我们可以在调用端进行降级处理,此时服务提供端可能宕机或者停机

2.配置

1,配置yml文件

feign:
  hystrix:
    enabled: true

2,服务调用者启动类开启hystrix注解

@EnableHystrix

3,在feign客户端上添加降级配置

@FeignClient(value = MyServiceList.SERVICE_USER, fallbackFactory = UserFactoryFallback.class)

4,实现UserFactoryFallback.class

@Component
public class UserFactoryFallback implements FallbackFactory<UserControllerApi> {

    @Override
    public UserControllerApi create(Throwable throwable) {
        return new UserControllerApi() {
            @Override
            public GraceJSONResult getUserInfo(String userId) {
                return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR_FEIGN);
            }

            @Override
            public GraceJSONResult getAccountInfo(String userId) {
                return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR_FEIGN);
            }

            @Override
            public GraceJSONResult updateUserInfo(@Valid UpdateUserInfoBO updateUserInfoBO) {
                return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR_FEIGN);
            }

            @Override
            public GraceJSONResult queryByIds(String userIds) {
                System.out.println("进入客户端的服务降级");
                List<AppUserVO> publisherList = new ArrayList<>();
                return GraceJSONResult.ok(publisherList);
            }
        };
    }
}

注意:服务的提供方和调用方都能实现降级,但是一般来说,我们都是以调用端降级为主。因为服务提供者有可能会宕机挂掉

三.hystrix常用功能

3.1 超时的降级

我们也可以设置超时的时间。比如5秒内响应是正常的,超过5秒则调用降级的方法。
只需要添加超时属性即可:

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 2000   # 设置hystrix超时时间,超过2秒触发降级

3.2 全局的降级

3.2.1 定义

目前虽然达道了降级的目的,但是每个业务都带上一个降级方法,那么就是2倍的代码量,太多了。

其实我只需要统一的配置一个全局降级方法即可,只有再有必要的时候才会使用局部降级。比如我们设定10个方法里8个使用全局降级,其余的2个配置他自己专有的降级方法即可。

3.2.2 配置

1.在controller上方加上

@DefaultProperties(defaultFallback = "globalFallback")

2.在原来的方法上去掉降级方法,(加上则以局部降级为主):

@HystrixCommand//(fallbackMethod = "detailFallback")

3.3 hystrix-自动触发熔断隔离与恢复

1,定义
断路器是如何工作的,看如下图
在这里插入图片描述图中标识了hystrix的几个状态,首先正常情况下,断路器是处于关闭状态(CLOSED),如果此时发生异常,在超过一定百分比(阈值)的异常错误,则开启断路器(OPEN)此时发生熔断,所有请求无法访问,此时访问兜底的降级方法。等待一定时间以后,断路器会慢慢释放一个请求去检测服务是否可用,此时处于半开状态(HALF OPEN),如果请求没毛病,则关闭断路器,否则继续开启断路器。如此持续重复进行检查。

在这个过程中,第2步,没有超过阈值的异常,会触发服务端的降级方法,一旦超过,则触发客户端feign的降级方法。这里需要数值。

以上这个过程都是由hystrix来实现,那么我们只需要做好配置即可。

代码中我们可以设置一下判断,指定用户id,如果不匹配,则抛出异常,否则就是正常的

hystrix断路器的默认阈值如下参考:

一定时间(10s)内触发熔断的最小请求次数(达道次数才会触发熔断判断):20
触发熔断的请求失败率(阈值):50%
断路器开启的持续时间:5秒(关闭到半开的时间)

配置hystrix断路器

hystrix:
  command:
    default:
      circuitBreaker:   # 配置断路器
        enabled: true
        requestVolumeThreshold: 10    # 触发熔断最小请求次数,默认:20
        sleepWindowInMilliseconds: 10000    # 熔断后过几秒后尝试半开状态(请求重试),默认:5s
        errorThresholdPercentage: 50  # 触发熔断的失败率,默认:50
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值