0 - 为什么需要熔断器
在分布式系统中, 各个服务相互调用相互依赖, 如果某个服务挂了, 很可能导致其他调用它的一连串服务也挂掉或者在不断等待中耗尽服务器资源, 这种现象称之为雪崩效应;
未来防止系统雪崩, 熔断机制必不可少, 就是当一个服务挂掉后, 调用它的服务能快速熔断, 不再耗费资源, 快速失败并提供回退方案;
[Hystrix] : 是 spring cloud 的熔断器组件, 提供了熔断器功能, 能够阻止联动故障, 并提供故障的解决方案, 提供系统弹性;
[Hystrix Dashboard] : 是熔断器的监控面板, 通过它, 能直观的了解熔断器的状况;
[Turbine] : 在 Dashboard 中, 我们要输入一个一个单独的服务地址进行监控和了解; 那么多服务, 一个一个输入那不是累死人, 有没有一个工具能把众多分散的微服务熔断器监控状况聚合到一起, 使得我们在一个 Dashboard 就能了解众多服务的熔断器监控状况呢, 有, 这个工具就是 Turbine; 它的作用就是聚合众多微服务的 hystrix 监控数据到一起, 使得我们只需要在一个 Dashboard 就能了解所有;
一, 使用 hystrix
1.1, 添加依赖
- <!-- 断路器 hystrix-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
- </dependency>
1.2, 配置文件中开启熔断器开关
- # 开启熔断器开关
- feign:
- hystrix:
- enabled: true
1.3, 启动类中增加 @EnableHystrix 注解和 bean
- @SpringBootApplication
- @EnableEurekaClient
- @EnableHystrix
- @EnableFeignClients
- public class application
- {
- public static void main(String[] args)
- {
- SpringApplication.run(application.class);
- @Bean
- public ServletRegistrationBean getServlet(){
- HystrixMetriCSStreamServlet streamServlet = new HystrixMetricsStreamServlet();
- ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
- registrationBean.setLoadOnStartup(1);
- registrationBean.addUrlMappings("/actuator/hystrix.stream");
- registrationBean.setName("HystrixMetricsStreamServlet");
- return registrationBean;
- }
- } }
1.4, 增加熔断器类, 实现 Feign 的接口
- package com.anson.service.feign;
- import org.springframework.stereotype.Component;
- import org.springframework.web.bind.annotation.RequestMapping;
- /**
- * @description: 熔断器类
- * @author: anson
- * @Date: 2020/1/7 11:24
- */
- @Component
- public class FUserServiceHystrix implements FUserService
- {
- @RequestMapping("/user/hello")
- @Override
- public String hello()
- {
- return "对不起, user 服务不可达, 请稍后再试!";
- }
- }
1.5, 增加熔断器配置类 FeignConfig
- package com.anson.config;
- import feign.Retryer;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import java.util.concurrent.TimeUnit;
- @Configuration
- public class FeignConfig {
- @Bean
- public Retryer feignRetryer() {
- /*
- * 参数说明:
- * 第一个 > 重试间隔为 100 毫秒
- * 第二个 > 最大重试时间为 1 秒
- * 第三个 > 最大重试次数为 5 次
- */
- return new Retryer.Default(100, TimeUnit.SECONDS.toMillis(1), 5);
- }
- }
1.6, 在 Feign 接口注解中增加 fallback, 指向熔断器类
- package com.anson.service.feign;
- import org.springframework.cloud.openfeign.FeignClient;
- import org.springframework.Web.bind.annotation.RequestMapping;
- @FeignClient(name = "user",configuration = FeignConfig.class,fallback = FUserServiceHystrix.class)
- public interface FUserService
- {
- @RequestMapping("/user/hello")
- public String hello();
- }
1.7, 运行测试
user 服务正常时:
user 服务关闭时:
--------------------------- 华丽丽的分割线 -------------------------------------------------------
二, Hystrix Dashboard 的使用
2.1, 熔断器加了, 那么我们要监控和查看 hystrix 的运行状态, 这时候 Dashboard 上场;
2.2, 添加依赖:
- <!-- dashboard -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
2.3, 启动类添加注解 @EnableHystrixDashboard
2.4, 完成, 运行测试, 打开, http://localhost:8767/hystrix
在里面填入要监控的微服务地址 +/actuator/histrix.stream, 如: http://localhost:8768/actuator/histrix.stream,title 也填入, 点击按钮就可以看到结果了: 如图:
可以看到我们加入的熔断器的运行状态
---------------------------------------------- 华丽丽的分割线 -----------------------------------------------------------------
三, Turbine 聚合监控数据
3.1, 上面 Dashboard 中, 我们输入 http://localhost:8767/actuator/histrix.stream, 它只是现实端口 8767 这个微服务实例的监控数据而已, 要看其他的, 还得重新输入, 那能不能有个工具将所有微服务的监控数据都聚合到一起, 显示到 Dashboard 中呢, 这个工具就是 Turbine
3.2, 新建一个模块, 添加相关依赖:
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
3,.3, 修改配置文件, 其中 App-config 是要监控的服务名, 多个用逗号分隔;
- server:
- port: 8768
- spring:
- application:
- name: turbine
- eureka:
- client:
- serviceUrl:
- defaultZone: http://localhost:8761/eureka/
- instance:
- prefer-ip-address: true
- turbine:
- combine-host-port: true
- App-config: order
- cluster-name-expression: new String("default")
- instanceUrlSuffix: actuator/hystrix.stream
- aggregator:
- cluster-config: default
3.4, 在启动类中添加注解 @EnableTurbine;
- package com.anson;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
- import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
- import org.springframework.cloud.netflix.turbine.EnableTurbine;
- /**
- * @description: TODO
- * @author: anson
- * @Date: 2020/1/6 14:27
- */
- @SpringBootApplication
- @EnableEurekaClient
- @EnableTurbine
- @EnableHystrixDashboard
- public class application
- {
- public static void main(String[] args)
- {
- SpringApplication.run(application.class);
- }
- }
完成, 启动运行后, 他就会将所有配置文件中添加进来的服务全部的熔断器监控数据聚合到一起了,
在任意项目的 Dashboard 面板中填入 http://turbine-hostname:port/turbine.stream 的地址样式, 就能看到所有的监控数据了
, 如 : http://localhost:8768/turbine.stream
我们只加了一个熔断器, 你可以多加几个看看效果;
好了, 熔断器 hystrix 简单讲解到着,, 更深入的后续再详聊, Git 源码后续再放出
来源: https://www.cnblogs.com/yanghj/p/12162112.html