一 前言
springcloud 系列文章已经出到 hystrix, 中间知识追寻者跑去学了其它知识, 回来感觉 spingcloud 系列出的也不少了; 需要完全理解这篇文章对于初学者需要有一定的基础知识, 如果看不懂请移步知识追寻者的 springcloud 专栏进行学习; 学完本篇, 你将获得学会使用 Hstrix 进行服务容错, 学会 Hystrix 熔断监控; 能学完本篇内容请留下赞呦!!!!
二 Hystrix 入门
首先需要搭建工程 hystrix-client 引入 eureka 和 hystrix 依赖
2.1pom.xml
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
- </dependency>
- </dependencies>
- 2.2 service
在 service 层定义一个获得用户的方法 getUser() 用于提供服务, 方法内容对用户名进行判断, 如果是 zszxz, 返回回用户说明, 否则抛出异常; 定义默认用户方法 defaultUser() 用于容错处理, 在获得用户方法上面添加注释 @HystrixCommand 并且将容错回调指向 defaultUser() 方法; 有关注释详细使用请读者参考如下官方文档;
Hystrix@HystrixCommand 配置
- /**
- * @Author lsc
- * <p> </p>
- */
- @Component
- public class UserService {
- // 为 getUser 方法添加容错回调处理
- @HystrixCommand(fallbackMethod = "defaultUser")
- public String getUser(String params){
- if (params.equals("zszxz")){
- return "the user is zszxz";
- }else {
- // 抛出异常时会直接调用 fallbackMethod 中指定的方法
- throw new RuntimeException();
- }
- }
- /* *
- * @Author lsc
- * <p> 出错回调处理 </p>
- * @Param [params]
- * @Return java.lang.String
- */
- public String defaultUser(String params){
- return "it is the user thar is not exist in project";
- }
- }
- 2.3 controller
表现层直接调用服务层方法, 参数为用户名 username
- /**
- * @Author lsc
- * <p> </p>
- */
- @RestController
- public class UserController {
- @Autowired
- UserService userService;
- @GetMapping("user")
- public String getUser(String username){
- return userService.getUser(username);
- }
- }
2.4application.YAML
配置文件中指定端口 8094 , 并且指定应用名称为 hystrix-client , 后面是向 eureka-server 进行服务注册;
- server:
- port: 8094
- spring:
- application:
- name: hystrix-client # 应用名称
- eureka:
- client:
- service-url:
- # 服务注册地址
- defaultZone: http://peer1:10081/eureka/,http://peer2:10082/eureka/,http://peer3:10083/eureka/
2.5 Hsytrix 启动类
在启动类上添加注释 @EnableHystrix , 表示启用 hystrix 功能;
- /**
- * @Author lsc
- * <p> </p>
- */
- @SpringBootApplication
- @EnableHystrix // 启用 hystrix
- @EnableDiscoveryClient// 服务注册发现
- public class HystrixApp {
- public static void main(String[] args) {
- SpringApplication.run(HystrixApp.class, args);
- }
- }
2.6 执行结果
启动 eureka-server, eureka-client, hystrix-client 工程; 访问地址 http://localhost:8094/user?user=zszxz; 得出正确访问结果如下;
修改用户名参数不是 zszxz 发现报的不是异常, 而是 defualtuser 中默认的容错处理, 说明使用 hystrix 成功;
三 Hstrix 集成 Feign
学会了简单使用 hystrix, 但远远不够, 通常 Feign 中自带了 hystrix 功能, 这边需要使用 Feign 进行开启 hystrix, 然后进行容错处理;
3.1 eureka-client
在之前的 eureka-client 表现层中添加一个 getFH() 方法用于 Feign 客户端调用;
- /* *
- * @Author lsc
- * <p> feign-hystix 集成测试 </p>
- * @Param [username]
- * @Return java.lang.String
- */
- @GetMapping("zszxz/fh")
- public String getFH(String username){
- if (username.equals("zszxz")){
- return "the user is zszxz on fh project";
- }else {
- throw new RuntimeException();
- }
- }
3.2 pom.xml
新建工程 feign-hystrix 用于集成测试, 依赖引入 openfeign 即可;
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-openfeign</artifactId>
- </dependency>
- </dependencies>
- 3.3service
service 层使用 FeignClient 进行远程过程调用, 并且指定 回调类, 其内容在 3.4 节
- /**
- * @Author lsc
- * <p> </p>
- */
- @FeignClient( name = "eureka-client", value = "eureka-client", fallback = FHServiceFallback.class)
- public interface FHService {
- @GetMapping("zszxz/fh")
- public String getFeign(String username);
- }
- 3.4 fallback
回调函数实现 FHService 接口, 并且在类上添加注解 @Component 表示会被 spirng IO 容器扫描注入;
- /**
- * @Author lsc
- * <p> </p>
- */
- @Component
- public class FHServiceFallback implements FHService {
- @Override
- public String getFeign(String username) {
- return "sorry feilure,you can try it again";
- }
- }
- 3.5controller
controller 层直接可以调用 service 层接口;
- /**
- * @Author lsc
- * <p> feign 表现层 </p>
- */
- @RestController
- public class FHController {
- @Autowired
- FHService fhService;
- @GetMapping("zszxz/feign")
- public String getFeign(String username){
- // 调用 getFeign 方法
- return fhService.getFeign(username);
- }
- }
3.6 application.YAML
配置文件中指定端口, 应用名称, 关键是要开启 feign 自带的 hystix 功能
- server:
- port: 8095
- spring:
- application:
- name: hystrix-feign # 应用名称
- eureka:
- client:
- service-url:
- # 服务注册地址
- defaultZone: http://peer1:10081/eureka/,http://peer2:10082/eureka/,http://peer3:10083/eureka/
- # 开启 hystix
- feign:
- hystrix:
- enabled: true
3.7FH 启动类
启动类中使用注解 @EnableFeignClients 开启 Feign 功能;
- /**
- * @Author lsc
- * <p> </p>
- */
- @SpringBootApplication
- @EnableFeignClients
- public class FeignHystrixApp {
- public static void main(String[] args) {
- SpringApplication.run(FeignHystrixApp.class,args);
- }
- }
3.8 执行结果
正常访问结果正确, 结果如下
输入用户名非 zszxz, 进行容错处理友好提示如下, 说明 feign 集成使用 hystix 成功;
四 Hystrix Dashbord 监控熔断器
学会使用 hystix 还是皮毛中的皮毛, 我们还需要对 hystrix 进行容错监控;
4.1 feign-hystrix 工程添加内容
在 feign-hystrix 工程中添加 actuator , hystrix 依赖;
pom.xml
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
- </dependency>
appication.YAML 配置文件中指定暴露端点;
- management:
- endpoints:
- web:
- exposure:
- include: hystrix.stream
启动类中添加 @EnableHystrix 注解表示开启 Hystrix
- /**
- * @Author lsc
- * <p> </p>
- */
- @SpringBootApplication
- @EnableFeignClients
- @EnableHystrix
- public class FeignHystrixApp {
- public static void main(String[] args) {
- SpringApplication.run(FeignHystrixApp.class,args);
- }
- }
- 4.2 hystrix-dashboard
新建工程 hystrix-dashboard 用于专门的容错监控; 引入依赖如下;
pom.xml
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
- </dependency>
- </dependencies>
application.YAML 指定当前应用名称和端口;
- server:
- port: 8096
- spring:
- application:
- name: hystrix-dashboard # 应用名称
- eureka:
- client:
- service-url:
- # 服务注册地址
- defaultZone: http://peer1:10081/eureka/,http://peer2:10082/eureka/,http://peer3:10083/eureka/
启动类上表名注解 @EnableHystrixDashboard 表示启动容错监控;
- /**
- * @Author lsc
- * <p> </p>
- */
- @SpringBootApplication
- @EnableDiscoveryClient
- @EnableHystrixDashboard// 开启监控
- public class HystixDashboard {
- public static void main(String[] args) {
- SpringApplication.run(HystixDashboard.class,args);
- }
- }
访问 http://localhost:8096/hystrix 出现一头豪猪图页面表示初步配置成功;
页面中的输入 url 有如下三种:
集群应用: http://turbine-hostname:port/turbine.stream
单个集群应用: http://turbine-hostname:port/turbine.stream?cluster=[clusterName]
单体应用: http://hystrix-App:port/actuator/hystrix.stream
在页面输入地址 http://localhost:8095/actuator/hystrix.stream 访问单体应用, 页面会处于 loading 状态
当我们访问 http://localhost:8095/zszxz/feign 会出现仪表盘, 其具体的监控指标内容意义请读者参考官方文档, 不再详细说明.
五 turbine 聚合监控
在第四节中读者已经学会如何使用 hystix dashboard 进行容错监控; 但是缺点也很明显, 那就是一个单体应用需要开启一个 dashboard 页面; 如果使用 turbine 进行集成管理, 那么所有 hystix 应用都会显示在一个 dashboard 上, 方便我们查阅, 排查;
5.1 hystrix-feign2
新建 hystrix-feign2 工程; 修改配置文件端口为 8098, 应用名称为 hystrix-feign2, 其它内容跟 hystrix-feign 工程一样;
5.2 turbine-monitor
新建 turbine-monitor 工程, 添加新依赖 turbine
pom.xml
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</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-hystrix-dashboard</artifactId>
- </dependency>
- </dependencies>
application.xml 中内容如下 指定了监控的 hystrix 应用是 hystrix-feign 和 hystrix-feign , 并且采用默认名称方式;
- server:
- port: 8097
- spring:
- application:
- name: turbine-monitor # 应用名称
- eureka:
- client:
- service-url:
- # 服务注册地址
- defaultZone: http://peer1:10081/eureka/,http://peer2:10082/eureka/,http://peer3:10083/eureka/
- turbine:
- appConfig: hystrix-feign,hystrix-feign2
- clusterNameExpression: "'default'"
启动类中添加新的注解 @EnableTurbine 表示开启 turbine 功能;
- /**
- * @Author lsc
- * <p> </p>
- */
- @SpringBootApplication
- @EnableDiscoveryClient
- @EnableTurbine
- @EnableHystrixDashboard
- public class TurbineApp {
- public static void main(String[] args) {
- SpringApplication.run(TurbineApp.class, args);
- }
- }
5.3 启动工程
访问 http://localhost:8097/hystrix 出现 hystrix 界面
在界面中输入 http://localhost:8097/turbine.stream 访问进入 loding 状态
访问 http://localhost:8095/zszxz/feign 得出'sorry feilure,you can try it again'
访问 http://localhost:8098/zszxz/feign 得出'sorry feilure,you can try it again'
最后得出结果如下, 发现两个应用的 hystrix 都集中在一个页面上;
5.4 源码
关于源码请移步专栏说明即可获得知识追寻者 springcloud 全部学习内容;
来源: https://www.cnblogs.com/zszxz/p/12203225.html