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
引入相关依赖,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配置文件的集群名
此时的架构图
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服务注册中心
下面我们看下监控流,访问http://localhost:9900/turbine.stream?cluster=ribbon
地址格式:IP:Turbine端口号/turbine.stream?cluster=集群名
下面我们进入Hystrix Dashboard来集中展示和监控http://localhost:9900/turbine.stream?cluster=ribbon
访问http://localhost:9900/hystrix,输入监控流URL
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
)
下面登录进Hystrix Dashboard
,此时显示loading
,下面访问http://localhost:9988/consumer和http://localhost:9999/consumer