返回介绍

Hystrix配置

发布于 2024-08-18 11:12:34 字数 4398 浏览 0 评论 0 收藏 0

在Spring Cloud Feign中,除了引入了用于客户端负载均衡的Spring Cloud Ribbon之外,还引入了服务保护与容错的工具Hystrix。默认情况下,Spring Cloud Feign会为将所有Feign客户端的方法都封装到Hystrix命令中进行服务保护。在上一节末尾,我们介绍重试机制的配置时,也提到了关于Hystrix的超时时间配置。那么在本节中,我们就来详细介绍一下,如何在使用Spring Cloud Feign时配置Hystrix属性以及如何实现服务降级。

全局配置

对于Hystrix的全局配置同Spring Cloud Ribbon的全局配置一样,直接使用它的默认配置前缀hystrix.command.default就可以进行设置,比如设置全局的超时时间:

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000

另外,在对Hystrix进行配置之前,我们需要确认feign.hystrix.enabled参数没有被设置为false,否则该参数设置会关闭Feign客户端的Hystrix支持。而对于我们之前测试重试机制时,对于Hystrix的超时时间控制除了可以使用上面的配置来增加熔断超时时间,也可以通过 feign.hystrix.enabled=false 来关闭 Hystrix 功能,或者使用hystrix.command.default.execution.timeout.enabled=false来关闭熔断功能。

禁用Hystrix

上文我们提到了,在 Spring Cloud Feign 中,可以通过 feign.hystrix.enabled=false来关闭Hystrix功能。另外,如果不想全局地关闭Hystrix支持,而只想针对某个服务客户端关闭 Hystrix 支持时,需要通过使用@Scope("prototype")注解为指定的客户端配置Feign.Builder实例,详细实现步骤如下所示。

- 构建一个关闭Hystrix的配置类。

@Configuration

public class DisableHystrixConfiguration {

@Bean

@Scope("prototype")

public Feign.Builder feignBuilder(){

return Feign.builder();

}

}

- 在HelloService的@FeignClient注解中,通过configuration参数引入上面实现的配置。

@FeignClient(name="HELLO-SERVICE",configuration=DisableHystrixConfiguration.class)

public interface HelloService {

...

}

指定命令配置

对于Hystrix命令的配置,在实际应用时往往也会根据实际业务情况制定出不同的配置方案。配置方法也跟传统的 Hystrix 命令的参数配置相似,采用 hystrix.command.<commandKey>作为前缀。而<commandKey>默认情况下会采用Feign客户端中的方法名作为标识,所以,针对上一节介绍的尝试机制中对/hello 接口的熔断超时时间的配置可以通过其方法名作为<commandKey>来进行配置,具体如下:

hystrix.command.hello.execution.isolation.thread.timeoutInMilliseconds=5000

在使用指定命令配置的时候,需要注意,由于方法名很有可能重复,这个时候相同方法名的Hystrix配置会共用,所以在进行方法定义与配置的时候需要做好一定的规划。当然,也可以重写Feign.Builder的实现,并在应用主类中创建它的实例来覆盖自动化配置的HystrixFeign.Builder实现。

服务降级配置

Hystrix提供的服务降级是服务容错的重要功能,由于Spring Cloud Feign在定义服务客户端的时候与Spring Cloud Ribbon有很大差别,HystrixCommand定义被封装了起来,我们无法像之前介绍Spring Cloud Hystrix时,通过@HystrixCommand注解的fallback参数那样来指定具体的服务降级处理方法。但是,Spring Cloud Feign提供了另外一种简单的定义方式,下面我们在之前创建的feign-consumer工程中进行改造。

- 服务降级逻辑的实现只需要为Feign客户端的定义接口编写一个具体的接口实现类。比如为HelloService接口实现一个服务降级类HelloServiceFallback,其中每个重写方法的实现逻辑都可以用来定义相应的服务降级逻辑,具体如下:

@Component

public class HelloServiceFallback implements HelloService {

@Override

public String hello(){

return "error";

}

@Override

public String hello(@RequestParam("name")String name){

return "error";

}

@Override

public User hello(@RequestHeader("name")String name,@RequestHeader("age")

Integer age){

return new User("未知",0);

}

@Override

public String hello(@RequestBody User user){

return "error";

}

}

- 在服务绑定接口HelloService中,通过@FeignClient注解的fallback属性来指定对应的服务降级实现类。

@FeignClient(name="HELLO-SERVICE",fallback=HelloServiceFallback.class)

public interface HelloService {

@RequestMapping("/hello")

String hello();

@RequestMapping(value="/hello1",method=RequestMethod.GET)

String hello(@RequestParam("name")String name);

@RequestMapping(value="/hello2",method=RequestMethod.GET)

User hello(@RequestHeader("name")String name,@RequestHeader("age")Integer age);

@RequestMapping(value="/hello3",method=RequestMethod.POST)

String hello(@RequestBody User user);

}

测试验证

下面我们来验证一下服务降级逻辑的实现。启动服务注册中心和feign-consumer,但是不启动 hello-service 服务。发送 GET 请求到http://localhost:9001/feign-consumer2,该接口会分别调用 HelloService 中的4个绑定接口,但因为hello-service服务没有启动,会直接触发服务降级,并获得下面的输出内容:

error

error

name=未知,age=0

error

正如我们在HelloServiceFallback类中实现的内容,每一个服务接口的断路器实际就是实现类中的重写函数的实现。

注意:在Brixton.SR5版本中,fallback的实现函数中不再支持返回com.netflix.hystrix.HystrixCommand 和 rx.Observable 类型的异步执行方式和响应式执行方式。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文