Spring Cloud Hystrix断路器(四)
程序员文章站
2022-07-05 18:43:45
...
前言
在微服务场景中,通常会有很多层的服务调用。如果一个底层服务出现问题,故障会被向上传播给用户。我们需要一种机制,当底层服务不可用时,可以阻断故障的传播。这就是断路器的作用。他是系统服务稳定性的最后一重保障。
常常会遇到正在使用某个系统,点击到某一个功能的时候显示该模块正在升级或者请稍后查看等。怎么实现呢??
使用Feign整合Hystrix
默认是不开启的,需要修改配置文件application.yml,添加下面的代码
feign:
hystrix:
#开启Hystrix熔断,默认false
enabled: true
新增支付模块熔断器
/**
* @ Description : 支付模块熔断器
* @ Author : GMaya
* @ CreateDate : 2020/3/18 9:35
* @ Version : 1.0
*/
@Component
public class PayClientFallBack implements PayClient {
@Override public String getPay() {
return "支付模块正在抢修,请稍后!" +" :feign演示";
}
}
修改PayClient接口
@FeignClient(name = "pay",fallback = PayClientFallBack.class) // 服务名称
启动服务端,启动pay客户端,启动order客户端。
访问http://localhost:8082/getOrder
然后把pay客户端关掉!
使用RestTemplat整合Hystrix
pom添加j依赖
<!--熔断器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
启动类新增注解
@EnableCircuitBreaker
或者
@aaa@qq.comaaa@qq.com
也可以使用@SpringCloudApplication 一个顶替仨
SpringCloudApplication注解 源码:
修改订单接口
/**
* @ Description : 订单接口接口
* @ Author : GMaya
* @ CreateDate : 2020/3/16 11:03
* @ Version : 1.0
*/
@RestController
public class OrderController {
// @Autowired
// private PayClient payClient; // 注入支付模块服务
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/getOrder")
@HystrixCommand(fallbackMethod = "getRestTemplateFallBack")
public String getOrder(){
String pay = restTemplate.getForObject("http://pay/getPay", String.class);
// String pay = payClient.getPay();
return pay;
}
private String getRestTemplateFallBack(){
return "不好啦,机房着火了,restTemplate演示!";
}
}
当然,当接口多的时候,还可以改造
/**
* @ Description : 订单接口接口
* @ Author : GMaya
* @ CreateDate : 2020/3/16 11:03
* @ Version : 1.0
*/
@RestController
@DefaultProperties(defaultFallback = "defaultFallback")
public class OrderController {
// @Autowired
// private PayClient payClient; // 注入支付模块服务
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/getOrder")
// @HystrixCommand(fallbackMethod = "getRestTemplateFallBack")
@HystrixCommand // 使用默认熔断,加一个注解就行
public String getOrder(){
String pay = restTemplate.getForObject("http://pay/getPay", String.class);
// String pay = payClient.getPay();
return pay;
}
private String getRestTemplateFallBack(){
return "不好啦,机房着火了,restTemplate演示!";
}
private String defaultFallback(){
return "默认熔断!";
}
}
重启查看
最后:
额外配置,如需更多,请查看专业解释
如果设置和默认值一样,没必要写出来配置
feign:
hystrix:
#开启Hystrix熔断,默认false
enabled: true
hystrix:
command:
# 全局设置
default:
execution:
isolation:
# 命令执行超时时间,默认1000ms,只在线程池隔离中有效。
thread:
timeoutInMilliseconds: 1000
# 发生超时是是否中断,默认true,只在线程池隔离中有效。
interruptOnTimeout: true
# 执行是否启用超时,默认启用true,只在线程池隔离中有效。
timeout:
enabled: true
推荐阅读
-
Spring Cloud Alibaba系列-第四节-创建生产者与消费者服务,注册到Nacos监控服务
-
详解spring cloud hystrix请求缓存(request cache)
-
详解spring cloud hystrix 请求合并collapsing
-
详解Spring Cloud中Hystrix的请求合并
-
详解Spring Cloud Hystrix断路器实现容错和降级
-
详解spring cloud hystrix请求缓存(request cache)
-
详解spring cloud hystrix 请求合并collapsing
-
详解Spring Cloud中Hystrix的请求合并
-
spring cloud 使用Hystrix 实现断路器进行服务容错保护的方法
-
详解Spring Cloud 断路器集群监控(Turbine)