简介

Hystrix Dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard可以直观地看到各Hystrix Command的请求响应时间,请求成功率等数据。

快速上手

工程说明

工程名端口作用
eureka-server8761注册中心
service-hi8762服务提供者
service-consumer8763服务消费者

核心代码

eureka-server 工程

pom.xml

<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-server</artifactId></dependency>
application.yml
server:  port: 8761eureka:  instance:    hostname: localhost  client:    register-with-eureka: false    fetch-registry: false    service-url:      defaultZone: http://${eureka.instance.hostname}:/${server.port}/eureka/spring:  application:    name: eureka-server

启动类

@SpringBootApplication@EnableEurekaServerpublic class EurekaServerApplication {    public static void main(String[] args) {        SpringApplication.run( EurekaServerApplication.class, args );    }}

service-hi 工程

pom.xml

<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>

application.yml

server:  port: 8762spring:  application:    name: service-hieureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/

HelloController

@RestControllerpublic class HelloController {    @GetMapping("/hi")    public String hi() {        return "hello ~";    }    @GetMapping("/hey")    public String hey() {        return "hey ~";    }    @GetMapping("/oh")    public String oh() {        return "ah ~";    }    @GetMapping("/ah")    public String ah() {        //模拟接口1/3的概率超时        Random rand = new Random();        int randomNum = rand.nextInt(3) + 1;        if (3 == randomNum) {            try {                Thread.sleep( 3000 );            } catch (InterruptedException e) {                e.printStackTrace();            }        }        return "来了老弟~";    }}

启动类

@SpringBootApplication@EnableEurekaClientpublic class ServiceHiApplication {    public static void main(String[] args) {        SpringApplication.run( ServiceHiApplication.class, args );    }}

service-consumer 工程

pom.xml

<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-netflix-ribbon</artifactId></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></dependency><dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId></dependency>

application.yml

server:  port: 8763  tomcat:    uri-encoding: UTF-8    max-threads: 1000    max-connections: 20000spring:  application:    name: service-consumereureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/management:  endpoints:    web:      exposure:        include: "*"      cors:        allowed-origins: "*"        allowed-methods: "*"

HelloService

@Servicepublic class HelloService {    @Autowired    private RestTemplate restTemplate;    /**     * 简单用法     */    @HystrixCommand    public String hiService() {        return restTemplate.getForObject("http://SERVICE-HI/hi" , String.class);    }    /**     * 定制超时     */    @HystrixCommand(commandProperties = {            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "30000") })    public String heyService() {        return restTemplate.getForObject("http://SERVICE-HI/hey" , String.class);    }    /**     * 定制降级方法     */    @HystrixCommand(fallbackMethod = "getFallback")    public String ahService() {        return restTemplate.getForObject("http://SERVICE-HI/ah" , String.class);    }    /**     * 定制线程池隔离策略     */    @HystrixCommand(fallbackMethod = "getFallback",            threadPoolKey = "studentServiceThreadPool",            threadPoolProperties = {                    @HystrixProperty(name="coreSize", value="30"),                    @HystrixProperty(name="maxQueueSize", value="50")            }    )    public String ohService() {        return restTemplate.getForObject("http://SERVICE-HI/oh" , String.class);    }    public String getFallback() {        return "Oh , sorry , error !";    }}

HelloController

@RestControllerpublic class HelloController {    @Autowired    private HelloService helloService;    @GetMapping("/hi")    public String hi() {        return helloService.hiService();    }    @GetMapping("/hey")    public String hey() {        return helloService.heyService();    }    @GetMapping("/oh")    public String oh() {        return helloService.ohService();    }    @GetMapping("/ah")    public String ah() {        return helloService.ahService();    }}

启动类

@SpringBootApplication@EnableEurekaClient@EnableHystrixDashboard@EnableHystrix@EnableCircuitBreakerpublic class ServiceConsumerApplication {    public static void main(String[] args) {        SpringApplication.run( ServiceConsumerApplication.class, args );    }    @LoadBalanced    @Bean    public RestTemplate restTemplate() {        return new RestTemplate();    }}

Hystrix Dashboard 的使用

JSON格式监控信息

先访问http://localhost:8762/hi
再打开http://localhost:8763/actuator/hystrix.stream,可以看到一些具体的数据:

Hystrix仪表盘监控信息

单纯的查看json数据,很难分析出结果,所以,要在Hystrix仪表盘中来查看这一段json,在hystrix仪表盘中输入监控地址进行监控:
打开仪表盘地址:http://localhost:8762/hystrix

在界面依次输入:http://localhost:8763/actuator/hystrix.stream 、2000 、service-consumer;点确定。

Hystrix仪表盘指标含义

测试

编一个测试脚本curl.sh

while true;docurl "http://localhost:8763/hi";curl "http://localhost:8763/hey";curl "http://localhost:8763/oh";curl "http://localhost:8763/ah";done

执行测试脚本,查看Hystrix仪表盘:

可以看出 ahService 因为模拟了1/3的概率超时,所以监控中呈现了30%左右的错误百分比。

源码

https://github.com/gf-huanchu...

欢迎扫码或微信搜索公众号《程序员果果》关注我,关注有惊喜~