学而不思则罔 思而不学则殆.|

漆原Blog

园龄:5年10个月粉丝:0关注:1

微服务之熔断器篇-Hystrix

雪崩效应与熔断机制

什么是雪崩效应?

微服务内部调用时,由于某一个服务出现故障,导致请求调用阻塞,最终服务崩溃,且故障沿着调用链路蔓延,影响到其它依赖该服务的服务,导致整个微服务系统的瘫痪,称之为雪崩效应。

img

如何解决雪崩效应?

针对出现故障的服务提供熔断机制,当发现服务状态不正常、处理不及时情况时中断运行,采用服务降级策略,直至服务状态回归正常。


Hystrix 简介

img

Hystrix (豪猪),是Netflix提供的开源熔断器组件,向微服务提供熔断机制并预防雪崩,用来保证微服务整体架构健康。

Hystrix [hɪst'rɪks],中文含义是豪猪,豪猪的背上长满了棘刺,使它拥有了强大的自我保护能力。而 Spring Cloud Hystrix 作为一个服务容错与保护组件,也可以让服务拥有自我保护的能力,因此也有人将其戏称为“豪猪哥”。

其主要功能有:

  • 预防微服务由于故障,请求长时间等待导致Web容器线程崩溃
  • 为故障提供备选方案,通过fallback机制,提供服务降级
  • 提供仪表盘DashBoard,实时监控运行状态

服务降级:将出现故障服务,通过简单、轻量级且稳定的处理方式,对其进行屏蔽。而不是长时间的阻塞或抛出调用方无法处理的异常。这样可以保证线程不会被长时间占用,避免故障在调用链路蔓延,防止雪崩的发生。

Hystrix 熔断器工作原理

如图所示,熔断器具有三种状态:CLOSED关闭、OPEN打开、HALF-OPEN半开。三种状态依次发生转变。

服务启动后熔断器默认为CLOSED关闭状态。

当过去20次请求错误率(触发服务降级次数)超过50%时,则认为当前服务是不稳定的,Hystrix会将熔断器状态切换为OPEN打开状态。熔断器被开启后将不再发起任何实质的请求,直接进行服务降级,熔断窗口期为5秒。

窗口期过后再次尝试访问故障服务,同时将状态切换为HALF-OPEN半开,如果目标服务能够返回正常的响应,则将状态切换为CLOSED关闭熔断器。反之则重新将状态切换为OPEN,继续进行熔断。

什么情况下会触发服务降级?

  • FAILURE:执行失败,抛出异常
  • TIMEOUT:执行超时(默认1秒)
  • SHORT_CIRCUITED:熔断器状态为OPEN
  • THREAD_POOL_REJECTED:线程池拒绝
  • SEMAPHORE_REJECTED:信号量拒绝

信号量:通过一个整数,记录当前有多少个请求正在被处理。


OpenFeign中使用Hystrix

操作流程

  • OpenFeign内置了Hystrix,默认关闭,需要手动开启。

  • @FeignClient注解中添加fallback属性说明Fallback类。

  • Fallback类要实现相同接口,重写服务降级业务逻辑。

具体步骤(以下为示例代码,实际开发请遵循编码规范)

​ 假设存在用户服务(user-service),提供/user/queryList 查询并返回用户信息。

{
	"code": "200",
	"result": [
		{
			"id": "1",
			"name": "张三"
		},
		{
			"id": "2",
			"name": "李四"
		}
	]
}
  1. 创建工程,引入OpenFeign依赖(注册中心依赖与相关配置不再赘述)

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. 开启Hystrix

    feign:
      hystrix:
        enabled: true
    
  3. 启动类添加@EnableFeignClients注解

  4. 创建Feign客户端,在@FeignClient 注解中设置fallback属性来指定服务降级处理类

    @FeignClient(name = "USER-SERVICE", fallback = UserServiceFallback.class)
    public interface UserService {
    
        @GetMapping("/user/queryList")
        CallbackResult queryUserList();
    }
    
  5. 创建降级处理类

    该类需要实现Feign客户端,将其放入Spring容器,并重新方法为服务降级业务代码。

    @Component
    public class UserServiceFallback implements UserService {
    
        @Override
        public CallbackResult queryUserList() {
            return new CallbackResult("500", "用户信息查询失败,请稍后再试");
        }
    }
    
  6. 此时,当目标服务故障,则会自动降级,返回较为友好的响应信息。

image-20220830100425866


Hystrix超时设置

image-20220830110043206

  • 连接时间:服务之间的通信时间。

  • 读取时间:服务的业务处理时间。

    熔断时间需要≥总时间,否则会出现业务未处理完成就被熔断情况。关于业务处理时间的计算依据通常为若干次(不包含第一次)请求的响应时间最大值。

Hystrix熔断设置项

超时选项 说明
feign.client.config.[微服务ID|default].connectTimeout Ribbon连接超时时间默认1秒,建议1秒内
feign.client.config.[微服务ID|default].readTimeout Ribbon读取超时时间默认1秒,按业务处理时间设置
hystrix.command.[commandKey|default].execution.isolation.thread.timeoutInMilliseconds Hystrix熔断超时时间默认1秒
hystrix.command.[commandKey|default].circuitBreaker.forceOpen 强制打开熔断器默认关闭,服务下线时手动开启

application.yml 配置如下

feign:
  hystrix:
    enabled: true
  client:
    config:
      default:
        connectTimeout: 500
        readTimeout: 500
hystrix:
  command:
    #"类名#方法名(参数类型1,参数类型2,参数类型n)"
    "MessageService#sendSMS(String,String)":
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 1000
      circuitBreaker:
        forceOpen: false #true代表强制熔断器强制处于Open状态,即服务不可用
        requestVolumeThreshold: 50
        errorThresholdPercentage: 60
        sleepWindowInMilliseconds: 10000
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000

参考文章:

https://itlaoqi.com/

http://c.biancheng.net/springcloud/hystrix.html

本文作者:漆原Blog

本文链接:https://www.cnblogs.com/7moon/p/16636908.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   漆原Blog  阅读(303)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起