美文网首页
Hystrix监控面板dashboard

Hystrix监控面板dashboard

作者: CXY_XZL | 来源:发表于2019-10-16 14:58 被阅读0次

    1.版本描述

    • spring-boot:2.1.9.RELEASE
    • spring-cloud: Greenwich.SR3

    2.示例结构

    结构图.png

    3.代码

    3.1eureka注册中心

    • 主要依赖
    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
    • 启动类
    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServerApplication.class, args);
        }
    }
    
    • application.properties
    spring.application.name=eureka-server
    server.port=8761
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
    eureka.client.register-with-eureka=false
    eureka.client.fetch-registry=false
    eureka.server.enable-self-preservation=false
    

    访问http://localhost:8761/启动eureka注册中心

    3.2服务提供端(一共有两个)

    3.2.1 第一个
    • 主要依赖
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
     </dependency>
    
    • 启动类
    @EnableEurekaClient
    @SpringBootApplication
    public class ScProviderApplication {
        public static void main(String[] args) {
            SpringApplication.run(ScProviderApplication.class, args);
        }
    }
    
    • 接口层
    @Slf4j
    @RestController
    public class MultiplyController {
    
        @Value("${spring.application.name}")
        private String name;
    
        @Value("${server.port}")
        private String port;
    
        @RequestMapping(value = "/multi",method = RequestMethod.GET)
        public Integer multiply(@RequestParam("a") int a,@RequestParam("b") int b){
    
            log.info("{}服务-端口:{}的multiply方法被调用---"+ LocalDateTime.now(),name,port);
            return a*b;
        }
    }
    
    • application.properties
    spring.application.name=service-multiply
    server.port=7777
    eureka.instance.prefer-ip-address=true
    eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
    

    3.2.2 第二个
    • 主要依赖
      与第一个相同
    • 启动类
      与第一个相同
    • 接口层
      与第一个相同
    • application.properties
    spring.application.name=service-multiply
    server.port=7778
    eureka.instance.prefer-ip-address=true
    eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
    

    启动两个服务端


    3.3服务消费端

    • 主要依赖
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
                <version>2.1.3.RELEASE</version>
            </dependency>
    
    • 启动类
    @EnableFeignClients
    @SpringCloudApplication
    public class ScFeignApplication {
        public static void main(String[] args) {
            SpringApplication.run(ScFeignApplication.class, args);
        }
    }
    
    • 接口层
    @Slf4j
    @RestController
    public class MultiplyController {
    
        @Autowired
        private GetMultiply getMultiply;
    
        @Autowired
        private ServiceInstance serviceInstance;
    
        @RequestMapping(value = "/multi",method = RequestMethod.GET)
        public Integer multiply(){
    
            log.info("{}服务-端口:{}的multiply方法被调用---"+ LocalTime.now(),serviceInstance.getServiceId(),serviceInstance.getPort());
            return getMultiply.multiply(1,2);
        }
    }
    
    • GetMultiply 类
    @FeignClient(value = "service-multiply",fallback = GetMultiplyImpl.class)
    public interface GetMultiply {
        @RequestMapping(value = "/multi",method = RequestMethod.GET)
        Integer multiply(@RequestParam("a") int a, @RequestParam("b") int b);
    }
    
    • GetMultiplyImpl类
    @Slf4j
    @Component
    public class GetMultiplyImpl implements GetMultiply {
    
        @Autowired
        private ServiceInstance serviceInstance;
    
        @Override
        public Integer multiply(int a, int b) {
            log.error("{}服务-端口:{}调用报错!!",serviceInstance.getServiceId(),serviceInstance.getPort());
            return 0;
        }
    }
    
    • application.properties
    spring.application.name=feign
    server.port=8887
    eureka.instance.prefer-ip-address=true
    eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
    feign.hystrix.enabled=true
    management.endpoints.enabled-by-default=true
    management.endpoints.web.exposure.include=*
    

    启动消费端


    3.4Hystrix-dashboard

    • 主要依赖
    <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-eureka-client</artifactId>
    </dependency>
    
    • 启动类
    @EnableEurekaClient
    @EnableHystrixDashboard
    @SpringBootApplication
    public class SpringCloudDashboardApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudDashboardApplication.class, args);
        }
    }
    
    • application.properties
    spring.application.name=hystrix-dashboard
    server.port=9999
    eureka.instance.prefer-ip-address=true
    eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
    eureka.client.service-url..defaultZone=http://localhost:8761/eureka/
    

    启动hystrix-dashboard,访问http://localhost:9999/hystrix将进入监控面板主页面,页面如下:

    hystrix-dashboard主页面.png

    在监控地址中输入http://localhost:8887/actuator/hystrix.stream

    • Dalay:延迟时间
    • Title: 显示的标题
      点击Monitor Stream,进入页面如下:
      bashboard监控页面.png

    如果页面展示的是loading...,那么需要先访问一下服务消费端的接口,此demo的是http://localhost:8887/multi,然后监控页面就会显示正常

    对于页面各部分代表的含义,可以参考管网wiki,部分截图如下:

    代表含义.png

    4.本demo中可能出现的bug

    描述:Unable to connect to Command Metric Stream.
    问题所在:
    没有给监控的服务添加如下依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
    

    然后启动类如下:

    @EnableFeignClients
    @SpringCloudApplication
    public class ScFeignApplication {
        public static void main(String[] args) {
            SpringApplication.run(ScFeignApplication.class, args);
        }
    }
    

    启动类中的@EnableFeignClients不是必要的,根据自己的需要决定,此demo中用了两个服务生产者,所以使用了feign,重点是要有开启断路器的注解@EnableCircuitBreaker,@SpringCloudApplication注解的源代码如下:

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableCircuitBreaker
    public @interface SpringCloudApplication {
    
    }
    

    同时要注意application.properties文件是有有开启断路器的配置

    feign.hystrix.enabled=true
    

    现在hystrix-dashboard基本都是和turbine一起使用的,毕竟hystrix-dashboard只能监控单体应用,而turbine可以监控多个,有兴趣的话可以参考spring cloud 聚合监控Turbine这篇文章,这篇文章也是建立在本文的基础之上的。

    5.代码地址
    eureka:https://gitee.com/xiongzelin/eureka-seever.git
    服务提供端:

    相关文章

      网友评论

          本文标题:Hystrix监控面板dashboard

          本文链接:https://www.haomeiwen.com/subject/yzhsmctx.html