上一篇我们介绍了使用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-servereureka-clienteureka-consumer-ribbon-hystrixturbine以及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-streampring-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版】相关推荐

  1. Spring Cloud构建微服务架构-Hystrix监控面板

    在Spring Cloud中构建一个Hystrix Dashboard非常简单,只需要下面四步:愿意了解源码的朋友直接求求交流分享技术 一零三八七七四六二六 创建一个标准的Spring Boot工程, ...

  2. Spring Cloud构建微服务架构-Hystrix断路器

    断路器 断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时," ...

  3. Spring Cloud构建微服务架构-Hystrix依赖隔离

    依赖隔离 "舱壁模式"对于熟悉Docker的读者一定不陌生,Docker通过"舱壁模式"实现进程的隔离,使得容器与容器之间不会互相影响.而Hystrix则使用该 ...

  4. Spring Cloud构建微服务架构:Hystrix监控面板【Dalston版】

    在上一篇<服务容错保护(hystrix断路器)>的介绍中,我们提到断路器是根据一段时间窗内的请求情况来判断并操作断路器的打开和关闭状态的.而这些请求情况的指标信息都是HystrixComm ...

  5. Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)

    断路器 断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时," ...

  6. Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】

    前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服 ...

  7. Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)【Dalston版】

    前言 在上一篇<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>中,我们已经体验了如何使用@HystrixCommand来为一个依赖资源定义服务降级逻辑.实 ...

  8. Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)【Dalston版】

    前言 在前两篇<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>和<Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)&g ...

  9. Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】 1

    前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服 ...

最新文章

  1. 好技术领导和差技术领导区别在哪里
  2. 搞科研,从好好读论文开始:沈向洋带你读论文了
  3. c语言输出参数是out,关于C语言中的输出输入流
  4. 使用idea编写代码作为生产者,Kafka接收其发来的信息【小案例】(一)
  5. Tomcat log文件
  6. JMeter Listeners - Part 2: Listeners that Aggregate Data Samples
  7. Python实现:某个用户登录后,查看自己拥有所有权限
  8. Caused by: java.lang.ClassNotFoundException: javax.persistence.NamedStoredProcedureQuery
  9. AI从业者谈发展前景:须有效解决产业规模化痛点
  10. dreamweaver php网站模板,用DreamWeaver模板工具批量制作网页
  11. PHP商城网站绑定中国银联在线支付接口
  12. 成就:优秀的管理者成就自己,卓越的管理者成就他人(读后感)
  13. 面试官常问 webpack 面试题
  14. 外国知名大学开放课程网址
  15. (P45)面向对象版表达式计算器:Storage类实现
  16. Unity 移动端简单手势控制(移动,旋转,缩放)
  17. Unicode字符编码标准
  18. 如何重新启动Windows的Explorer.exe(以及任务栏和“开始”菜单)
  19. pl sql 和if loop结构
  20. 解决:brew install xxx 时出现“No such file or directory @ rb_sysopen - ”

热门文章

  1. Google C++编程风格指南(一):背景
  2. python笔记(五) - 获取对象的引用
  3. .NET下使用DataAdapter保存数据时,如何生成command语句及使用事务
  4. 几个ubuntu16.04镜像下载地址
  5. 2022年考研结束了
  6. Linux内核LED子系统、请务必看
  7. Linux C高级编程——网络编程之TCP(3)
  8. 计算机网络课制作双绞线实验,《计算机网络》课程实验——网线制作.pdf
  9. c语言作业题五六章答案,数据结构(C语言版)第五六章习题答案
  10. php写抢票脚本,火车票抢票python代码公开揭秘!