Spring Cloud构建微服务架构:Hystrix监控数据聚合【Dalston版】
上一篇我们介绍了使用Hystrix Dashboard来展示Hystrix用于熔断的各项度量指标。通过Hystrix Dashboard,我们可以方便的查看服务实例的综合情况,比如:服务调用次数、服务调用延迟等。但是仅通过Hystrix Dashboard我们只能实现对服务当个实例的数据展现,在生产环境我们的服务是肯定需要做高可用的,那么对于多实例的情况,我们就需要将这些度量指标数据进行聚合。下面,在本篇中,我们就来介绍一下另外一个工具:Turbine。
准备工作
在开始使用Turbine之前,我们先回顾一下上一篇中实现的架构,如下图所示:
其中,我们构建的内容包括:
- eureka-server:服务注册中心
- eureka-client:服务提供者
- eureka-consumer-ribbon-hystrix:使用ribbon和hystrix实现的服务消费者
- hystrix-dashboard:用于展示
eureka-consumer-ribbon-hystrix
服务的Hystrix数据
动手试一试
下面,我们将在上述架构基础上,引入Turbine来对服务的Hystrix数据进行聚合展示。这里我们将分别介绍两种聚合方式。
通过HTTP收集聚合
具体实现步骤如下:
- 创建一个标准的Spring Boot工程,命名为:turbine。
- 编辑pom.xml,具体依赖内容如下:
<parent> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Dalston.SR1</version> <relativePath /> <!-- lookup parent from repository --></parent><dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-turbine</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency></dependencies> |
- 创建应用主类
TurbineApplication
,并使用@EnableTurbine
注解开启Turbine。
@Configuration@EnableAutoConfiguration@EnableTurbine@EnableDiscoveryClientpublic class TurbineApplication { public static void main(String[] args) { SpringApplication.run(TurbineApplication.class, args); } } |
- 在
application.properties
加入eureka和turbine的相关配置,具体如下:
spring.application.name=turbine server.port=8989management.port=8990 eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ turbine.app-config=eureka-consumer-ribbon-hystrixturbine.cluster-name-expression="default"turbine.combine-host-port=true |
参数说明
turbine.app-config
参数指定了需要收集监控信息的服务名;turbine.cluster-name-expression
参数指定了集群名称为default,当我们服务数量非常多的时候,可以启动多个Turbine服务来构建不同的聚合集群,而该参数可以用来区分这些不同的聚合集群,同时该参数值可以在Hystrix仪表盘中用来定位不同的聚合集群,只需要在Hystrix Stream的URL中通过cluster
参数来指定;turbine.combine-host-port
参数设置为true
,可以让同一主机上的服务通过主机名与端口号的组合来进行区分,默认情况下会以host来区分不同的服务,这会使得在本地调试的时候,本机上的不同服务聚合成一个服务来统计。
在完成了上面的内容构建之后,我们来体验一下Turbine对集群的监控能力。分别启动eureka-server
、eureka-client
、eureka-consumer-ribbon-hystrix
、turbine
以及hystrix-dashboard。访问Hystrix Dashboard,并开启对
http://localhost:8989/turbine.stream`的监控,这时候,我们将看到针对服务`eureka-consumer-ribbon-hystrix`的聚合监控数据。
而此时的架构如下图所示:
通过消息代理收集聚合
Spring Cloud在封装Turbine的时候,还实现了基于消息代理的收集实现。所以,我们可以将所有需要收集的监控信息都输出到消息代理中,然后Turbine服务再从消息代理中异步的获取这些监控信息,最后将这些监控信息聚合并输出到Hystrix Dashboard中。通过引入消息代理,我们的Turbine和Hystrix Dashoard实现的监控架构可以改成如下图所示的结构:
从图中我们可以看到,这里多了一个重要元素:RabbitMQ。对于RabbitMQ的安装与基本时候我们可以查看之前的《Spring Boot中使用RabbitMQ》一文,这里不做过多的说明。下面,我们可以来构建一个新的应用来实现基于消息代理的Turbine聚合服务,具体步骤如下:
- 创建一个标准的Spring Boot工程,命名为:
turbine-amqp
。 - 编辑
pom.xml
,具体依赖内容如下:
<parent> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Dalston.SR1</version> <relativePath /> <!-- lookup parent from repository --></parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-turbine-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency></dependencies> |
可以看到这里主要引入了spring-cloud-starter-turbine-amqp
依赖,它实际上就是包装了spring-cloud-starter-turbine-stream
和pring-cloud-starter-stream-rabbit
。
注意:这里我们需要使用Java 8来运行
- 在应用主类中使用
@EnableTurbineStream
注解来启用Turbine Stream的配置。
@Configuration@EnableAutoConfiguration@EnableTurbineStream@EnableDiscoveryClientpublic class TurbineApplication { public static void main(String[] args) { SpringApplication.run(TurbineApplication.class, args); } } |
- 配置
application.properties
文件:
spring.application.name=turbine-amqp server.port=8989management.port=8990 eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ |
对于Turbine的配置已经完成了,下面我们需要对服务消费者eureka-consumer-ribbon-hystrix
做一些修改,使其监控信息能够输出到RabbitMQ上。这个修改也非常简单,只需要在pom.xml
中增加对spring-cloud-netflix-hystrix-amqp
依赖,具体如下:
<dependencies> ... <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-hystrix-amqp</artifactId> </dependency></dependencies> |
在完成了上面的配置之后,我们可以继续之前的所有项目(除turbine以外),并通过Hystrix Dashboard开启对http://localhost:8989/turbine.stream
的监控,我们可以获得如之前实现的同样效果,只是这里我们的监控信息收集时是通过了消息代理异步实现的。
更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。
代码示例
样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。
- 码云:点击查看
- GitHub:点击查看
相关阅读
- Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)
- Spring Cloud构建微服务架构:服务消费者(基础)
- Spring Cloud构建微服务架构:服务消费者(Ribbon)
- Spring Cloud构建微服务架构:服务消费者(Feign)
- Spring Cloud构建微服务架构:分布式配置中心
- Spring Cloud构建微服务架构:服务容错保护(hystrix服务降级)
- Spring Cloud构建微服务架构:服务容错保护(hystrix依赖隔离)
- Spring Cloud构建微服务架构:服务容错保护(hystrix断路器)
- Spring Cloud构建微服务架构:Hystrix监控面板
- Spring Cloud构建微服务架构:Hystrix监控数据聚合
- 更多Spring Cloud内容…
Spring Cloud构建微服务架构:Hystrix监控数据聚合【Dalston版】相关推荐
- Spring Cloud构建微服务架构-Hystrix监控面板
在Spring Cloud中构建一个Hystrix Dashboard非常简单,只需要下面四步:愿意了解源码的朋友直接求求交流分享技术 一零三八七七四六二六 创建一个标准的Spring Boot工程, ...
- Spring Cloud构建微服务架构-Hystrix断路器
断路器 断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时," ...
- Spring Cloud构建微服务架构-Hystrix依赖隔离
依赖隔离 "舱壁模式"对于熟悉Docker的读者一定不陌生,Docker通过"舱壁模式"实现进程的隔离,使得容器与容器之间不会互相影响.而Hystrix则使用该 ...
- Spring Cloud构建微服务架构:Hystrix监控面板【Dalston版】
在上一篇<服务容错保护(hystrix断路器)>的介绍中,我们提到断路器是根据一段时间窗内的请求情况来判断并操作断路器的打开和关闭状态的.而这些请求情况的指标信息都是HystrixComm ...
- Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)
断路器 断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时," ...
- Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】
前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服 ...
- Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)【Dalston版】
前言 在上一篇<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>中,我们已经体验了如何使用@HystrixCommand来为一个依赖资源定义服务降级逻辑.实 ...
- Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)【Dalston版】
前言 在前两篇<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>和<Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)&g ...
- Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】 1
前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服 ...
最新文章
- Solaris 上swap -s的解释
- Vivado中TCL的使用
- [原]编程融入生活---设计模式总结
- re2c编译选项的说明
- Linux学习笔记04
- Android 实现切换主题皮肤功能(类似于众多app中的 夜间模式,主题包等)
- 删除含有关键词的文件_AweEraser——macOS Catalina最佳的文件粉碎机
- Linux Ubuntu jdk(环境变量)配置
- .net source code download
- 数据算法之折半查找(binSearch)的Java实现
- 1027. 打印沙漏(20)-PAT乙级真题
- linux下启动Oracle服务和监听程序
- Javascript基础知识笔记三
- 共享单车为什么这么重?
- atitit 商业项目常用模块技术知识点 v3 qc29
- UE TurnInPlace 转身动画的解决方案和常见问题
- windows下,Kiwi_Syslog日志服务器的搭建
- windows10如何修改pin码?
- java中文件路径的两种写法说明:左斜杠(/)和右斜杠(\)
- 2016教师节微信祝福语大全
热门文章
- Java中正数与负数操作、的区别
- A5营销:传统企业站优化正文内容在SEO方面的三大注意事项
- 学习,一定是脱“贫”致富的捷径
- MDK530编译出现ARM版本不符问题
- mysql查询没有权限试图_MySQL迁移后提示查询view权限不足的处理
- matlab fftshift_数字信号处理没有Matlab?用Python一样很爽
- jsp人事管理系统_Jsp+Ssm+Mysql实现的医院人事管理系统源码附带视频运行教程
- cocoscreator editbox 只允许数字_用Cocos做一个数字调节框
- 办公室分配方案python_Python自动化办公室(1),python,一
- LeetCode 1786. 从第一个节点出发到最后一个节点的受限路径数(迪杰斯特拉 + 拓扑排序)