码迷,mamicode.com
首页 > 编程语言 > 详细

【SpringCloud构建微服务系列】学习断路器Hystrix

时间:2018-07-20 23:35:24      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:microsoft   none   framework   map   review   代码   border   sof   最好   

一、Hystrix简介

在微服务架构中经常包括多个服务层,比如A为B提供服务,B为C和D提供服务,如果A出故障了就会导致B也不可用,最终导致C和D也不可用,这就形成了雪崩效应
所以为了应对这种情况,我们就需要一种容错机制,该机制需要实行以下两点:

  1. 为网络请求设置超时,以便尽快释放资源
  2. 使用断路器模式,就像家里的电闸一样,如果电流过大就会立刻跳闸以保护电路防止发生火灾。当请求失败率达到一定的阈值,断路器就会打开,不会再请求依赖的服务。
    Hystrix就是这样设计的,以实现容错处理。

二、通用方式整合Hystrix

  1. 复制项目microservice-consumer-movie-ribbon改为microservice-consumer-movie-ribbon-hystrix
  2. 添加所需依赖
<dependency>
   		<groupId>org.springframework.cloud</groupId>
   		<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
  1. 在启动类添加注解 @EnableHystrix 或者 @EnableCircuitBreaker以启用
  2. 修改MovieController代码,让findById方法具备容错能力
@RestController
public class MovieController {

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Autowired
    private RestTemplate restTemplate;

    private static final Logger logger = LoggerFactory.getLogger(MovieController.class);


    @HystrixCommand(fallbackMethod = "findByIdFallBack")
    @GetMapping("/user/{id}")
    public User findById(@PathVariable Long id){
        //microservice-provider-user是虚拟主机名,默认和服务名称一致
        //不能包括"_"之类的字符,否则Ribbon在调用时会报异常
        return this.restTemplate.getForObject("http://microservice-provider-user/"+id,User.class);
    }

    public User findByIdFallBack(Long id){
        User user = new User();
        user.setId(-1L);
        user.setAge(0);
        user.setBalance(BigDecimal.ZERO);
        user.setName("默认用户");
        user.setUsername("默认用户");
        return user;
    }
}

这里考虑篇幅就不细说 @HystrixCommand注解的属性配置问题了。

测试

1.分别启动服务microservice-discovery-eurekamicroservice-provider-usermicroservice-consumer-movie-ribbon-hystrix
2.游览器访问http://localhost:8010/user/1获得如下结果

{"id":1,"username":"xxx","name":"zhangsan","age":22,"balance":100}

3.关掉服务microservice-provider-user再重新请求,获得如下结果。

{"id":-1,"username":"默认用户","name":"默认用户","age":0,"balance":0}

说明服务不可用时,进入到了回退方法。
为服务引入SpringBoot Actuator,再访问/health端点可以查看断路器状态,不过我尝试失败了。

三、Feign使用Hystrix

3.1为Feign添加回退

1.复制项目microservice-consumer-movie-feign改为microservice-consumer-movie-feign-hystrix-fallback,注意pom文件spring-cloud-starter-eureka 和 spring-cloud-starter-feign 已经过时
2.Feign默认已经整合了Hystrix,所以不需要额外引入依赖。
3.将之前的UserFeignClient接口修改为如下

  1. /** 
  2. * @author ship 
  3. * @Description Feign的fallback测试 
  4. * 使用@FeignClient的fallback属性指定回退类 
  5. * @Date: 2018-07-17 13:25 
  6. */ 
  7. @FeignClient(name = "microservice-provider-user",fallback = FeignClientFallback.class) 
  8. public interface UserFeignClient
  9.  
  10. @RequestMapping(value = "/{id}",method = RequestMethod.GET) 
  11. User findById(@PathVariable("id") Long id)
  12.  
  13.  
  14. /** 
  15. * 回退类FeignClientFallback需实现Feign Client接口 
  16. */ 
  17. @Component 
  18. class FeignClientFallback implements UserFeignClient
  19. @Override 
  20. public User findById(Long id)
  21. User user = new User(); 
  22. user.setId(-1L); 
  23. user.setUsername("默认用户"); 
  24. return user; 

开始测试
1.按顺序启动服务microservice-discovery-eurekamicroservice-provider-usermicroservice-consumer-movie-feign-hystrix-fallback
2.访问http://localhost:8010/user/1可获得正常结果
3.停止microservice-provider-user后再次访问获得如下结果说明已经成功了。
{"id":-1,"username":"默认用户","name":"默认用户","age":0,"balance":0}
如果你遇到了404问题,可能是因为从Spring Cloud Dalston开始,Feign默认是不开启Hystrix的。所以需要在application.yml文件上添加如下内容。
技术分享图片
注意单词不要拼写错,我就是因为enabled写成了enable折腾了半天。。。。

3.2通过fallback factory检查回退原因

1.复制项目microservice-consumer-movie-feign改为microservice-consumer-movie-feign-hystrix-fallback-factory
2.修改UserFeignClient接口

  1. /** 
  2. * @author ship 
  3. * @Description Feign的fallback测试 
  4. * 使用@FeignClient的fallback属性指定回退类 
  5. * @Date: 2018-07-17 13:25 
  6. */ 
  7. @FeignClient(name = "microservice-provider-user",fallbackFactory = FeignClientFallbackFactory.class) 
  8. public interface UserFeignClient
  9.  
  10. @RequestMapping(value = "/{id}",method = RequestMethod.GET) 
  11. User findById(@PathVariable("id") Long id)
  12.  
  13.  
  14. /** 
  15. * 通过FallbackFactory检查回退原因 
  16. */ 
  17. @Component 
  18. class FeignClientFallbackFactory implements FallbackFactory<UserFeignClient>
  19.  
  20. private static final Logger logger = LoggerFactory.getLogger(FeignClientFallbackFactory.class); 
  21.  
  22. /** 
  23. * 还可以根据不同的异常类型返回不同的结果 
  24. * @param cause 
  25. * @return 
  26. */ 
  27. @Override 
  28. public UserFeignClient create(Throwable cause)
  29. return new UserFeignClient() { 
  30.  
  31. @Override 
  32. public User findById(Long id)
  33. //日志最好放在各个fallback方法中,而不是create方法中 
  34. //否则在引用启动时,就会打印该日志 
  35. logger.info("fallback reason was:",cause); 
  36. User user = new User(); 
  37. user.setId(-1L); 
  38. user.setUsername("默认用户"); 
  39. return user; 
  40. }; 

还可以根据不同的异常类型,返回不同的结果。
测试过程跟上面差不多,多了个查看日志的过程,在此省略。
今天要睡觉了,明天继续。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

四、Hystrix的监控

五、使用Hystrix Dashboard数据可视化

六、使用Turbine聚合监控数据

【SpringCloud构建微服务系列】学习断路器Hystrix

标签:microsoft   none   framework   map   review   代码   border   sof   最好   

原文地址:https://www.cnblogs.com/2YSP/p/9344552.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!