写在前面
该文参考来自 程序猿DD 的Spring Cloud 微服务实战一书,该文是作为阅读了 spring cloud hystrix 一章的读书笔记。书中版本比较老,我选择了最新稳定版的 spring cloud Greenwich.SR2 版本,该版本较书中版本有些变动。非常感谢作者提供了这么好的学习思路,谢谢!文章也参考了 Spring-cloud-netflix 的官方文档。
学习微服务最好使用容器来搭建,对于正在学习编程的小伙伴推荐买上属于自己的一台服务器,用来练练手,也顺带学习 Docker,这很重要。最近,阿里在搞活动,新用户 1C2G 只要 98 一年,我也比较了很多,还是比较划算的,我自己也入手了,可以点进来看看,对了,最便宜的一款在 【全部必抢爆款】 里面: 阿里云服务器,助力云上云!
Hystrix
收集了关于每个 HystrixCommand
的一组指标。Hystrix
仪表盘以有效方式显示每个断路器的健康状况。
1. 如何构建 Hystrix 仪表盘
创建项目:hystrix-dashboard
引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
运行 Hystrix 仪表盘,在 启动类上添加 @EnableHystrixDashboard
注解,然后访问 /hystrix ,可以看到如下的界面:
Delay 代表服务器轮询监控信息的延迟时间,默认为2000毫秒;title 代表后面进入监控界面时的标题名,默认会使用我们填写的 URL。
然后将仪表盘指向 hystrix 客户端单个实例的 /hystrix.stream 端点。
通过页面的文字内容可以知道,Hystrix Dashboard 共支持三种不同的监控方式,如下所示:
- 默认的集群监控:通过 URL https://turbine-hostname:port/turbine.stream 开启,实现对默认集群的监控。
- 指定的集群监控:通过 URL https://turbine-hostname:port/turbine.stream?cluster=[clusterName] 开启,实现对 clusterName 集群的监控。
- 单体应用的监控:通过 URL https://hystrix-app:port/actuator/hystrix.stream 开启,实现对具体某个服务实例的监控。
前两者需要整合 Turbine 才能实现对集群的监控。这部分在后续介绍。
你会发现,上诉指定的 URL 使用的是 https ,但实际上使用 http 也行,对于使用 https 官方文档有如下建议:“ 服务器使用的证书必须得到 JVM 的信任。如果证书不受信任,则必须将证书导入 JVM ,以便 Hystrix 仪表盘能够成功连接到流端点。
使用之前创建的 eureka-service-consumer
服务,也就是一个普通的 hystrix 项目。但需要注意的是 application.yml 文件需要配置 hystrix.stream
端点对外暴露:
management:
endpoints:
web:
exposure:
include: hystrix.stream
在 hystrix 仪表盘中填入地址, 点击 Monitor Stream
按钮。首次进入,发现面板处于 Loading… 状态,这是只要访问 hystrix 客户端,触发 HystrixCommand
命令即可。这样我们就可以得到下面的界面:
helloCommandKey 代表 HystrixCommand
的 commandKey
。上图中还有实心圆,流量越大,实心圆越大,你可以通过不断刷新对有着 HystrixCommand
命令的接口访问,观察其变化。曲线代表了时间范围内流量的相对变化,通过它能够观察到流量的上升和下降趋势。其余的数值可以通过将鼠标移动上去,阅读其说明即可。
2. Turbine 集群监控
查看单个实例的 Hystrix 数据对于系统的整体健康状况不是很有用。Turbine 在 Hystrix 仪表盘中使用 /turbine.stream
,该端点聚集了所有相关的 /hystrix.stream
端点。实例的定位通过 Eureka
。
新建项目:turbine, 对外暴露端口:8078
导入依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-turbine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
application.yml 配置文件:
spring:
application:
name: turbine
server:
port: 8078
eureka:
client:
service-url:
defaultZone: http://localhost:1112/eureka/
turbine:
aggregator:
cluster-config: FEIGN-CONSUMER, SERVICE-CONSUMER
# 使用同一主机上的服务通过主机号与端口号组合进行区分
combine-host-port: true
# 服务实例名
app-config: feign-consumer,service-consumer
这里先说明下,我启动的服务;我在同一台主机上,启动了两个不同端口的FEIGN-CONSUMER 服务,以及一个 SERVICE-CONSUMER 服务,需要注意的是 基于 feign 的服务需要设置 feign.hystrix.enabled=true
,并且引入 Hystrix 依赖,并在启动类上 添加 @EnableCircuitBreaker
注解,对外暴露端点的 management.endpoints.web.exposure.include = hystrix.stream
配置也不能少。修改为这样后, /hystrix.stream
对外暴露成功。
启动:启动类上添加 @EnableTurbine
注解
默认情况下,turbine 通过查找已经注册的eureka 中的主机名和端口来寻找
/hystrix.stream
。如果实例的元数据包含了management.port
,它将替代/hystrix.stream
的端口值。
将仪表盘指向指定的集群:
-
http://192.168.3.18:8078/turbine.stream?cluster=SERVICE-CONSUMER
访问
SERVICE-CONSUMER
服务的接口以后,可以在仪表盘上看见监控数据。 -
http://192.168.3.18:8078/turbine.stream?cluster=FEIGN-CONSUMER
分别访问两个
FEIGN-CONSUMER
服务接口,可以在仪表盘上看见监控数据,并且发现它的 hosts 为2。
spring cloud 还封装了基于消息代理的收集实现,有兴趣的话,可以自己研究下。