https://blog.csdn.net/goldenfish1919/article/details/132752595

微服务系统中为了防止服务雪崩问题,服务之间相互调用的时候一般需要开启熔断与降级,下面就来看下feign如何集成hystrix来做熔断与降级。

依赖

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--高版本才需要单独引入-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  <version>2.2.10.RELEASE</version>
</dependency>

需要说明的是,低版本的feign默认已经依赖了hystrix,不需要添加额外的依赖,但是高版本的feign默认并没有依赖hystrix,因此需要额外导入hystrix的依赖。

https://i-blog.csdnimg.cn/blog_migrate/5ba8890958a8d8b87b62c004db75bfba.png

降级

所谓的降级就是在服务之间相互调用的时候,如果提供者抛出了异常,消费者并不会同步的也抛出异常,而是给客户端返回一个降级以后的结果,我们可以给FeignClient添加fallbackFactory来指定降级以后的处理逻辑。

1)让feign开启降级

feign:
  hystrix:
    enabled: true

2)给FeingClient添加fallbackFactory

比如我们有一个UserClient:

@FeignClient(value = "userservice",
        url = "<http://localhost:8081>"
        ,fallbackFactory = UserFallbackFactory.class,
        configuration = FeignConfig.class
        )
public interface UserClient {
    @GetMapping("/user/{id}")
    public User queryById(@PathVariable("id") Long id);
}

3)实现UserFallbackFactory自定义降级逻辑

public class UserFallbackFactory implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable cause) {

        return new UserClient(){
            @Override
            public User queryById(Long id) {
                return new User(0L, "fallback user", "fallback address");
            }
        };
    }
}

4)UserFallbackFactory配置到FeignConfig中

UserClient会引用这个配置,从而找到UserFallbackFactory这个bean。

public class FeignConfig {
    @Bean
    public UserFallbackFactory userFallbackFactory(){
        return new UserFallbackFactory();
    }
}

测试一下