- 推荐序一
- 推荐序二
- 推荐序三
- 推荐语
- 前言
- 第1章 基础知识
- 第2章 微服务构建:Spring Boot
- 第3章 服务治理:Spring Cloud Eureka
- 第4章 客户端负载均衡:Spring Cloud Ribbon
- 第5章 服务容错保护:Spring Cloud Hystrix
- 第6章 声明式服务调用:Spring Cloud Feign
- 第7章 API网关服务:Spring Cloud Zuul
- 第8章 分布式配置中心:Spring Cloud Config
- 第9章 消息总线:Spring Cloud Bus
- 第10章 消息驱动的微服务:Spring Cloud Stream
- 附录 A Starter POMs
- 后记
Turbine集群监控
在上一节介绍Hystrix Dashboard的首页时,我们提到过除了可以开启单个实例的监控页面之外,还有一个监控端点/turbine.stream是对集群使用的。从端点的命名中,可猜测到这里我们将引入Turbine,通过它来汇集监控信息,并将聚合后的信息提供给Hystrix Dashboard来集中展示和监控。
构建监控聚合服务
下面我们将在上一节内容的基础上做一些扩展,通过引入 Turbine 来聚合RIBBON-CONSUMER服务的监控信息,并输出给Hystrix Dashboard来进行展示,最后完成如下图所示的结构。
具体实现步骤如下:
- 创建一个标准的Spring Boot工程,命名为turbine。
- 编辑pom.xml,具体依赖内容如下所示。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Brixton.SR5</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。
@EnableTurbine
@EnableDiscoveryClient
@SpringBootApplication
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:1111/eureka/
turbine.app-config=RIBBON-CONSUMER
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-server、HELLO-SERVICE、RIBBON-CONSUMER、Turbine 以及 Hystrix Dashboard。访问 Hystrix Dashboard,并开启对http://localhost:8989/turbine.stream的监控,我们可以看到如下页面:
从图中可以看到,虽然我们如之前的架构那样启动了两个RIBBON-CONSUMER,但是在监控页面中依然只是展示了一个监控图。不过仔细的读者可能已经发现,图中集群报告区域中的 Hosts 属性与之前尝试单机监控时已经有所不同。由此我们可以知道RIBBON-CONSUMER启动了两个实例,这里只展现了一个监控图,是由于这两个实例是同一个服务,而对于集群来说我们关注的是服务集群的高可用性,所以Turbine会将相同服务作为整体来看待,并汇总成一个监控图。
也可以为RIBBON-CONSUMER 设置一个新的 spring.application.name,比如ribbon-consumer-2,并启动它,此时我们就有两个服务会将监控信息输出给 Turbine汇总了。刷新之前的监控页面,可以看到如下有两个监控图的页面:
与消息代理结合
Spring Cloud在封装Turbine的时候,还封装了基于消息代理的收集实现。所以,我们可以将所有需要收集的监控信息都输出到消息代理中,然后Turbine服务再从消息代理中异步获取这些监控信息,最后将这些监控信息聚合并输出到Hystrix Dashboard中。通过引入消息代理,我们的Turbine和Hystrix Dashboard实现的监控架构可以改成如下图所示的结构。
从图中可以看到,这里多了一个重要元素RabbitMQ。对于RabbitMQ的安装我们可以查看第9章的相关内容,这里不做过多说明。下面,我们来构建一个新的应用以实现基于消息代理的Turbine聚合服务,具体步骤如下所示。
- 创建一个标准的Spring Boot工程,命名为turbine-amqp。
- 编辑pom.xml,具体依赖内容如下所示:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Brixton.SR5</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-starterstream-rabbit。
注意:这里我们需要使用Java 8来运行。
- 在应用主类中使用@EnableTurbineStream注解来启用Turbine Stream的配置。
@EnableTurbineStream
@EnableDiscoveryClient
@SpringBootApplication
public class TurbineApplication {
public static void main(String[]args){
SpringApplication.run(TurbineApplication.class,args);
}
}
- 配置application.properties文件。
spring.application.name=turbine
server.port=8989
management.port=8990
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
对于Turbine的配置已经完成了,下面需要对服务消费者RIBBON-CONSUMER做一些修改,使其监控信息能够输出到RabbitMQ上。这个修改也非常简单,只需在pom.xml中增加对spring-cloud-netflix-hystrix-amqp的依赖,具体如下:
<dependencies>
...
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix-amqp</artifactId>
</dependency>
</dependencies>
在完成了上面的配置之后,继续启动 eureka-server、HELLO-SERVICE、RIBBON-CONSUMER、Turbine以及Hystrix Dashboard,同时确保RabbitMQ已在正常运行。访问Hystrix Dashboard,并开启对http://localhost:8989/turbine.stream的监控,我们可以获得如之前实现的同样结果,只是这里的监控信息收集是通过消息代理异步实现的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论