由于网络原因或者自身的原因,微服务并不能保证服务百分之百可用。如果单个服务出现问题,则调用该服务时会出现延迟甚至调用失败的情况;若调用失败,用户则会重新刷新页面并尝试再次调用,再加上其他服务的调用,从而增加了服务器的负载,导致某个服务瘫痪,甚至整个服务崩溃。
什么是微服务容错保护
Hystrix库可以解决以下问题:
- 对第三方接口/依赖服务潜在的调用失败提供保护和控制机制。
- 在分布式系统中隔离资源,减低耦合,防止服务之间相互调用而导致级连失败。
- 快速失败及迅速恢复。
- 在合适的时机对服务进行优雅降级处理。
- 对服务提供近乎实时的监控、报警和控制操作。
Hystrix是根据”断路器“模式创建的。”断路器“本身是一个开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个符合预期的服务降级处理,而不是长时间地等待或抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间不必要地占用,从而避免了故障在分布式系统中蔓延乃至崩溃。
在请求失败频率较低的情况下,Hystrix还会直接把故障返回给客户端。只有当失败次数达到阈值(默认在20s内失败5次)时,断路器才会被打开并且不再进行后续通信,从而直接进行服务降级(ballback)处理。
Hystrix的开发和实现遵守设计理念:
- 防止由于单个服务的故障,而耗尽整个系统容器(Tomcat,Jetty)的线程资源
- 快速失败,而不是在队列中挤压服务请求
- 提供服务降级(ballback)处理机制
- 使用隔离技术(如舱壁隔离、泳道和断路器模式)来隔离服务依赖之间的影响
- 通过实时的监控和告警,及时发现系统中的潜在问题
- 通过配置更改可以优化低延迟传播的恢复时间,并且Hystrix支持大多数属性的动态更改,从而允许开发者可以实时对低延迟反馈循序进行修改和优化
- 提供对整个所依赖客户端在执行过程中的故障保护与隔离,而不仅仅是网络流量
快速启动Hystrix
继续对之前的项目对修改
1、引入Hystrix
引入spring-cloud-starter-netflix-hystrix依赖包。
2、开启Hystrix支持
在引导类中,增加@EnableCirCuitBreaker注解,开启对服务的荣作保护。
3、修改UserController实现
使用@HystrixCommand注解,该注解告诉服务调用者在调用失败时可以通过fallbackMethod参数指定的方法来实现服务降级处理。
4、容错测试
当两个微服务正常注册时,请求返回正常
现在把USER-SERVICE服务下掉,继续调用,返回的结果getUserNameFallback的内容。
5、服务降级的两种实现方式
1.使用注解完成服务降级实现
使用注解可以最小程度地侵入代码,可以快速让原来的功能支持服务降级。使用时仅需在要需要服务降级处理的方法上增加@HystrixCommand注解即可,并通过fallbackMethod属性设置该方法在降级处理时所使用的方法,然后在降级方法中实现服务降级处理逻辑。
@HystrixCommand注解属性说明:
- groupKey:设定HystrixCommand分组的名称。
- commandKey:设定HystrixCommand的名称。
- threadPoolKey:设定HystrixCommand执行线程池的名称。
- fallbackMethod:设定HystrixCommand服务降级所使用的方法名称,注意该方法需要与主方法定义在同一个类中,并且方法签名也要一致。
- commandProperties:设定HystrixComand属性,比如,断路器失败百分比、断路器时间窗口大小等。
- threadPoilProperties:设定HystrixCommand所执行线程池的属性,比如,线程池的大小,线程池等待队列长度等。
- ingoreExceptions:设定HystrixCommand执行服务降级处理时需要忽略的异常,当这些异常出现时不会执行服务降级处理。
- observableExecutionMode:设置HystrixCommand执行的方式。
- defaultFallback:设置HystrixCommand默认的服务降级处理方法,如同时设定了fallbackMethod,会优先使用fallbackMethod。
2.继承HystrixCommand完成服务降级实现
继承HystrixCommand的降级代码示例
继承HystrixObservableCommand的降级代码实例
6、在Feign中使用Hystrix回退
@FeignClient增加fallback属性
创建UserServiceFallback继承UserService
增加yml文件配置,开启feign中的hystrix功能