乐趣区

微服务熔断限流Hystrix之Dashboard

简介

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

快速上手

工程说明

工程名 端口 作用
eureka-server 8761 注册中心
service-hi 8762 服务提供者
service-consumer 8763 服务消费者

核心代码

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: 8761
eureka:
  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
@EnableEurekaServer
public 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: 8762

spring:
  application:
    name: service-hi
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

HelloController

@RestController
public 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
@EnableEurekaClient
public 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: 20000

spring:
  application:
    name: service-consumer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

management:
  endpoints:
    web:
      exposure:
        include: "*"
      cors:
        allowed-origins: "*"
        allowed-methods: "*"

HelloService

@Service
public 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

@RestController
public 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
@EnableCircuitBreaker
public 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;
do
curl "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…

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

退出移动版