服务容错 Spring Cloud Hystrix [3]
About 3 min
使用Hystrix仪表盘我们可以通过图形界面的形式,看到我们的应用运行状态
Hystrix仪表盘
Spring Cloud 整合了Hystrix Dashboard. 主要用来实时监控Hystrix的各项指标信息. 通过Hystrix Dashboard反馈的实时信息. 我们可以发现系统中存在的问题, 从而及时采取对应措施.
1 步骤
1.1 创建SpringBoot工程
1.2 配置pom
主要添加Hystrix Hystrix-Dashboard actuator
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
1.3 为应用主类添加@EnableHystrixDashboard. 启用HystrixDashboard功能.
1.4 配置yml 或者 properties
要使用一个未被占用的端口
1.5 访问验证
http://ip:port/hystrix
从页面上我们可以看到,HystrixDashboard支持三种不同的监控方式:
- 默认的集群监控
- 指定的集群监控
- 单体应用的监控
Hystrix Dashboard监控单实例节点需要通过访问实例的/hystrix.stream接口来实现, 我们自然要为服务实例添加这个端点.
- 在服务实例pom.xml中增加actuator监控模块以开启监控相关的端点. 并引入断路器的依赖spring-cloud-starter-hystrix
<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>
服务实例主类使用@EnableCircuitBreaker注解, 开启断路器功能.
监控界面
实心圆:
颜色: 绿黄橙红.健康度依次递减
大小: 表示请求流量, 流量越大实心圆越大
以上只是对某一个应用进行监控,当监控多个应用时需要使用turbine进行集群监控
2 Turbine集群监控
Hystrix Dashboard中的/turbine.stream是对集群使用的. 使用方法如下:
- 步骤同上,首先创建一个springboot工程, pom中引入turbine和actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-boot-starter-turbine</artifactId>
</dependency>
- 之后,在应用主类中应用@EnableTurbine注解开启Turbine
- 最后配置properties
spring:
application:
name: turbine
server:
port: 9002
manage:
port: 9102
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka
turbine:
#该属性指定需要收集监控信息的服务名
app-config: bookservice
#指定集群名称, 当服务增加时可以使用集群来划分不同的应用集合
cluster-name-expression: 'NikolaZhang'
#true表示同一主机的服务通过主机名和端口名的组合进行区分, 默认情况使用主机名进行区分, 但这会将主机上的多个服务聚合成一个服务.
combine-host-port: true
3 与消息代理结合
Spring Cloud在封装Turbine的时候, 还封装了基于消息代理的收集实现. 我们可以将所有需要收集的监控信息输出到消息代理中, 然后turbine服务再从消息代理中异步获取这些监控信息. 最后将这些监控信息聚合并输出到Hystrix Dashboard中.
实现步骤如下:
- 首先创建springboot工程, 引入turbine-amqp和actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-boot-starter-turbine-amqp</artifactId>
</dependency>
- 应用主类要使用@EnableTurbineStream注解
- 配置properties
spring:
application:
name: turbine
server:
port: 9002
manage:
port: 9102
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka
- 最后,对服务进行配置, 使监控信息能够输出到RabbitMQ
只需要向pom中添加如下pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-boot-starter-netflix-hystrix-amqp</artifactId>
</dependency>
- 验证输入http://localhost:9000/turbine.stream. 效果同上, 但是这里的监控信息是通过消息代理异步获取之后输出到Hystrix Dashboard中的.
end
到此为止,服务容错已经介绍完毕,这周末我会把之前的程序测试一下,然后再水一篇博客。