springcloud系列20——Turbine聚合各个节点的hystrix.stream

前言

我们在之前讲过,在单个的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的依赖

<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配置参数:

  • 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

@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个。

问题

hystrix.stream 404 问题

参考: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.stream的reportingHostsLast10Seconds为0

启动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的地址即可看到监控数据。

使用RequestLine一直触发的fallback

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/

你可能感兴趣的:(Spring,Cloud,SpringCloud入门)