Hystrix Dashboard是一款針對Hystrix進行實時監控的工具,經過Hystrix Dashboard能夠直觀地看到各Hystrix Command的請求響應時間,請求成功率等數據。java
工程名 | 端口 | 做用 |
---|---|---|
eureka-server | 8761 | 註冊中心 |
service-hi | 8762 | 服務提供者 |
service-consumer | 8763 | 服務消費者 |
<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>
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 ); } }
<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>
server: port: 8762 spring: application: name: service-hi eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
@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 ); } }
<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>
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: "*"
@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 !"; } }
@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(); } }
先訪問http://localhost:8762/hi
再打開http://localhost:8763/actuator/hystrix.stream,能夠看到一些具體的數據:git
單純的查看json數據,很難分析出結果,因此,要在Hystrix儀表盤中來查看這一段json,在hystrix儀表盤中輸入監控地址進行監控:
打開儀表盤地址:http://localhost:8762/hystrix程序員
在界面依次輸入:http://localhost:8763/actuator/hystrix.stream 、2000 、service-consumer;點肯定。github
編一個測試腳本curl.shweb
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儀表盤:spring
能夠看出 ahService 由於模擬了1/3的機率超時,因此監控中呈現了30%左右的錯誤百分比。shell
https://github.com/gf-huanchu...json
歡迎掃碼或微信搜索公衆號《程序員果果》關注我,關注有驚喜~
tomcat