• Feign使用Hystrix


    Feign使用Hystrix开发步骤

    1、导入依赖spring-cloud-starter-hystrix

    2、消费启动类开启@EnableCircuitBreaker

    3、配置yml文件feign.hystrix.enabled=true

    4、实现FeignClient接口或FallbackFactory接口
    4.1、实现FeignClient接口
    4.2、实现FallbackFactory接口

    5、@FeignClient注解配置fallback参数

     

    1、导入依赖spring-cloud-starter-hystrix

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>

     

    2、消费启动类开启@EnableCircuitBreaker

    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    @EnableHystrix //开启Hystrix支持
    public class RibbonConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(RibbonConsumerApplication.class, args);
        }
        
    }

     

    3、配置yml文件feign.hystrix.enabled=true

    server:
      port: 8808
    feign: 
      hystrix:
        #开启feign的hystrix支持,默认是false 
        enabled: true

     

    4、实现FeignClient接口或FallbackFactory接口
    4.1、实现FeignClient接口
    TestClient1.java

    //fallback 指定一个回退类,这个类必须实现@FeignClient声明的接口,并且在spring context中
    @FeignClient(value="cloud-producer",
        configuration=FeignClientsConfiguration.class,
        fallback=TestClient1FallBack.class)
    public interface TestClient1 {
        
            @GetMapping(value = "/get/{id}")
            public String get(@PathVariable("id") String id);
    
            @RequestMapping(value = "/getuser/{id}")
            public User getUser(@PathVariable("id") String id);
            
            @RequestMapping(value = "/getuser2", method = RequestMethod.GET)
            public User getUser2(User user);
    
            @RequestMapping(value = "/postuser")
            public User postUser(@RequestBody User user);
    
            @RequestMapping(value = "/postuser")
            public User postUser2(User user);
    
            @RequestMapping(value = "/postuser", method = RequestMethod.GET)
            public User postUser3(User user);
    
            @GetMapping(value = "/listAll")
            List<User> listAll();
        
    }


    TestClient1FallBack.java

    @Component
    public class TestClient1FallBack implements TestClient1 {
        @Override
        public String get(String id) {
            return "feign hystrix fallback for get method";
        }
    
        @Override
        public User getUser(String id) {
            User errorUser = new User();
            errorUser.setId("getUser.errorId");
            errorUser.setName("getUser.errorName");
            return errorUser;
        }
    
        @Override
        public User getUser2(User user) {
            User errorUser = new User();
            errorUser.setId("getUser2.errorId");
            errorUser.setName("getUser2.errorName");
            return errorUser;
        }
    
        @Override
        public User postUser(User user) {
            User errorUser = new User();
            errorUser.setId("postUser.errorId");
            errorUser.setName("postUser.errorName");
            return errorUser;
        }
    
        @Override
        public User postUser2(User user) {
            User errorUser = new User();
            errorUser.setId("postUser2.errorId");
            errorUser.setName("postUser2.errorName");
            return errorUser;
        }
    
        @Override
        public User postUser3(User user) {
            User errorUser = new User();
            errorUser.setId("postUser3.errorId");
            errorUser.setName("postUser3.errorName");
            return errorUser;
        }
    
        @Override
        public List<User> listAll() {
            User errorUser = new User();
            errorUser.setId("listAll.errorId");
            errorUser.setName("listAll.errorName");
            ArrayList<User> list = new ArrayList<User>();
            list.add(errorUser);
            return list;
        }
    }


    Test1Controller.java

    @RestController
    public class Test1Controller {
        
        @Autowired
        private TestClient1 testClient1;
        
        @GetMapping("/feign1/get/{id}")
        public String get(@PathVariable String id) {
            String result = testClient1.get(id);
            return result;
        }
        
        @GetMapping("/feign1/getuser/{id}")
        public User getUser(@PathVariable String id) {
            User result = testClient1.getUser(id);
            return result;
        }
        
        @GetMapping("/feign1/getuser2")
        public User getUser2(User user) {
            User result = testClient1.getUser2(new User());
            return result;
        }
        
        @GetMapping("/feign1/listAll")
        public List<User> listAll() {
            return testClient1.listAll();
        }
        
        @PostMapping("/feign1/postuser")
        public User postUser(@RequestBody User user) {
            User result = testClient1.postUser(user);
            return result;
        }
        
        @PostMapping("/feign1/postuser2")
        public User postUser2(@RequestBody User user) {
            User result = testClient1.postUser2(user);
            return result;
        }
        
        @PostMapping("/feign1/postuser3")
        public User postUser3(@RequestBody User user) {
            User result = testClient1.postUser3(user);
            return result;
        }
        
    }

     

    4.2、实现FallbackFactory接口
    TestClient3.java

    //fallbackFactory 指定一个fallback工厂,与指定fallback不同, 此工厂可以用来获取到触发断路器的异常信息,TestClientFallbackFactory需要实现FallbackFactory类
    @FeignClient(value="mima-cloud-producer",configuration=FeignClientsConfiguration.class,fallbackFactory=TestClien3tFallbackFactory.class)
    public interface TestClient3 {
        
        @RequestMapping(value="/get/{id}",method=RequestMethod.GET)
        public String get(@PathVariable("id") String id);
        
        @RequestMapping(value = "/getuser/{id}")
        public User getUser(@PathVariable("id") String id);
        
    }


    TestClien3tFallbackFactory.java——优点是可以获取到异常信息

    //FallbackFactory的优点是可以获取到异常信息
    @Component
    public class TestClien3tFallbackFactory implements FallbackFactory<TestClient3> {
    
        @Override
        public TestClient3 create(Throwable cause) {
            return new TestClient3() {
                @Override
                public String get(String id) {
                    return "get trigger hystrix open! reason:"+cause.getMessage();
                }
    
                @Override
                public User getUser(String id) {
                    User errorUser = new User();
                    errorUser.setId("getUser.errorId");
                    errorUser.setName("getUser.errorName");
                    return errorUser;
                }
            };
        }
        
    }


    Test3Controller.java

    @RestController
    public class Test3Controller {
        
        @Autowired
        private TestClient3 testClient3;
        
        @GetMapping("/feign3/get/{id}")
        public String get(@PathVariable String id) {
            String result = testClient3.get(id);
            return result;
        }
        
        @GetMapping("/feign3/getuser/{id}")
        public User getuser(@PathVariable String id) {
            User result = testClient3.getUser(id);
            return result;
        }
        
    }

     

    5、@FeignClient注解配置fallback参数

  • 相关阅读:
    JLOI2012:时间流逝
    bzoj 5217: [Lydsy2017省队十连测]航海舰队
    bzoj 4894: 天赋
    bzoj 4870: [Shoi2017]组合数问题
    bzoj 1558: [JSOI2009]等差数列
    bzoj 4945: [Noi2017]游戏
    bzoj 2142: 礼物
    bzoj 5248: [2018多省省队联测]一双木棋
    51nod2383
    codeforces24D
  • 原文地址:https://www.cnblogs.com/linjiqin/p/10195442.html
Copyright © 2020-2023  润新知