🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## **1. 分布式微服务架构面临的问题** 在微服务架构中,根据业务来拆分成一个个的服务,而**服务与服务之间存在着依赖关系**(比如用户调商品,商品调库存,库存调订单等等),在Spring Cloud中多个微服务之间可以用 RestTemplate+Ribbon 和 Feign 来调用 ![](https://img.kancloud.cn/fa/96/fa96850078423095e72b853ee76f2d01_664x540.png) 1. 在服务之间调用的链路上由于网络原因、资源繁忙或者自身的原因,服务并不能保证100%可用 2. **如果单个服务出现问题,调用这个服务就会出现线程阻塞,** 导致响应时间过长或不可用,此时若有大量的请求涌入,容器的线程资源会被消耗完毕,**导致服务瘫痪**。 3. **服务与服务之间的依赖性,故障会传播**,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的 **“雪崩”效应** 。 为了解决这个问题,业界提出了熔断器模型。 ## 2. Hystrix 作用 Hystrix 是Netflix公司开源项目( https://github.com/Netflix/Hystrix),实现了熔断器模型,Spring Cloud 对这一 组件进行了整合。 * 服务熔断 * 服务监控 ### 2.1 什么是服务熔断 1. 熔断机制**是应对雪崩效应的一种微服务链路保护机制。** 在微服务架构中,一个请求需要调用多个服务是非常常见的,如下图: ![](https://img.kancloud.cn/b1/2c/b12c7b328dfe48ca474777836558a0d5_477x303.png) 2. 当服务之间调用的链路上某个微服务不可用或者响应时间太长时,会导致连锁故障。**当失败的调用到一定阈值(缺省是5秒内20次调用失败) 就会启动熔断机制。** 3. 在 SpringCloud 框架里熔断机制通过Hystrix实现,Hystrix会监控微 服间调用的状况。熔断机制的注解是 @HystrixCommand ![](https://img.kancloud.cn/79/13/7913d2bc3c6c4debbfb36475938fd7f4_631x420.png) * **熔断器打开后,可用避免连锁故障,fallback方法可以直接返回一个固定值。这样其他调用者就不用等待(阻塞),不至于拖垮整个系统!** ### **2.2 服务端熔断** **1. 服务提供端引入熔断相关依赖** ``` <!-- 导入hystrix依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> ``` **2. 修改 ProductController** 出现异常后如何处理? 使用` @HystrixCommand` 注解 ,一旦调用服务方法失败并抛出了错误信息后,会自动调用 @HystrixCommand 注解中 fallbackMethod 属性指定的当前类中的方法 ![](https://img.kancloud.cn/df/25/df25e620e4b284e9cada037f87cb246d_824x530.png) * 如果不报错(返回null),也不超时就不会调用fallback方法 **3. 修改启动类,开启Hystrix** @EnableHystrix //开启Hystrix的熔断机制 ~~~ @EnableHystrix //开启Hystrix的熔断机制 @EnableEurekaClient @MapperScan("com.tuna.springcloud.server.mapper") @SpringBootApplication public class ProductProvider_8001 { public static void main(String[] args) { SpringApplication.run(ProductProvider_8001.class, args); } } ~~~ ![](https://img.kancloud.cn/17/43/174376cd483cfeb513b218a23900bccc_866x491.png) 没有异常时 ![](https://img.kancloud.cn/7d/97/7d971d6f42cf2b73eb039e4bbd55ef7e_505x104.png) 当id=7,发生异常时 ![](https://img.kancloud.cn/71/ae/71aece776d6e655a6839b38366679a34_836x127.png) ### **2.3 Feign 客户端服务熔断** **1. 修改yml,开启Feign自带的熔断** Feign 是自带断路器的,也就是针对**消费者(客户端)**进行服务熔断,需要在配置文件中开启它,在配置文件加以下代码 ``` feign: hystrix: enabled: true # 开启服务熔断器 ``` **2. 指定熔断处理类** Service 接口上的 @FeignClient 注解中,加上 fallback 指定熔断处理类即可: ProductClientServiceFallBack.class ~~~ @FeignClient(value = "microservice-product", fallback = ProductClientServiceFallBack.class) ~~~ ~~~ //@FeignClient(value = "microservice-product") //指定调用的微服务名称 // fallback 作用,指定熔断处理类,如果被调用的方法处理异常,就会交给熔断处理类中的方法进行处理 @FeignClient(value = "microservice-product", fallback = ProductClientServiceFallBack.class) //指定调用的微服务名称 public interface ProductClientService { @RequestMapping(value = "/product/add", method = RequestMethod.POST) boolean add(@RequestBody Product product); @RequestMapping(value = "/product/get/{id}", method = RequestMethod.GET) Product get(@PathVariable("id") Long id); @RequestMapping(value = "/product/list", method = RequestMethod.GET) List<Product> list(); } ~~~ **3. 创建熔断处理类** 需要继承对应的service ~~~ @Component //一定要加上它,将它纳入到容器中 public class ProductClientServiceFallBack implements ProductClientService{ @Override public boolean add(Product product) { return false; } @Override public Product get(Long id) { return new Product(id, "id=" + id + "无数据--@feignclient&hystrix", "无有效数据库"); } @Override public List<Product> list() { return null; } } ~~~ **4. 测试** [http://localhost/consumer/product/get/6](http://localhost/consumer/product/get/6) ![](https://img.kancloud.cn/d6/0e/d60e2308c0be7c4fa52397b0cd8e1d5f_494x140.png) 当关闭服务提供端 ![](https://img.kancloud.cn/7f/22/7f226e40875046f4468844f679b652d9_609x192.png) ### **2.4 Hystrix Dashboard监控平台搭建** #### **2.4.1 创建 Hystrix Dashboard模块** ![](https://img.kancloud.cn/f4/4a/f44af44e278ec68b966f6a15367c0064_286x262.png) **2.4.1.1 修改pom加入 Hystrix Dashboard启动器** ~~~ <!--导入 hystrix 与 hystrix-dashboard 依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> ~~~ **2.4.1.2 配置application.yml文件** ~~~ server: port: 9001 ~~~ **2.4.1..3 创建启动类 ** 创建一个启动类 HystrixDashboard_9001,添加 @EnableHystrixDashboard 注解开启服务监控 ~~~ @EnableHystrixDashboard //开启服务监控 @SpringBootApplication public class HystrixDashboard_9001 { public static void main(String[] args) { SpringApplication.run(HystrixDashboard_9001.class, args); } } ~~~ **2.4.1.4 启动微服务** 访问[http://localhost:9001/hystrix](http://localhost:9001/hystrix) ![](https://img.kancloud.cn/97/47/97478552c0dd2b48441cb4f05db65cf5_1056x607.png) #### 2.4.2 服务端搭建 在需要监控的服务 pom.xml 中的 dependencies 节点中新增 spring\-boot\-starter\-actuator 监控依赖, 以开启监控相关的端点,并确保已经引入断路器的依赖 spring\-cloud\-starter\-netflix\-hystrix **1. 服务端pom加入熔断监控依赖** ``` <!--hystrix监控依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` **2. 在需要监控的服务 application.yml 配制中添加暴露端点** 在服务提供者 microservice-cloud-server 的application.yml配置文件添加如下配置: ~~~ # hystrix 在被监控服务上添加暴露端点 management: endpoints: web: exposure: include: hystrix.stream ~~~ **3. 启动服务提供者、Eureka、hystrix服务测试** 1\. 启动监控服务: microservice-cloud-hystrix-dashboard-9001 2\. 启动2个Eureka 3\. 启动 microservice-cloud-08-provider-product-8001 先访问:http://localhost:8001/product/get/1 ![](https://img.kancloud.cn/c0/50/c050e49c06f1ea136565dae7d7daccae_533x113.png) 再访问:http://localhost:8001/actuator/hystrix.stream 看效果 ![](https://img.kancloud.cn/53/3a/533a8f6b82c7e7187ba4ce67693dd3a6_1177x672.png) 每隔2秒进行ping获取json格式数据(9001 监控 8001),但是阅读性不好,如果数据可以图形化显示效 果就更完美 **4. Hystrix Dashboard** ![](https://img.kancloud.cn/ed/5d/ed5d126cab5e7abedcb2ee6fcb9d8113_1170x649.png) 第一个输入框填写监控地址: http://localhost:8001/actuator/hystrix.stream Delay:控制服务器上轮询监控信息的延迟时间,默认为2000毫秒,可以通过配置该属性来降低客 户端的网络和CPU消耗。 Title:可以通过配置该信息来展示更合适的标题,默认会使用具体监控实例的URL **监控结果** ![](https://img.kancloud.cn/07/9c/079c35608eca741880055b8fb13c06a1_1035x458.png) 如果没有请求会一直显示 “Loading…” 这时访问一下 http://localhost:8001/product/get/1,可以看到出现了上图的效果: **如何查看监控页面 ** 7色 :右上角 1圈 实心圆:共有两种含义。 它通过颜色的变化代表了实例的健康程度,它的健康度从绿色<黄色<橙色<红色递减。 该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越 大。所以通过该实心圆的展示,就可以在大量的实例中快速的发现故障实例和高压力实例。 1线 曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势。