我们在之前讲过,在单个的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
这里新建模块microservice-springcloud-turbine。单纯的使用turbine是很简单的。
1.引入turbine和Eureka的依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eurekaartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-netflix-turbineartifactId>
dependency>
2.配置turbine
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配置参数:
3.在启动类增加@EnableTurbine
@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是否输出了类似下面的数据:
: 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个。
参考:http://www.voidcc.com/content/spring-boot-hystrix-stream-404。
Feign是对Hystrix支持的,所以不用增加Hystrix的依赖。但是,如果要使用dashboard则需要引入hystrix的依赖。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-hystrixartifactId>
dependency>
并且在Application类中增加如下代码
@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的应用后,可以通过http://ip:port/turbine.stream来查看Turbine收集监控数据。turbine的作用是聚合各个/hystrix.stream的监控数据,在单个的hystrix.stream都正常后,turbine.stream收集的上报的hosts的数量却一直是0.
: ping
: ping
data: {"reportingHostsLast10Seconds":0(这里一直是0),"name":"meta","type":"meta","timestamp":1530627942212}
Turbine需要注册Eureka。
所以需要引入Eureka的依赖,并配置eureka.client.url。
1.引入依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eurekaartifactId>
dependency>
2.配置eureka.client.url
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的地址即可看到监控数据。
microservice-springcloud-movie-feign-without-hystrix服务依赖user服务,user服务已经启动了,但访问microservice-springcloud-movie-feign-without-hystrix的/user/1时仍然返回的fallback的处理结果。
这是因为我的FeignClient中configuration使用了默认的Contract。
@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/