zoukankan      html  css  js  c++  java
  • feign+hystrix 进行服务降级

    在学习cloud的时候,教程上面的例子是使用ribbon的,我觉得生产中一般肯定使用feign 的,所以百度了一下 feign使用hystrix的用法。

    了解发现,feign本身就自带了hystrix功能了,不过我用的是1.5xspringboot版本+Dalston版本的cloud,所以需要配置打开feign的hystrix功能,直接上代码

    在配置文件中增加一条配置

    feign.hystrix.enabled=true


    @RestController
    public class DcController {
    
    
        @Autowired
        EurekaClient eurekaClient;
    
    
        @GetMapping("/consumer")
        public String dc(){
            User user = new User();
            user.setName("mck1");
            user.setAge(1);
    
            return eurekaClient.dc("mck");
        }
    
    }
    
    
    @FeignClient(value = "eureka-client",fallback = FallBack.class)
    public interface EurekaClient {
    
        @GetMapping("/dc")
        public String dc(@RequestParam("user") String user);
    
    
    }
    
    @Component
    public class FallBack implements EurekaClient {
        @Override
        public String dc(String user) {
            return "服务熔断了,哈哈哈哈";
        }
    }

    经过测试,发现在关掉服务提供者的时候 ,确实进入了fallback。

    另外,在进行学习的时候,一开始启动的时候发现项目报错,百度了那个错误,增加了一个配置

    @Component
    public class FeignBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
            if (containsBeanDefinition(configurableListableBeanFactory, "feignContext", "eurekaAutoServiceRegistration")) {
                BeanDefinition bd = configurableListableBeanFactory.getBeanDefinition("feignContext");
                bd.setDependsOn("eurekaAutoServiceRegistration");
            }
        }
    
        private boolean containsBeanDefinition(ConfigurableListableBeanFactory beanFactory, String... beans) {
            return Arrays.stream(beans).allMatch(b -> beanFactory.containsBeanDefinition(b));
        }
    
    
    
    }

    就启动成功了

    那么问题来了,开启了hystrix之后,那就是强制的了, 你不想熔断都没办法,必须配置fallback,那么有的人就说不配置不行吗?当然可以,改为配置confiuration就行了 

    上代码

    @Configuration
    public class FeignDisableHystrixConfiguration {
    
        @Bean
        @Scope("prototype")
        public Feign.Builder feignBuilder(){
            return Feign.builder();
        }
    }
    @FeignClient(value = "eureka-client",configuration = FeignDisableHystrixConfiguration.class)
    public interface EurekaClient {
    
        @GetMapping("/dc")
        public String dc(@RequestParam("user") String user);
    
    
    }

    这样,就不会熔断了,该报错报错,该超时超时!

    但是我遇到了一个问题,写了这个配置类之后,即使客户端接口不配置configuration = FeignDisableHystrixConfihguration 依然不走fallback了,就像全局禁用一样,目前还没发现原因

  • 相关阅读:
    Mybatis Plus整合PageHelper分页的实现示例
    关于xlrd最新版本不支持.xlsx文件的解决办法
    mysql 错误解决大法 Specified key was too long; max key length is 767 bytes
    php连接redis
    flask通过request.path获取定义view函数的文件和行号
    使用bash内置命令complete来实现参数补全
    linux下对比两个文件夹下python文件的差异
    ssh登录后自动切换到原来的目录
    ssh &2>1 和重定向顺序问题
    wsl1(win10)中安装bochs
  • 原文地址:https://www.cnblogs.com/changeCode/p/11173309.html
Copyright © 2011-2022 走看看