美文网首页微服务架构和实践
Spring Cloud容错机制:基于FeignClient的熔

Spring Cloud容错机制:基于FeignClient的熔

作者: Lemtasev | 来源:发表于2019-09-26 14:15 被阅读0次

    紧接上一个项目。
    没看过的可以点传送门


    Feign在整合到Spring Cloud时已经自带了hystrix模块,所以不需要额外引入feign依赖。


    WX20190926-113751@2x.png

    如果没有用feign,那么熔断器依赖如下:

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

    @FeignClient注解的参数:

    • name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
    • url: url一般用于调试,可以手动指定@FeignClient调用的地址
    • decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
    • configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
    • fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
    • fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
    • path: 定义当前FeignClient的统一前缀,类似于注解到类上的@RequestMapping的功能
      修改scdemo-api项目,在ITestCloudService中新增一个用于测试熔断机制的接口:
        @GetMapping("/t_hystrix")
        Map<String, Object> testHystrix();
    

    然后将@FeignClient注解添加参数fallback = TestCloudServiceFallback.class,创建TestCloudServiceFallback实现接口ITestCloudService

    @Component
    public class TestCloudServiceFallback implements ITestCloudService {
    
        @Override
        public Map<String, Object> testFnFeign() {
            return defaultFallback();
        }
    
        @Override
        public Map<String, Object> testHystrix() {
            return defaultFallback();
        }
    
        private Map<String, Object> defaultFallback() {
            System.out.println("服务已熔断,可发送邮件通知开发人员及时排查BUG。");
            Map<String, Object> map = new HashMap<>();
            map.put("msg", "服务暂时不可用,请稍后重试!");
            return map;
        }
    }
    

    修改scdemo-privider项目,添加新接口的实现方法:

        @Override
        public Map<String, Object> testHystrix() {
            LocalTime now = LocalTime.now();
            int minute = now.getMinute();
            try {
                Thread.sleep(minute % 2 == 0 ? 0 : 10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Map<String, Object> map = new HashMap<>();
            map.put("msg", "熔断器测试接口,分钟数为单数则等待10秒。");
            return map;
        }
    

    这个接口中,我们取当前时间,如果是单数分钟,则等待10秒,模拟线程阻塞,如果是双数分钟,则不等待,模拟正常情况,以及故障恢复。
    再修改scdemo-consumer,在TestConsumerController中添加消费者测试接口:

        @GetMapping("/hy")
        public Map testHystrix() {
            Map<String, Object> map = testCloudService.testHystrix();
            return map;
        }
    

    然后scdemo-consumerapplication.yml添加配置,开启feign熔断器(因为feign熔断器默认是关闭状态)

    feign:
      hystrix:
        # feign熔断器开关
        enabled: true
    

    最后修改scdemo-consumer的启动类注解,@SpringBootApplication(scanBasePackages = "com.yq.scdemo"),目的是为了扫描到熔断器的fallback实现类。
    启动scdemo-serverscdemo-providerscdemo-consumer
    不停地调用http://localhost:8763/hy
    双数分钟时返回:

    {"msg":"熔断器测试接口,分钟数为单数则等待10秒。"}
    

    等待分钟数为单数时再访问,因为会进入模拟阻塞,所以返回:

    {"msg":"服务暂时不可用,请稍后重试!"}
    

    再等等,到双数分钟时,服务重新可用,可见Hystrix是高可用的,带自动恢复机制的。


    最后附上github地址:
    https://github.com/lemtasev/spring-cloud-demo

    相关文章

      网友评论

        本文标题:Spring Cloud容错机制:基于FeignClient的熔

        本文链接:https://www.haomeiwen.com/subject/pxiguctx.html