前面講解了斷路器, 當資料服務不可用的時候, 斷路器就會發揮作用。
那麼資料服務什麼時候可用,什麼時候不可用,如何監控這個事情呢? 我們就要用到 斷路器監控 來可視化掌控這個情況。
建立監控子項目
建立子項目hystrix-dashboard 。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>edu.hpu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>hystrix-dashboard</artifactId>
<name>hystrix-dashboard</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>
</dependencies>
斷路器監控啟動類
ProductServiceHystrixDashboardApplication,主要就是這個注解@EnableHystrixDashboard,表示開啟儀表盤功能。
package edu.hpu.springcloud;
import cn.hutool.core.util.NetUtil;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
@SpringBootApplication
@EnableHystrixDashboard
public class ProductServiceHystrixDashboardApplication {
public static void main(String[] args) {
int port = 8020;
if(!NetUtil.isUsableLocalPort(port)) {
System.err.printf("端口%d被占用了,無法啟動%n", port );
System.exit(1);
}
new SpringApplicationBuilder(ProductServiceHystrixDashboardApplication.class).properties("server.port=" + port).run(args);
}
}
application.yml
spring:
application:
name: hystrix-dashboard
ProductViewServiceFeignApplication
修改視圖微服務,主要是在啟動類中添加注解@EnableCircuitBreaker,使其可以把消息發送給監控中心。
package edu.hpu.springcloud;
import brave.sampler.Sampler;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.NetUtil;
import cn.hutool.core.util.NumberUtil;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import java.util.Scanner;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker
public class ProductViewServiceFeignApplication {
public static void main(String[] args) {
//判斷 rabiitMQ 是否啟動
int rabbitMQPort = 5672;
if(NetUtil.isUsableLocalPort(rabbitMQPort)) {
System.err.printf("未在端口%d 發現 rabbitMQ服務,請檢查rabbitMQ 是否啟動", rabbitMQPort );
System.exit(1);
}
int port = 0;
int defaultPort = 8012;
Future<Integer> future = ThreadUtil.execAsync(() ->{
int p = 0;
System.out.println("請于5秒鐘内輸入端口号, 推薦 8012 、 8013 或者 8014,超過5秒将預設使用"+defaultPort);
Scanner scanner = new Scanner(System.in);
while(true) {
String strPort = scanner.nextLine();
if(!NumberUtil.isInteger(strPort)) {
System.err.println("隻能是數字");
continue;
}
else {
p = Convert.toInt(strPort);
scanner.close();
break;
}
}
return p;
});
try{
port=future.get(5, TimeUnit.SECONDS);
}
catch (InterruptedException | ExecutionException | TimeoutException e){
port = defaultPort;
}
if(!NetUtil.isUsableLocalPort(port)) {
System.err.printf("端口%d被占用了,無法啟動%n", port );
System.exit(1);
}
new SpringApplicationBuilder(ProductViewServiceFeignApplication.class).properties("server.port=" + port).run(args);
}
@Bean
public Sampler defaultSampler() {
return Sampler.ALWAYS_SAMPLE;
}
}
AccessViewService
這是一個工具類,不停地通路視圖微服務,友善監控。
package edu.hpu.springcloud.util;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.http.HttpUtil;
public class AccessViewService {
public static void main(String[] args) {
while(true) {
ThreadUtil.sleep(1000);
try {
String html= HttpUtil.get("http://127.0.0.1:8012/products");
System.out.println("html length:" + html.length());
}
catch(Exception e) {
System.err.println(e.getMessage());
}
}
}
}
啟動通路:
依次啟動服務中心、配置伺服器、資料微服務、視圖微服務、斷路器監控。
運作通路工具類,以不停通路視圖微服務。
通路位址:
http://localhost:8020/hystrix這個是監控位址,

在第一個輸入框輸入:
http://localhost:8012/actuator/hystrix.stream
這個位址就是視圖微服務的短路資訊。
然後點選 Monitor Stream 就可以看到監控資訊了。
監控圖詳解:
結束資料服務:
紅色的資料就達到 100%。
問題
1、怎麼結束服務?
上面一步操作是結束資料服務,我用的辦法是先查端口,再在任務管理器中結束程序,這種方式太笨重,查了一下,沒有找到特别理想的結果。
看參考【3】吧。
參考:
【1】、
http://how2j.cn/k/springcloud/springcloud-dashboard/2043.html#nowhere【2】、
https://wangsong.blog.csdn.net/article/details/78224483【3】、
http://www.itmuch.com/spring-cloud-sum/how-to-unregister-service-in-eureka/