SpringCloud Hystrix断路器-服务熔断与降级和HystrixDashboard基础入门
本文采用版本为Hoxton.SR1系列,SpringBoot为2.2.2.RELEASE
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
【1】服务提供者进行降级处理
核心思想:设置自身调用超时时间的峰值,峰值内可以正常运行,超过了需要有兜底的方法处理,作服务降级fallback。
这里采用@HystrixCommand注解,指定fallbackMethod 。
/**
* 超时访问,演示降级
* @param id
* @return
*/
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000")
})
public String paymentInfo_TimeOut(Integer id)
{
int second = 5;
try { TimeUnit.SECONDS.sleep(second); } catch (InterruptedException e) { e.printStackTrace(); }
return "线程池:"+Thread.currentThread().getName()+"paymentInfo_TimeOut,id: "+id+"\t"+"O(∩_∩)O,耗费秒: "+second;
}
public String paymentInfo_TimeOutHandler(Integer id){
return "/(ㄒoㄒ)/调用支付接口超时或异常:\t"+ "\t当前线程池名字" + Thread.currentThread().getName();
}
当前服务不可用/超时,做服务降级,兜底的方案都是paymentInfo_TimeOutHandler
主启动类添加注解@EnableCircuitBreaker
,yml文件不需要进行配置。
【2】服务消费方进行服务降级
如下所示,如果超过1500ms没有收到响应,那么会调用执行fallbackMethod ,也就是paymentTimeOutFallbackMethod给浏览器/上游返回:我是消费者80,对方支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,o(╥﹏╥)o
。
@GetMapping("/consumer/payment/hystrix/timeout/{id}")
@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")
})
public String paymentInfo_TimeOut(@PathVariable("id") Integer id)
{
String result = paymentHystrixService.paymentInfo_TimeOut(id);
return result;
}
public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id)
{
return "我是消费者80,对方支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,o(╥﹏╥)o";
}
yml文件进行配置:
feign:
hystrix:
enabled: true
主启动类添加注解@EnableHystrix:
@SpringBootApplication
@EnableFeignClients
@EnableHystrix
public class OrderHystrixMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderHystrixMain80.class,args);
}
}
【3】@DefaultProperties(defaultFallback = “”)全局统一处理
除了个别重要核心业务有专属,其它普通的方法可以通过@DefaultProperties(defaultFallback = “”) 统一跳转到统一处理结果页面。
这样通用的和独享的各自分开,避免了代码膨胀,合理减少了代码量。
① 业务类添加统一处理
对于 @HystrixCommand 来说,如果没有写具体方法名字,且服务类加了@DefaultProperties属性注解,就用统一全局的降级处理。
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
public class PaymentHystirxController
{
@Resource
private PaymentHystrixService paymentHystrixService;
@GetMapping("/consumer/payment/hystrix/ok/{id}")
public String paymentInfo_OK(@PathVariable("id") Integer id)
{
String result = paymentHystrixService.paymentInfo_OK(id);
return result;
}
@GetMapping("/consumer/payment/hystrix/timeout/{id}")
@HystrixCommand //加了@DefaultProperties属性注解,并且没有写具体方法名字,就用统一全局的
public String paymentInfo_TimeOut(@PathVariable("id") Integer id)
{
String result = paymentHystrixService.paymentInfo_TimeOut(id);
return result;
}
public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id)
{
return "paymentTimeOutFallbackMethod,对方系统繁忙,请10秒钟后再次尝试/(ㄒoㄒ)/";
}
public String payment_Global_FallbackMethod()
{
return "Global异常处理信息,请稍后再试,/(ㄒoㄒ)/~~";
}
}
这样有个弊端就是业务与降级方法耦合严重,业务类会进行膨胀。如果业务类controller通过feign调用了远程服务,那么可以在feignClient接口层进行降级处理。
② 抽离出来在FeignClient接口层进行服务降级处理
FeignClient接口如下所示,自定义PaymentFallBackService实现PaymentHystrixService 接口。
@FeignClient(value = “CLOUD-PROVIDER-HYSTRIX-PAYMENT”,fallback = PaymentFallBackService.class)
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallBackService.class)
public interface PaymentHystrixService {
@GetMapping("/ok/{id}")
String paymentInfo_OK(@PathVariable(value = "id") Integer id);
@GetMapping("/timeout/{id}")
String paymentInfo_Timeout(@PathVariable(value = "id") Integer id);
}
PaymentFallBackService如下所示:
@Component
public class PaymentFallBackService implements PaymentHystrixService {
@Override
public String paymentInfo_OK(Integer id) {
return "paymentInfo_OK降级处理";
}
@Override
public String paymentInfo_Timeout(Integer id) {
return "paymentInfo_Timeout降级处理";
}
}
yml添加配置:
feign:
hystrix:
enabled: true #在Feign中开启Hystrix
主启动类:
@SpringBootApplication
@EnableFeignClients
@EnableHystrix
public class OrderHystrixMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderHystrixMain80.class,args);
}
}