十、Hystrix 断路器(二)服务降级
4、服务降级#
1)先从服务提供方8001找问题#
设置自己调用超时时间的峰值,峰值内可以正常运行,超过了需要有兜底的方法,作为降级fullback
2)设置服务提供方8001的fullback#
① 一旦调用服务方法失败抛出错误信息或者调用服务超过3秒后,会自动调用@HistrixCommand
中标注好的 fullbackMethod方法
@Service public class PaymentService { public String paymentInfo_ok(Integer id){ return "线程池:"+Thread.currentThread().getName()+ " paymentInfo_ok,id:"+id+" O(∩_∩)O哈哈~"; } @HystrixCommand(fallbackMethod = "paymentInfo_timeout_handler", commandProperties = { @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000") //程序运行超过3s, 就会进行服务降级 }) public String paymentInfo_timeout(Integer id){ int timenumber=5; try { TimeUnit.SECONDS.sleep(timenumber); } catch (InterruptedException e) { e.printStackTrace(); } return "线程池:"+Thread.currentThread().getName()+ " paymentInfo_timeout,id:"+id+" 耗时"+timenumber+"秒!!"; } public String paymentInfo_timeout_handler(Integer id){ return "超时+兜底+ o(╥﹏╥)o"; } }
②、主启动类中添加注解 @EnableCircuitBreaker
@SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker public class PaymentHystrixMain8001 { public static void main(String[] args) { SpringApplication.run(PaymentHystrixMain8001.class,args); } }
③ 访问 http://localhost:8001/payment/hystrix/timeout/1,出现下图所示,发现服务确实降级处理了
3)设置服务调用方80fullback处理#
服务调用方也可以做自己的服务降级处理
① yml 添加配置
feign: hystrix: enabled: true
② 主启动类上添加 @EnableHystrix
@SpringBootApplication @EnableFeignClients @EnableHystrix public class ConsumerFeignHystrixMian80 { public static void main(String[] args) { SpringApplication.run(ConsumerFeignHystrixMian80.class,args); } }
③ 业务类上添加fullback
@RestController @Slf4j public class OrderController { @Autowired 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(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"; } }
④ 运行结果,访问服务消费侧,调用超过1.5秒就会进行服务降级
http://localhost/consumer/payment/hystrix/timeout/1
4)目前存在的问题?#
①、如果每个方法都存在一个兜底的方法时,会造成代码的膨胀
②、业务逻辑的方法和处理异常的fullback方法掺杂在一块
5)解决问题
① 解决代码膨胀的问题
使用注解 @DefaultProperties(defaultFallback = ""),设置默认的全局兜底方法
@RestController @Slf4j @DefaultProperties(defaultFallback = "payment_Global_FallbackMethod") public class OrderController { @Autowired 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 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"; } // 下面是全局fallback方法 public String payment_Global_FallbackMethod() { return "Global异常处理信息,请稍后再试,/(ㄒoㄒ)/~~"; } }
访问 http://localhost/consumer/payment/hystrix/timeout/1
出现如下情况,全局fullback方法生效
② 解决业务逻辑和fullback逻辑混在一起
只需要为Feign客户端定义的接口添加一个服务降级的处理类即可实现解耦
feign接口
@Component @FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentHystrixServiceFullbackImpl.class) public interface PaymentHystrixService { @GetMapping("/payment/hystrix/ok/{id}") public String paymentInfo_ok(@PathVariable("id") Integer id); @GetMapping("/payment/hystrix/timeout/{id}") public String paymentInfo_timeout(@PathVariable("id") Integer id); }
服务降级的处理类:
@Service public class PaymentHystrixServiceFullbackImpl implements PaymentHystrixService{ @Override public String paymentInfo_ok(Integer id) { return "==========PaymentHystrixServiceFullbackImpl:paymentInfo_ok==========,o(╥﹏╥)o"; } @Override public String paymentInfo_timeout(Integer id) { return "==========PaymentHystrixServiceFullbackImpl:paymentInfo_timeout==========,o(╥﹏╥)o"; } }
启动eureka和order80 ,但是不启动payment,访问 http://localhost//consumer/payment/hystrix/ok/1 (注意ok方法上并没有加 @histrix),说明 feign的fullback起作用了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?