微服务设计指导-使用turbine结合nacos监控多集群hystrix

Posted TGITCIC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务设计指导-使用turbine结合nacos监控多集群hystrix相关的知识,希望对你有一定的参考价值。

首先,你要确保每一个hystrix客户端全部的设置如这一篇中所描述的跑通:微服务设计指导-hystrix的监控。且每一个hystrix的配置都是如这篇所讲的那几步保留不动。

然后开始我们使用一个组件叫turbine的东西,来集成各个集群内的hystrix端。

turbine收集hystrix的原理如下:

其于以上原理,我们一般会在一个系统里制作一个单独的Turbine的Spring Boot Application。

maven-pom.xml文件

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.sky.demo.timeout</groupId>
        <artifactId>TimeoutServiceDemo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>TurbineDemo</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
        <!-- hystrix必备 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- hystrix必备 -->
        <!-- 使用Turbine进行多个集群的hystrix dashboard的聚合,记得排掉默认用的eureka-client的包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 使用Turbine进行多个集群的hystrix dashboard的聚合,记得排掉默认用的eureka-client的包 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
 
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.ow2.asm</groupId>
                    <artifactId>asm</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
    </dependencies>
</project>

 

可以看到,它和标准的hystrix端所要依赖差不多,它也要actuator,只是它多了:

  • spring-cloud-starter-netflix-turbine这一项,由于turbine默认用的是eurka作服务自动注册与发现的,因此我们在此例中使用的是nacos,应必须把eureka给exclude掉。

application.yml文件

server:
  port: 9992
spring:
  application:
    name: TurbineDemo
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
feign:
  hystrix:
    enabled: true
hystrix:
   dashboard:
      proxy-stream-allow-list: "localhost" #hystrix dashboard用,如果不加这条hystrix启动后也会出现hystrix.dashboard.proxyStreamAllowList
turbine:
   app-config: AdvancedIndex,AdvancedIndex2
   aggregator:
     cluster-config: default
   cluster-name-expression:  new String('default')
   combine-host-port: true
management: #hystrix dashboard用,actuator暴露端口
  endpoints:
    web:
      exposure:
        include: "hystrix.stream,turbine.stream"
      cors:
        allowed-origins: "*"
        allowed-methods: "*"

可以看到,大体上差不多,但是有几项,需要高度注意,这是网上的那些错误的例子所不具备的知识:

  • turbine.app-config,这后面是一个以逗号分隔的需要被并且可以在服务注册中心里的hystrix端的spring.aplication.name;
  • turbine.aggregator.cluster-config,你可以保持为default,该功能是用来聚合多个“服务群”的即指定聚合哪些集群,多个使用","分割,默认为default;
  • turbine.aggregator.cluster-name-expression后的值特别的有意思,如果是在eureka里还真不会碰到问题如果你打一个“default“,但是在nacos里,你必须写成new String('default'),否则直接会报错,这是让turbine保持在服务自动注册发现的“domain namespace”去搜索那些hystrix用的;
  • combine-host-port开成true,可以让同一主机上的服务通过主机名与端口号的组合来进行区分,默认情况下会以host来区分不同的服务,这会使得在本机调试的时候,本机上的不同服务聚合成一个服务来统计;

制作一个spring boot的启动类把turbine启动起来

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.netflix.turbine.EnableTurbine;
 
@EnableTurbine
@SpringBootApplication
@EnableHystrixDashboard
public class TurbineDemo 
 
    public static void main(String[] args) 
        SpringApplication.run(TurbineDemo.class);
 
    
 

这边一定不能忽略两样东西(网上在这块地方100%竟然都是漏了)

  • @EnableTurbine
  • @EnableHystrixDashboard

特别是@EnableHystrixDashboard,如果不指定,你也就不可能在Turbine访问时打开Turbine的内置hystrix dashboard了。

使用Turbine

把Turbine应用,启动起来。

然后通过浏览器访问:http://turbine应用ip:port/hystrix,可以得到以下界面

 

然后在以下截图的方框内填入:http://turbine应用的ip:端口/turbine.stream,点[Monitor Stream]按钮,然后记得你要访问那些个被监控的hystrix端过一会(nacos里服务自动发现+turbine.stream收集延时)后,你会看到如下效果。

在如下截图内,我们有两个hystrix端,都被turbine收集到了,如果是不同服务比如说3个服务,每个服务分在3个spring boot实例中,你是可以得到3*2(一个熔断被开启一个熔断没被触发)共6个仪表盘的。

 

 

 

以上是关于微服务设计指导-使用turbine结合nacos监控多集群hystrix的主要内容,如果未能解决你的问题,请参考以下文章

微服务设计指导-hystrix参数介绍

微服务设计指导-实践springcloud+springboot+nacos+feign+hytrix

Hystrix结合Turbine使用详述

Hystrix结合Turbine使用详述

Hystrix结合Turbine使用详述

SofaBoot使用Nacos进行服务注册发现