微服务架构和实践

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

2019-09-26  本文已影响0人  Lemtasev

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


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


WX20190926-113751@2x.png

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

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

@FeignClient注解的参数:

    @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

上一篇 下一篇

猜你喜欢

热点阅读