前言

我们在之前讲过,在单个的Hystrix的应用中,我们使用/hystrix.stream可以查看监控数据,如果想以图表的形式更直观的查看监控数据,再结合dashboard就可以了。

但是,如何同时监控多个应用或集群呢?
我们需要使用springcloud提供的Turbine,它是将各个应用的/hystrix.stream进行聚合的组件。我们在dashboard中输入/turbine.stream即可查看所有监控应用的健康情况。

turbine的官方文档:http://cloud.spring.io/spring-cloud-static/Edgware.SR3/multi/multi__hystrix_timeouts_and_ribbon_clients.html#_turbine

Turbine的使用

这里新建模块microservice-springcloud-turbine。单纯的使用turbine是很简单的。

1.引入turbine和Eureka的依赖

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-turbine</artifactId>
</dependency>

2.配置turbine

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
turbine:
aggregator:
# 指定聚合哪些集群,多个使用","分割,默认为default。
cluster-config: default
# 配置监控的服务id,多个服务以逗号分隔
app-config: microservice-springcloud-movie-feign-with-hystrix,microservice-springcloud-movie-feign-without-hystrix
clusterNameExpression: new String("default")


eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka
instance:
prefer-ip-address: true
instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

turbine配置参数:

1.turbine.app-config=ribbon-consumer指定了要监控的应用名字为ribbon-consumer
2.turbine.cluster-name-expression=”default”,表示集群的名字为default
3.turbine.combine-host-port=true表示同一主机上的服务通过host和port的组合来进行区分,默认情况下是使用host来区分,这样会使本地调试有问题

3.在启动类增加@EnableTurbine

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableTurbine
public class TurbineApp
{
public static void main( String[] args )
{
SpringApplication.run(TurbineApp.class,args);
}
}

4.Dashboard的使用
在《springcloud系列16——Hystrix Health Indicator及Metrics Stream》已经说过了。

测试

a.启动Eureka Server应用;
b.启动user服务,因为要监控的应用使用它;
c.启动microservice-springcloud-movie-feign-with-hystrix,microservice-springcloud-movie-feign-without-hystrix这2个服务,其中microservice-springcloud-movie-feign-with-hystrix修改配置的端口启动2个服务;
d.启动turebine应用;
e.启动dashboard应用。

测试步骤:
1.检查microservice-springcloud-movie-feign-with-hystrix,microservice-springcloud-movie-feign-without-hystrix这2个服务的/hystrix.stream是否能够访问;

2.检查/turbine.stream是否可以访问;

3.分别访问microservice-springcloud-movie-feign-with-hystrix,microservice-springcloud-movie-feign-without-hystrix这2个服务的/user/1请求(依赖user的服务),然后看/turbine.stream是否输出了类似下面的数据:

1
2
: ping
data: {"reportingHostsLast10Seconds":3,"name":"meta","type":"meta","timestamp":1530633245374}

如上,表示10秒内上报的主机数量为3.

4./访问dashboard应用的/hystrix,输入/turbine.stream的地址。
可以看到下面的页面

参数说明:

5.将user服务关闭,频繁刷新某个服务,然后看dashboard

可以看到,显示断路器1个打开,2个关闭。因为我们只是访问了1个服务,所以其他没访问的2个服务断路器状态还是关闭的。

如果我另外一个服务也频繁访问让断路器打开,在dashboard页面就会看到2个处理打开状态。

不过有个问题,我将某个服务关闭,dashboard仍然显示的3个Hosts,但你看/turbine.stream,其实上报的hosts只有2个。

问题

hystrix.stream 404 问题

参考:http://www.voidcc.com/content/spring-boot-hystrix-stream-404

Feign是对Hystrix支持的,所以不用增加Hystrix的依赖。但是,如果要使用dashboard则需要引入hystrix的依赖。

1
2
3
4
5
<!-- 整合hystrix,其实feign中自带了hystrix,引入该依赖主要是为了使用其中的hystrix-metrics-event-stream,用于dashboard -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

并且在Application类中增加如下代码

1
2
3
4
5
6
7
8
9
@Bean
public ServletRegistrationBean getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}

这样启动后通过http://ip:port/hystrix.stream即可访问。

PS:这里springcloud使用的是1.4.2.RELEASE版本。

Turbine.stream的reportingHostsLast10Seconds为0

启动Turbine的应用后,可以通过http://ip:port/turbine.stream来查看Turbine收集监控数据。turbine的作用是聚合各个/hystrix.stream的监控数据,在单个的hystrix.stream都正常后,turbine.stream收集的上报的hosts的数量却一直是0.

1
2
3
: ping
: ping
data: {"reportingHostsLast10Seconds":0(这里一直是0),"name":"meta","type":"meta","timestamp":1530627942212}

Turbine需要注册Eureka。
所以需要引入Eureka的依赖,并配置eureka.client.url。
1.引入依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

2.配置eureka.client.url

1
2
3
4
5
6
7
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka
instance:
prefer-ip-address: true
instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

然后收集数据就正常了。在dashboard输入turbine.stream的地址即可看到监控数据。

使用RequestLine一直触发的fallback

microservice-springcloud-movie-feign-without-hystrix服务依赖user服务,user服务已经启动了,但访问microservice-springcloud-movie-feign-without-hystrix的/user/1时仍然返回的fallback的处理结果。

这是因为我的FeignClient中configuration使用了默认的Contract。

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class Configuration1 {

// @Bean
// public Contract feignContract() {
// return new feign.Contract.Default();
// }

@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}

注释掉默认的Contract即可。

集群配置可以参考:https://blog.csdn.net/luosai19910103/article/details/70820904/

turbine如何聚合设置了context-path的hystrix数据:
http://blog.didispace.com/spring-cloud-tips-4/