基于访问数量的断路器

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 测试



posted @   无涯子wyz  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示