返回 导航

SpringBoot / Cloud

hangge.com

SpringCloud - 声明式服务调用组件Feign使用详解5(Hystrix配置)

作者:hangge | 2020-08-03 08:10
    在 Spring Cloud Feign 中,除了引入了用于客户端负载均衡的 Spring Cloud Ribbon 之外,还引入了服务保护与容错的工具 Hystrix
    默认情况下,Spring Cloud Feign 会为将所有 Feign 客户端的方法都封装到 Hystrix 命令中进行服务保护(需要开启)。本文通过样例介绍如何在使用 Spring Cloud Feign 时配置 Hystrix 属性以及如何实现服务降级。

五、Hystrix 配置

1,开启 Hystrix

默认情况下 Hystrix 功能没有开启,如果需要服务降级 Fallback 等功能,需要通过如下设置开启 Hystrix 支持:
#开启Hystrix支持
feign.hystrix.enabled=true

2,禁用 Hystrix

(1)如果需要关闭 Hystrix 功能,可以通过如下方式设置:
#关闭Hystrix支持
feign.hystrix.enabled=false

(2)如果不想全局地关闭 Hystrix 支持,而只想针对某个服务客户端关闭 Hystrix 支持时,需要通过使用 @Scope("prototype") 注解为指定的客户端配置 Feign.Builder 实例,首先构建一个关闭 Hystrix 的配置类:
@Configuration
public class DisableHystrixConfiguration {

    @Bean
    @Scope("propotype")
    public Feign.Builder feignBuilder() {
        return Feign.builder();
    }
}

(3)然后在需要关闭 Hystrix 支持的客户端的 @FeignClient 注解中,通过 configuration 参数引入上面实现的配置即可:
@FeignClient(name="hello-service", configuration = DisableHystrixConfiguration.class)
public interface HelloService {

    @RequestMapping("/hello")
    String hello();
}

3,全局参数配置

直接使用 Hystrix 的默认配置前缀 hystrix.command.default 就可以进行设置全局配置:
#设置全局的超时时间为10秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000

4,指定命令参数配置

    对于 Hystrix 命令的配置,在实际应用时往往也会根据实际业务情况制定出不同的配置方案。配置方法也跟传统的 Hystrix 命令的参数配置相似,采用 hystrlx.command.<commandKey> 作为前缀。而 <commandKey> 默认情况下会采用 Feign 客户端中的方法名作为标识。
(1)假设我们定义了如下一个 Fegin 客户端,该客户端对 /hello 接口进行调用。
@FeignClient("hello-service")
public interface HelloService {
     
    @RequestMapping("/hello")
    String hello();
}

(2)如果需要对 /hello 接口的熔断超时进行配置,可以通过如下方式设置:
注意:在使用指定命令配置的时候,需要注意,由于方法名很有可能重复,这个时候相同方法名的 Hystrix 配置会共用,所以在进行方法定义与配置的时候需要做好一定的规划。当然,也可以重写 Feign.Builder 的实现,并在应用主类中创建它的实例来覆盖自动化配置的 HystrixFeign.Builder 实现。
#设置/hello接口的超时时间为10秒
hystrix.command.hello.execution.isolation.thread.timeoutInMilliseconds=10000

5,服务降级配置

    Hystrix 提供的服务降级是服务容错的重要功能,由于 Spring Cloud Feign 在定义服务客户端的时候与 Spring Cloud Ribbon 有很大差别,HystrixCommand 定义被封装了起来,我们无法像之前介绍 Spring Cloud Hystrix 时,通过 @HystrixCommand 注解的 fallback 参数那样来指定具体的服务降级处理方法。但是,Spring Cloud Feign 提供了另外一种简单的定义方式:服务降级类来实现。
(1)服务降级逻辑的实现只需要为 Feign 客户端的定义接口编写一个具体的接口实现类。比如为 HelloService 接口实现一个服务降级类 HelloServiceFallback,其中每个重写方法的实现逻辑都可以用来定义相应的服务降级逻辑:
@Component
public class HelloServiceFallback implements HelloService {
    @Override
    public String hello1(String name) {
        return "hello1 error";
    }

    @Override
    public User hello2(String name, Integer age) {
        return new User("未知", 0);
    }

    @Override
    public String hello3(User user) {
        return "hello3 error";
    }
}

(2)然后在服务绑定接口 HelloService 中,通过 @FeignClient 注解的 fallback 属性来指定对应的服务降级实现类。
@FeignClient(name="hello-service", fallback = HelloServiceFallback.class)
public interface HelloService {

    // 带有Request参数的接口
    @GetMapping("/hello1")
    String hello1(@RequestParam("name") String name);

    // 带有Header信息的接口
    @GetMapping("/hello2")
    User hello2(@RequestHeader("name") String name, @RequestHeader("age") Integer age);

    // 带有Header信息的接口
    @PostMapping("/hello3")
    String hello3(@RequestBody User user);
}

(3)下面验证一下服务降级功能。启动服务注册中心和 feign-consumer,但是不启动 hello-service 服务,当访问 http://localhost:9001/feign-consumer 触发对 HELLO-SERVICE 接口的调用,由于 hello-service 服务没有启动,会直接触发服务降级,最终会获得如下输出:
评论

全部评论(0)

回到顶部