基于访问数量的断路器
1 新建一个微服务模块
我们在cloud-payment-service
模块中新增一个controller
以提供给其它微服务模块调用。
@RestController
public class PayCircuitController {
@GetMapping("/pay/circuit/{id}")
public String myCircuit(@PathVariable("id") Integer id){
if(id == -4) {
throw new RuntimeException("ID不能为负数");
}
if(id == 999) {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "Hello Circuit! InputId: " + id + " \t" + IdUtil.simpleUUID();
}
}
根据ID返回一段字符串,当ID为负数或者999使用特殊处理,其它情况直接返回字符串。
2 编写OpenFeign访问接口
@FeignClient(value = "cloud-payment-service", path = "/pay")
@RestController
public interface PayFeignApi {
@GetMapping("/circuit/{id}")
public String myCircuit(@PathVariable("id") Integer id);
}
3 引入依赖
<!-- Circuit断路器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
<!-- 断路器保护需要AOP实现 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
4 配置文件
resilience4j:
circuitbreaker:
configs:
default:
failure-rate-threshold: 50 # 设置50%失败打开断路器,超过失败百分比的circuitBreaker变为OPEN状态
sliding-window-type: COUNT_BASED # 滑动窗口类型
sliding-window-size: 6 # 滑动窗口大小配置COUNT_BASED表示6个请求 配置为TIME_BASED表示6s
minimum-number-of-calls: 6 # 断路器计算失败率或者慢调用率之前所需要的最小样本
automatic-transition-from-open-to-half-open-enabled: true # 是否开启自动从开启状态过渡到半开状态。默认为true
wait-duration-in-open-state: 5s # 从OPEN到HALF_OPEN需要等待时间
permitted-number-of-calls-in-half-open-state: 2 # 半开状态最大请求数
record-exceptions:
- java.lang.Exception
instances:
cloud-payment-service:
base-config: default
5 编写业务
@RestController
public class OrderCircuitController {
@Resource
private PayFeignApi payFeignApi;
@GetMapping("/feign/pay/circuit/{id}")
@CircuitBreaker(name = "cloud-payment-service" , fallbackMethod = "myCircuitFullBack")
public String myCircuitBreaker(@PathVariable("id") Integer id){
return payFeignApi.myCircuit(id);
}
@Operation(summary = "服务降级后的处理方法")
public String myCircuitFullBack(Integer id,Throwable e){
return "系统繁忙,请稍后再试!!";
}
}
6 测试
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析