feign+hystrix 进行服务降级

时间:2019-07-11
本文章向大家介绍feign+hystrix 进行服务降级,主要包括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);


}

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

$flag 上一页 下一页