簡介
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%左右的錯誤百分比。
原始碼
歡迎掃碼或微信搜尋公眾號《程式設計師果果》關注我,關注有驚喜~