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

@EnableDiscoveryClient

public class TurbineApplication{

	public static void main(String[] args) {

		SpringApplication.run(TurbineApplication.class, args);

	}

}
  • application.properties加入eureka和turbine的相关配置,具体如下:
spring.application.name=turbine

server.port=8989

management.port=8990

eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

turbine.app-config=RIBBON-CONSUMER,RIBBON-CONSUMER-2

turbine.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

@EnableDiscoveryClient

public class TurbineApplication{

	public static void main(String[] args) {

		SpringApplication.run(TurbineApplication.class, args);

	}

}
  • 配置application.properties文件:
spring.application.name=turbine-amqp

server.port=8989

management.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的监控,我们可以获得如之前实现的同样效果,只是这里我们的监控信息收集时是通过了消息代理异步实现的。

原文发布于微信公众号 - 程序猿DD(didispace)

原文发表时间:2017-07-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

Neo4j 2.0 生产环境集群搭建

一、在windows上搭建Neo4j ha cluster的配置方法: 例如:建立集群的三台机器的ip分别为:10.230.9.91,10.230.9.92,1...

5954
来自专栏向治洪

使用Jenkins搭建Android自动打包环境

概述 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:持续的软件版本发布/测试项目;监控外部调用执行的工作。 对于我们...

41110
来自专栏JackieZheng

Spring Boot系列——如何集成Log4j2

上篇《Spring Boot系列——日志配置》介绍了Spring Boot如何进行日志配置,日志系统用的是Spring Boot默认的LogBack。

1452
来自专栏微信公众号:Java团长

SpringMVC与Struts2的区别与比较总结

1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟...

1013
来自专栏AndroidTv

读书笔记--Android Gradle权威指南(上)前言笔记

1604
来自专栏别先生

Oozie如何和安装部署

1、Oozie的简单介绍: 1、Oozie是一个工作流引擎服务器,用于运行hadoop map/reduce和hive等任务工作流,同时Oozie还是一个Jav...

6439
来自专栏冷冷

SpringMVC 文件下载时 浏览器不能正确显示另存的文件名

问题:通过打印输出流的方式把文件下载到本地,但是在firebox 中 下载的文件不显示文件的文件名,造成文件不能直接打开,其他浏览器可以直接打开. 原因: 主要...

2095
来自专栏龙首琴剑庐

Spring Boot 开发应用热部署

spring-boot-devtools 实现热部署 想在Spring Boot中使用该功能非常简单,添加依赖: <!-- 热部署模块 --> <depende...

2806
来自专栏玩转JavaEE

Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享

小伙伴们好久不见!最近略忙,博客写的有点少,嗯,要加把劲。OK,今天给大家带来一个JavaWeb中常用的架构搭建,即Nginx+Tomcat搭建服务集群,然后通...

4306
来自专栏xingoo, 一个梦想做发明家的程序员

Spring MVC那点事儿

自问自答 1 Spring MVC的启动原理? spring mvc是基于ioc容器的,因此需要先创建IOC容器,才能创建对应的spring mvc执行环境。 ...

1927

扫码关注云+社区

领取腾讯云代金券