美文网首页微服务架构和实践
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