基于Feign的服务熔断

70 阅读2分钟

上篇文章已经了解了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/…