Spring Cloud 学习——5.使用 feign 的 hystrix 支持

Posted 水煮鱼它不香吗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud 学习——5.使用 feign 的 hystrix 支持相关的知识,希望对你有一定的参考价值。

1.前言

  hystrix 是一个微服务系统的断路器组件,上文介绍了 spring cloud 通过 netfix hystrix 提供对 hystrix 的支持。同时 spring cloud 也提供了 openfeign 的支持, 而 openfeign 本身就已经内置了 hystrix 支持。所以本文介绍一个使用 openfeign 内置 hystrix 的简单示例。

  前文链接:

    Spring Cloud 学习——3.openfeign实现声明式服务调用

    Spring Cloud 学习——4.netfix hystrix 实现断路器

 

2.添加依赖

  由于使用的是 openfeign 内置的 hystrix 支持,所以添加 openfeign 依赖即可

<dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
                <version>2.x.x</version>
            </dependency>

 

3.服务提供者

@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping("/get/{id}")
    public User get(@PathVariable("id")String id){
        System.out.println("/user/get/{id},id=" + id);
        User user = new User();
        user.setId(id);
        user.setUsername("onezai");
        user.setPassword("123456");
        user.setMobile("13128921555");
        return user;
    }
}

 

4.服务调用者

@FeignClient(value = "sys", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping(value = "/sys/user/get/{id}")
    User getUserById(@PathVariable("id") String id);
}

   @FeignClient  注解声明了一个 feign 客户端,作为服务调用者。其中,fallback 属性指定了断路回退处理的类(为了保持回退处理方法的参数一致,通常建议该类实现当前服务调用接口,本例中即实现 UserClient 接口),回退类代码:

@Component
public class UserClientFallback implements UserClient {
    @Override
    public User getUserById(String id) {
        User user = new User();
        user.setId(id);
        user.setUsername("fallbackUser");
        user.setPassword("fallbackPass");
        user.setMobile("13122226666");
        return user;
    }
}

 

5.启用 feign 的 hystrix 支持

  openfeign 默认配置是关闭 hystrix 的,在 application.properties 文件中添加配置以启用:

feign.hystrix.enabled=true

 

6.服务调用

@RestController
@RequestMapping("/")
public class HomeController {
    @Autowired
    EurekaClient eurekaClient;
    @Autowired
    RestTemplate restTemplate;
    @Autowired
    UserClient userClient;

    @GetMapping("/getUser/{id}")
//    @HystrixCommand(fallbackMethod = "getUserDefault")
    public User getUser(@PathVariable("id")String id){
        User user = userClient.getUserById(id);
        System.out.println("user:\\n" + JSONObject.fromObject(user).toString());
        return user;
    }

7.验证结果

  7.1.正常情况下(未断路情况)

 

  7.2.异常情况下(断路情况)

    同样,我们注释掉  @GetMapping("/get/{id}")  ,人为地创造服务不可用条件,结果:

 

 

 

 8.验证成功

  从结果可以看出,断路回退处理成功。

  相比之下我们可以看到,使用 openfeign 内置的 hystrix 支持,可以将断路回退处理的代码单独抽离出来,避免污染调用服务的业务代码。如果单独使用 netfix hystrix,需要在业务代码类中编写一个与调用微服务方法同参的 fallback 方法然后使用  @HystrixCommand(fallbackMethod = "getUserDefault")  来指定,如果这种方法多了,那么业务代码就被污染了。

 

9.完

 

以上是关于Spring Cloud 学习——5.使用 feign 的 hystrix 支持的主要内容,如果未能解决你的问题,请参考以下文章

java学习---Spring Cloud Config分布式配置中心

Spring Cloud学习笔记-003

Spring-Boot:Spring Cloud构建微服务架构

使用 spring-boot:1.5.1 和 spring-cloud-stream 时无法启动 bean 'inputBindingLifecycle'

使用 spring boot 2.5.5 和 Spring Cloud 2.0.4 创建 pubsubInputChannel 时出错

spring cloud深入学习-----Spring Cloud Zuul网关 Filter熔断重试高可用的使用方式