Spring Cloud Turbine(集群监控)

简介:

Turbine是聚合服务器发送事件流数据的一个工具,Hystrix的监控中,只能监控单个节点,实际生产中都为集群,因此可以通过Turbine来监控集群下Hystrix的metrics情况
Turbine的github地址:https://github.com/Netflix/Turbine

使用场景

在复杂的分布式系统中,相同服务的结点经常需要部署上百甚至上千个,很多时候,运维人员希望能够把相同服务的节点状态以一个整体集群的形式展现出来,这样可以更好的把握整个系统的状态。 为此,Netflix又提供了一个开源项目Turbine来提供把多个
hystrix.stream的内容聚合为一个数据源供Dashboard展示。

Turbine使用了Netflix的另一个开源项目Archaius来做配置文件的管理,其提供了非常强大的配置文件管理策略
Archaius的https://github.com/Netflix/archaius

集成Spring Cloud Turbine

引入相关依赖,Turbine能够汇集监控信息,并将聚合后的信息提供给Hystrix Dashboard来集中展示和监控,Eureka用来注册服务。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

在主类上加@EnableTurbine注解,开启Turbine,添加@EnableHystrixDashboard注解开启Hystrix仪表盘,@EnableEurekaClient注册服务

@SpringBootApplication
@EnableTurbine
@EnableHystrixDashboard
@EnableEurekaClient
public class SpringcloudTurbineApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudTurbineApplication.class, args);
    }
}

修改yml配置文件
turbine.aggregator.cluster-config: 指定聚合哪些集群,多个使用","分割,默认为default
turbine.app-config: 配置监控服务的列表,表明监控哪些服务多个使用","分割
turbine.cluster-name-expression: 用于指定集群名称,当服务数量非常多的时候,可以启动多个Turbine服务来构建不同的聚合集群,而该参数可以用来区分这些不同的聚合集群,同时该参数值可以再Hystrix仪表盘中用来定位不同的聚合集群,
只需在Hystrix Stream的URL中通过cluster参数来指定

clusterNameExpression: metadata['cluster']时,假设想要监控的应用配置了eureka.instance.metadata-map.cluster: ABC,则需要配置,同时turbine.aggregator.clusterConfig: ABC
turbine.combine-host-port参数设置为true,可以让同一主机上的服务通过主机名与端口号的组合来进行区分,默认情况下会以host来区分不同的服务,这会使得在本机调试的时候,本机上的不同服务聚合成一个服务来统计。

spring:
  application:
    name: springcloud-turbine
server:
  port: 9900
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9090/eureka
turbine:
  combine-host-port: true
  app-config: eureka-consumer-ribbon,eureka-consumer-ribbon2
  cluster-name-expression: metadata['cluster']
  aggregator:
    cluster-config: ribbon
  instanceUrlSuffix: /hystrix.stream

下面进行集群

这里需要改下springcloud-consumer-ribbon的配置文件

spring:
  application:
    name: eureka-consumer-ribbon
server:
  port: 9999
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9090/eureka
  instance:
    metadata-map:
     cluster: ribbon

然后再复制一个springcloud-consumer-ribbon并命名为springcloud-consumer-ribbon2,这里两个ribbon只是端口号和服务名不一样,其他都一样
只需要改配置文件

spring:
  application:
    name: eureka-consumer-ribbon2
server:
  port: 9988
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9090/eureka
  instance:
      metadata-map:
       cluster: ribbon

eureka.instance.metadata-map.cluster用于集群,集群名为ribbon,正好对应Turbine配置文件的集群名
此时的架构图

image.png

Eureka服务端 端口号是9090
两个Eureka客户端 端口号分别是8081和8082 相同的服务名springcloud-eureka-client
Ribbon消费者客户端 端口号是9999 服务名eureka-consumer-ribbon
Ribbon消费者客户端 端口号是9988 服务名eureka-consumer-ribbon2
Turbine客户端 端口号9900 服务名springcloud-turbine

启动服务进行测试

先启动服务端再启动客户端,客户端启动顺序没要求
访问http://localhost:9090服务注册中心

image.png

下面我们看下监控流,访问http://localhost:9900/turbine.stream?cluster=ribbon
地址格式:IP:Turbine端口号/turbine.stream?cluster=集群名

image.png

可以看到很多.ping

下面我们进入Hystrix Dashboard来集中展示和监控http://localhost:9900/turbine.stream?cluster=ribbon
访问http://localhost:9900/hystrix,输入监控流URL

image.png

此时控制台可能就报了一个异常

com.netflix.turbine.monitor.instance.InstanceMonitor$MisconfiguredHostException: [{"timestamp":"2018-08-07T03:36:31.487+0000","status":404,"error":"Not Found","message":"No message available","path":"/actuator/hystrix.stream"}]
    at com.netflix.turbine.monitor.instance.InstanceMonitor.init(InstanceMonitor.java:318) ~[turbine-core-1.0.0.jar:na]
    at com.netflix.turbine.monitor.instance.InstanceMonitor.access$100(InstanceMonitor.java:103) ~[turbine-core-1.0.0.jar:na]
    at com.netflix.turbine.monitor.instance.InstanceMonitor$2.call(InstanceMonitor.java:235) [turbine-core-1.0.0.jar:na]
    at com.netflix.turbine.monitor.instance.InstanceMonitor$2.call(InstanceMonitor.java:229) [turbine-core-1.0.0.jar:na]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_131]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]

turbine在收集的时候由于访问的是/hystrix.stream,而此时收集端点却是/actuator/hystrix.stream,所以报了404错误。

原因

收集端点是在源码中默认定义好的,在Turbine源码中的org.springframework.cloud.netflix.turbine.SpringClusterMonitor类中

private final DynamicStringProperty defaultUrlClosureConfig = DynamicPropertyFactory.
getInstance().getStringProperty("turbine.instanceUrlSuffix", "actuator/hystrix.stream");

解决方法

我们需要在Turbine的配置文件中加上turbine.instanceUrlSuffix=/hystrix.stream,修改Turbine的收集端点

重新启动下Turbine服务,重复以上的步骤
在访问监控流的时候会发现输出了一大段的数据,其实在访问Hystrix监控流也会这样(要访问/hystrix.stream接口,得先访问工程中的任意一个其他接口,否则如果直接访问/hystrix.stream接口的话,会打印出一连串的ping: ping)

image.png

下面登录进Hystrix Dashboard,此时显示loading,下面访问http://localhost:9988/consumerhttp://localhost:9999/consumer

image.png

由于是集群,所以主机数显示为2,这个与之前的单服务监控是不一样的
image.png

如果其中一个集群服务挂掉了,监控有有所显示

各种指标的相关说明

image.png
上一篇:Go语言学习笔记(八)golang 操作 Redis & Mysql & RabbitMQ


下一篇:Spring Cloud Feign(声明式/模板化的HTTP客户端)