Hystrix是一个用于处理分布式系统的延迟和容错的开源库,能保证在一个依赖出问题的情况下不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
- 服务降级fallback
服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示- 程序运行异常
- 超时
- 服务熔断触发服务降级
- 线程池、信号量打满也会导致服务降级
- 服务熔断break
达到最大服务访问后,直接拒绝访问,然后调用服务降级的方法并返回友好提示 - 服务限流flowlimit
秒杀高并发等操作,严禁一窝蜂的过来拥挤
服务降级
一般是放在客户端,这里先说服务端8001端口
首先是添加pom依赖,引入hystrix
<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
主启动类加上注解
@EnableHystrix
或者
@EnableCircuitBreaker
对于要降级的service实现加上注解
@HystrixCommand(fallbackMethod = "paymentInfoTimeoutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})
其中paymentInfoTimeoutHandler是服务降级后调用的方法名,方法需要自己写(注意,这个方法的返回类型、参数类型都要和要保护的方法保持一致),一般就是返回一个错误页面,value是最大的等待时间,由name知单位是ms,例子中是超过3s即跳转paymentInfoTimeoutHandler方法。
下面说80端口的使用。
首先添加yml配置
#开启Hystrix支持
feign:
hystrix:
enabled: true
主启动类加注解
@EnableHystrix
然后可以直接在controller层的方法中加类似注解
@HystrixCommand(fallbackMethod = "paymentInfoTimeoutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})
即可实现客户访问端自身的保护。
或者直接加一个全局异常方法,写在controller中,然后controller添加全局注解,
@DefaultProperties(defaultFallback = "paymentGlobalFallback")
其中paymentGlobalFallback为自定义的方法。需要时,在方法头添加注解@HystrixCommand,即可实现保护。
再或者,在客户端的service上使用注解
@FeignClient(value = "cloud-payment-hystrix-service",fallback = PaymentFallback.class)
然后定义PaymentFallback类,在类中重写,当service中的方法出现超时、程序异常、宕机则会服务降级实现PaymentFallback里面重写的方法。
注意,这里一定要在yml中配置好
#开启Hystrix支持