在每个服务中引用该组件,监控当前组件。可被GateWay、Fegin集成。
简介
作用:防止服务雪崩
Hystrix是一个由Netflix开源的容错框架,它主要用于分布式系统中的服务间通信。Hystrix通过在调用服务的过程中添加各种容错机制,来保护系统免受服务故障或网络中断的影响,从而提高了系统的可靠性和弹性。Hystrix提供了许多功能,例如超时控制、断路器、线程池隔离、请求缓存等等,它可以快速、可靠地为您的应用程序提供容错保护。
熔断器的原理很简单,如同电力过载保护器。它可以实现快速失败,如果它在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器,从而防止应用程序不断地尝试执行可能会失败的操作,使得应用程序继续执行而不用等待修正错误,或者浪费 CPU
时间去等到长时间的超时产生。熔断器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。
Hystrix的主要特点包括:
快速失败(Fail Fast):当一个依赖服务出现故障时,Hystrix能够快速地中断请求,避免等待超时而浪费系统资源。
回退机制(Fallback):当一个依赖服务出现故障时,Hystrix能够提供回退逻辑,返回一个默认值或执行备选方案,从而保证系统的稳定性。
熔断器(Circuit Breaker):Hystrix能够自动地监控依赖服务的状态,当故障率达到一定阈值时,自动打开熔断器,防止请求继续发往不可用的依赖服务。
缓存(Cache):Hystrix能够提供缓存机制,避免对同一数据的重复请求,从而提高系统的性能。
隔离(Isolation):Hystrix能够通过线程池隔离、信号量隔离等机制,避免依赖服务的故障对系统的其他部分造成影响。
监控和度量(Monitoring and Metrics):Hystrix能够提供近乎实时的监控和度量,包括请求成功率、请求响应时间、熔断器状态等指标,从而帮助开发人员快速地定位和解决问题。
服务熔断
当满足一定的阈值的时候(默认10s内超过20个请求失败)
当失败率达到一定的时候(默认10s内50%的请求失败)
断路器将会开启
开启时,所有请求都不会进行转发
一段时间后(默认是5s),这个时候断路器是半开状态会让其中一个请求进行转发,如果成功,断路器关闭,若失败,重复4和5
快速上手
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
在入口类添加注解
@EnableCircuitBreaker
服务端熔断
设置熔断后的快速反应(备用处理)
@GetMapping("demo")
@HystrixCommand(fallbackMethod = "demoFallback") //指定快速处理方案的方法名
public String demo(String id){
if(){
throw new RuntimeException("出错!");
}
}
public String demoFallback(String id){
}
默认的处理
为每个方法都自定义处理方式,代码工作有些繁重,可以指定一个通用的默认的处理方法
@HystrixCommand(defaultFallback = "默认的处理")
默认的处理方法返回值为String,没有形参,因为要可以为不同的方法提供处理
自定义的处理方法形参和返回值要和对应的方法对应
注:用hystrix做服务端熔断,只有服务可用才能正常返回fallback处理,因为fallback处理也是该服务的一部分
消费端熔断
由Feign处理,假如整个服务断了,fallback都用不了,由Feign返回
熔断器触发机制
- 怎么记录?失败的请求怎么办
OpenFeign整合
- openfeign和gateway重复了吧,
- 阿我明白了,,,openfegin是项目内部调用,这部分本来就不走网关,,而另外那些要访问网关的(比如前端?)他们需要在网关进行处理才行
openfeign底层默认集成hystrix
开启openFeign对hystrix支持
feign.hystrix.enabled=true
在feign的client接口上
@FeignClient(value = "服务id",fallback=实现类.class)
然后编写bean实现该client接口,重写对应方法,加上组件注解
用工厂模式
以若依项目为例
@FeignClient(value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
编写工厂类,实现FallbackFactory<T>
接口,重写create方法,返回一个内部类对象(毕竟工厂类要返回实体对象,但原client是个接口)
@Component
public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
{
private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
@Override
public RemoteUserService create(Throwable throwable)
{
log.error("用户服务调用失败:{}", throwable.getMessage());
return new RemoteUserService()
{
@Override
public R<LoginUser> getUserInfo(String username, String source)
{
return R.fail("获取用户失败:" + throwable.getMessage());
}
@Override
public R<Boolean> registerUserInfo(SysUser sysUser, String source)
{
return R.fail("注册用户失败:" + throwable.getMessage());
}
};
}
整合GateWay过滤器
spring:
cloud:
gateway:
routes:
# 系统模块
- id: ruoyi-system
uri: lb://ruoyi-system
predicates:
- Path=/system/**
filters:
- StripPrefix=1
# 降级配置
- name: Hystrix
args:
name: default
# 降级接口的地址
fallbackUri: 'forward:/fallback'
上面配置包含了一个
Hystrix
过滤器,该过滤器会应用Hystrix
熔断与降级,会将请求包装成名为fallback
的路由指令RouteHystrixCommand
,RouteHystrixCommand
继承于HystrixObservableCommand
,其内包含了Hystrix
的断路、资源隔离、降级等诸多断路器核心功能,当网关转发的请求出现问题时,网关能对其进行快速失败,执行特定的失败逻辑,保护网关安全。配置中有一个可选参数
fallbackUri
,当前只支持forward
模式的URI
。如果服务被降级,请求会被转发到该URI
对应的控制器。控制器可以是自定义的fallback
接口;也可以使自定义的Handler
,需要实现接口org.springframework.web.reactive.function.server.HandlerFunction<T extends ServerResponse>
。
Hystrix Dashborad 图形化监控
显示状态信息。不是很重要,不推荐
是不是有统一的微服务监控能取代?
引入dashborad依赖, 默认@EnableDiscoveryClient开启
erver.HandlerFunction`。
Hystrix Dashborad 图形化监控
显示状态信息。不是很重要,不推荐
引入dashborad依赖, 默认@EnableDiscoveryClient开启