zoukankan      html  css  js  c++  java
  • 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:
    " + JSONObject.fromObject(user).toString());
            return user;
        }

    7.验证结果

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

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

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

     8.验证成功

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

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

    9.完

  • 相关阅读:
    关系型数据库vs非关系型数据库
    Vue使用日常记录
    【0805作业】模拟接力赛跑
    【0805作业】模拟叫号看病
    【0805作业】模拟多人爬山
    【0805作业】实现Runnable接口的方式创建线程
    【0805作业】继承Thread类创建线程,输出20次数字,“你好”,线程名
    超市会员管理系统
    【0802作业】循环注册十个账号,重启程序能正常登录
    【0802作业】复制图片
  • 原文地址:https://www.cnblogs.com/coding-one/p/12300446.html
Copyright © 2011-2022 走看看