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

一、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-eureka,microservice-provider-user,microservice-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. @RequestMapping(value = "/{id}",method = RequestMethod.GET) 

  10. User findById(@PathVariable("id") Long id); 





  11. /** 

  12. * 回退类FeignClientFallback需实现Feign Client接口 

  13. */ 

  14. @Component 

  15. class FeignClientFallback implements UserFeignClient { 

  16. @Override 

  17. public User findById(Long id) { 

  18. User user = new User(); 

  19. user.setId(-1L); 

  20. user.setUsername("默认用户"); 

  21. return user; 





开始测试

1.按顺序启动服务microservice-discovery-eureka,microservice-provider-user,microservice-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. @RequestMapping(value = "/{id}",method = RequestMethod.GET) 

  10. User findById(@PathVariable("id") Long id); 





  11. /** 

  12. * 通过FallbackFactory检查回退原因 

  13. */ 

  14. @Component 

  15. class FeignClientFallbackFactory implements FallbackFactory<UserFeignClient>{ 


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


  17. /** 

  18. * 还可以根据不同的异常类型返回不同的结果 

  19. * @param cause 

  20. * @return 

  21. */ 

  22. @Override 

  23. public UserFeignClient create(Throwable cause) { 

  24. return new UserFeignClient() { 


  25. @Override 

  26. public User findById(Long id) { 

  27. //日志最好放在各个fallback方法中,而不是create方法中 

  28. //否则在引用启动时,就会打印该日志 

  29. logger.info("fallback reason was:",cause); 

  30. User user = new User(); 

  31. user.setId(-1L); 

  32. user.setUsername("默认用户"); 

  33. return user; 



  34. }; 





还可以根据不同的异常类型,返回不同的结果。

测试过程跟上面差不多,多了个查看日志的过程,在此省略。

今天要睡觉了,明天继续。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

四、Hystrix的监控

五、使用Hystrix Dashboard数据可视化

六、使用Turbine聚合监控数据

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

时间: 2024-07-28 15:12:07

【SpringCloud构建微服务系列】学习断路器Hystrix的相关文章

JAVA架构师之SpringBoot,SpringCloud构建微服务项目架构

springcloud微服务项目架构搭建第一天(一).项目简介1.准备工作:idea创建springboot模板 2.后台应该涉及的技术(后期可能会有删改) Spring Framework 容器SpringMVC MVC框架Apache Shiro 安全框架Spring session 分布式Session管理MyBatis ORM框架MyBatis Generator 代码生成PageHelper MyBatis物理分页插件Druid 数据库连接池FluentValidator 校验框架Th

SpringCloud构建微服务 | 服务注册与发现(一)提供Demo

Eureka介绍: Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的. SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能. Eureka包含两个组件:Eureka Server和Eureka Client. Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,

Spring Cloud构建微服务架构 服务容错保护(Hystrix断路器)【Dalston版】

前言 在前两篇<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>和<Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)>中,我们对Hystrix提供的服务降级和依赖隔离有了基本的认识.下面我们将继续说说Hystrix的另外一个重要元件:断路器. 断路器 断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生

springcloud微服务系列之服务注册与发现组件Eureka

一.Eurake的简介二.使用Eureka进行服务的注册消费1.创建一个服务注册中心2.创建服务的提供者3.创建服务的消费者总结 一.Eurake的简介 今天我们来介绍下springcloud的核心组件Eureka,Eurake是负责微服务架构中服务治理的功能,负责各个服务实例的注册与发现. Eureka包含了服务器端和客户端组件.服务器端,也被称作是服务注册中心,用于提供服务的注册与发现. 客户端组件包含服务消费者与服务生产者.在应用程序运行时,服务生产者向注册中心注册自己的服务实例,当消费者

从零开始,轻松搞定SpringCloud微服务系列

本系列博文目录 [微服务]之一:从零开始,轻松搞定SpringCloud微服务系列–开山篇(spring boot 小demo) [微服务]之二:从零开始,轻松搞定SpringCloud微服务系列–注册中心(一) [微服务]之三:从零开始,轻松搞定SpringCloud微服务-配置中心

pring Cloud构建微服务架构

SpringCloud-Learning 本项目内容为Spring Cloud教程的程序样例. 作者博客:http://blog.didispace.com Spring Cloud系列博文:http://blog.didispace.com/categories/Spring-Cloud/ Spring Cloud中文社区:http://bbs.springcloud.com.cn/ GitHub:https://github.com/dyc87112/SpringCloud-Learning

.NET Core微服务系列基础文章

今年从原来的Team里面被抽出来加入了新的Team,开始做Java微服务的开发工作,接触了Spring Boot, Spring Cloud等技术栈,对微服务这种架构有了一个感性的认识.虽然只做了两个月的开发工作,但是对微服务架构的兴趣却没有结束,又因为自己的.NET背景(虽然对.NET的生态有点恨铁不成钢),想要探索一下在.NET平台下的微服务架构的可行性,也准备一些材料作为分享的素材. 幸运的是,在.NET Core首届在线峰会上,看到了很多前辈的分享,也增强了自己要摸索和实践.NET Co

构建微服务:Spring boot

构建微服务:Spring boot 在上篇文章构建微服务:Spring boot 提高篇中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 前几篇文章地址: 构建微服务:Spring boot 入门篇 构建微服务:Spring boot 提高篇 构建微服务:Spring boot中Redis的使用 构建微服务:thymeleaf使用详解 作者:纯洁的微笑出处:http://www.ityouknow.com/

使用 Spring Cloud 和 Docker 构建微服务

该项目主要是对微服务,以及Spring Cloud系统学习的一些总结,使用gitbook写成了书. 探讨的话题主要有: 什么是微服务注册中心Eureka服务提供者服务消费者客户端负载均衡Ribbon简化的Http客户端Feign熔断器Hystrix Hystrix监控界面Hystrix DashboardHystrix集群监控工具Turbine配置中心 API Gateway使用Docker构建微服务 目前基于Spring Cloud构建微服务的必要组件已经讲解完成. 下一步是讲解Docker的