上篇文章已经了解了Feign和如何使用它:juejin.cn/post/712463…。
服务雪崩
下面了解一个服务调用过程中的异常情况:服务雪崩。
(1)如图,当前服务A、服务B和服务C形成调用链,当前所有服务之间都正常调用。
(2)如图,当服务A出现异常情况(服务宕机/请求超时等),无法正确或按时返回给B服务结果。
(3)如图,以此类推,导致B服务异常,然后蔓延到C服务异常。
服务雪崩就是由于上游的服务异常不可用,最终蔓延到下游的所有服务,导致所有相关下游的微服务应用不可用而系统崩溃。
服务熔断
为了解决“服务雪崩”,便需要对调用链中异常的服务作熔断。
服务熔断是啥呢?
服务熔断就是指,当服务A调用的某个服务B不可用时,上游服务A为保证自己不受影响,从而不再调用服务B,直接返回预设结果,减轻服务A和服务B的压力,直到服务B恢复。
还有一个概念是“服务降级”,服务降级又是啥的呢?
服务降级就是指,当发现系统压力过载时,可以通过关闭某个服务,或者限流某个服务来减轻服务系统压力。
有个疑问,熔断是不是也算是一种降级呢?
基于Feign的服务熔断实践
在上篇文章已经介绍过,Fiegn已经集成了Hystrix。
Hystrix是由Netfix开源的一个延迟和容错工具库,用于解决远程调用/服务或者第三方库防止级联失败提示系统的可用性和容错性。
基于上篇文章的工程来实现。
1. 先只启动消费工程(springboot-feign-consume),调用测试接口:http://localhost:10002/feign-consume/test/hello
2. 在消费工程(springboot-feign-consume),配置生产工程(springboot-feign-produce)的服务熔断。
① 修改 TestFeignClient 类,基于FallbackFactory,重写creae()方法,实现服务熔断回调。
@FeignClient(value = "springboot-feign-produce" ,fallbackFactory = TestFeignFallbackFactory.class)
public interface TestFeignClient {
@RequestMapping("/feign-produce/test/hello")
String produce(@RequestParam String name);
}
@Component
class TestFeignFallbackFactory implements FallbackFactory<TestFeignClient> {
@Override
public TestFeignClient create(Throwable throwable) {
System.out.println("调用服务失败熔断");
return new TestFeignClient(){
@Override
public String produce(String name) {
return "ERROR:FEIGN";
}
};
}
}
② 修改application.yml配置,启动Hystrix服务熔断生效。
feign:
hystrix:
enabled: true #开启服务熔断
3. 重启服务,测试接口。
Gitee:gitee.com/renxiaoshi/…