一、前言
Dashboard又稱為儀表盤,是用來監控項目的執行情況的,本文旨在Dashboard的使用
分別為單體監控、集群監控、與消息代理結合。
代碼請戳我的github
二、快速入門
新建一個SpringBoot項目起名為HystrixDashboard
pom文件:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cnblogs.hellxz</groupId>
<artifactId>hystrix-dashboard</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
在com.cnblogs.hellxz包下創建DashBoardApp主類,開啟@SpringBootApplication
注解和@EnableHystrixDashboard
注解
package com.cnblogs.hellxz;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
/**
* @Author : Hellxz
* @Description: 儀表盤 啟動主類
* @Date : 2018/5/4 17:55
*/
@SpringBootApplication
@EnableHystrixDashboard
public class DashBoardApp {
public static void main(String[] args) {
SpringApplication.run(DashBoardApp.class, args);
}
}
在resources
包下創建application.yml
,只需指定應用名和端口號2001
spring:
application:
name: hystrix-dashboard
server:
port: 2001
啟動項目,在地址欄上輸入http://localhost:2001/hystrix
DashBoard不用注冊到注冊中心的,只需要被監控 服務做一些配置即可
三、單體應用的監控(這里以RibbonConsumHystrix
為例)
單體應用是說我們一個服務只有一個實例,Dashboard通過這個實例暴露的監控信息,將這些信息展示出來,如圖
在被監控的服務pom.xml中添加
<!--暴露各種指標-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--hystrix熔斷器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>RELEASE</version>
</dependency>
在被監控的應用的主類上添加@EnableCircuitBreaker
注解
如果之前已經加了
@SpringCloudApplication
注解那么就不用加這個注解了,因為@SpringCloudApplication
已經包含@EnableCircuitBreaker
分別啟動注冊中心、服務提供者、RibbonConsumHystrix,之前開啟的儀表盤項目不要關
訪問議表盤頁面 http://localhost:2001/hystrix
在頁面中輸入http://localhost:8088/hystrix.stream
, 點擊Monitor Stream
,如圖
參數說明:
- Delay:該參數用來控制服務器上輪詢監控信息的延遲時間,默認2000ms,可以通過配置該屬性來降低 客戶端的網絡和Cpu消耗
- Title:該參數對應了上圖Hystrix Stream之后的內容,默認會使用具體監控實例的Url,配置以展示合適的標題
此時使用Postman多次訪問RibbonConsumHystrix
項目中的接口,
此時查看剛才的頁面,如圖(我這里調用了兩個接口)
在監控信息中,我們看到了很多數字,這些有顏色的文字對應右上方的對應顏色的參數
這里面有兩個相對重要的信息:實心圓和一條拆線
- 實心圓:有兩種含義
- 顏色變化代表實例健康程度,綠 > 黃 > 橙 > 紅
- 圓的大小,代表請求流量的變化,流量越大,圓的面積越大,反之亦然
- 拆線:用來記錄兩分種內流量的相對變化,類似k線,通過它的上升和下降來觀察即時流量變化
四、Turebine 集群監控
在上一節我們對Hystrix儀表盤進行了快速入門,使用的是單個實例監控的/hystrix.stream節點
這一節我們使用/turbine.stream
對集群進行監控,這里我們需要引入Turbine,通過它來匯集監控信息,並將信息提供給Hystrix Dashboard來集中展示
1、構建監控聚合服務
新建一個標准Spring Boot項目,取名為Turbine
pom如下:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cnblogs.hellxz</groupId>
<artifactId>Turbine</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!--turbine-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>RELEASE</version>
</dependency>
<!--暴露各種指標-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--hystrix熔斷器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
新建一個主類,開啟@EnableTurbine
注解,這里使用@SpringCloudApplication
注解可以少寫幾個注解,比如@EnableDiscoveryClient
,turbine是需要注冊到注冊中心的
package com.cnblogs.hellxz;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.turbine.EnableTurbine;
@EnableTurbine
@SpringCloudApplication
public class TurbineApp {
public static void main(String[] args) {
SpringApplication.run(TurbineApp.class, args);
}
}
在resources包中創建application.yml
server:
port: 8989
spring:
application:
name: turbine
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka
turbine:
app-config: ribbon-hystrix #指定了被收集的app名稱
combine-host-port: true #同一主機多個服務使用hostname+port進行區分,此項默認為false,即同一主機多服務會合並成一個服務展示
cluster-name-expression: new String("default") #指定集群名稱,書中直接使用“default“,這里已經不能用了,會報錯
cluster-name-expression 這里我們通過指定不同名稱的聚合集群,服務很多的時候,我們可以啟動多個Turbine服務指定不同的集群名稱和監控app名稱,從而更清晰的區分各個集群
現在我們測試一下:
1、分別啟動 注冊中心、服務提供者
2、maven 打包RibbonConsumHystrix,指定一個端口是8089啟動,一個用默認啟動,注意,RibbonCustomHystrix項目中我有其他用於測試的main方法,打包會失敗,所以先注釋掉UserCommand的main方法
,打包之后執行代碼
java -jar RibbonConsumHystrix-1.0-SNAPSHOT.jar --server.port=8089
3、啟動RibbonConsumHystrix項目
4、接着啟動Turbine、儀表盤
5、在地址欄輸入並訪問 http://localhost:2001/hystrix
6、在Hystrix Dashboard下方的地址欄輸入http://localhost:8989/turbine.stream
,點擊Monitor Stream
7、使用postman對兩個端口8088和8089分別進行請求
這里說明一下,如果是沒有對這兩個端口發送請求, http://localhost:8989/turbine.stream 這里會一直在loading,
如果只請求一個端口,而另一個沒有被請求,那么會只顯示Hosts:1
五、與消息代理結合
Spring Cloud 在封裝Turbine的同時也封裝了基於消息代理的收集實現。所以我們可以通過將所有需要收集的監控消息都輸出到消息代理中,然后Turbine 服務再從消息代理中異步獲取這些監控信息,最后將信息交給Hystrix Dashboard中做展示。如圖
使用這個架構之前,我們需要先安裝好RabbitMQ,這里先說一下本文的簡單配置,使RabbitMQ可用,其實不僅可以使用RabbitMQ,只要實現了AMQP的消息代理,理論上都可以結合Turbine使用
1、安裝RabbitMQ (以Windows舉例)
准備:
- Erlang/OTP_20.3
- RabbitMQ Server 3.7.5
- JDK 1.8
首先,安裝Erlang(OTP_20.3.exe),一路next安裝下來即可
然后打開路徑C:\Windows\System32\config\systemprofile
,將.erlang.cookie
復制到C:\Users\你的用戶名
下
如上操作是為了避坑,詳情參考我的上一篇文章RabbitMQ問題解決:TCP connection succeeded but Erlang distribution failed
安裝RabbitMQ Server,全用默認會更方便,一路next安裝下來 到close,此時默認是直接注冊到系統服務的
安裝完成菜單欄會有這樣的顯示
查看服務,服務已經正常啟動
推薦使用 來進行操作,安裝在默認的位置的話,打開這個直接就在
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.5\sbin
,否則使用cd命令進入安裝路徑下的RabbitMQ Server\rabbitmq_server-3.7.5\sbin
,還有個原因用這個終端是它可以自動提權,減少失敗出現的機率
輸入rabbitmqctl status
,顯示如圖就代表正常,可以繼續操作,出現TCP connection succeeded but Erlang distribution failed,點擊查看我的解決辦法
還沒完,接着輸入rabbitmq-plugins enable rabbitmq_management
,來開啟 web管理插件
打開瀏覽器,地址欄輸入http://localhost:15672/
賬號密碼 默認都是guest ,對於使用其他賬號登錄請參考其他文章,這里僅為此實驗可用
這樣RabbitMQ Server基本上我們就已經配好了,開始正菜
2、創建Turbine整合消息代理的項目
新建標准Spring Boot項目TurbineAmqp
,pom文件內容如下:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cnblogs.hellxz</groupId>
<artifactId>TurbineAmqp</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!-- turbine集群監控 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
<!-- spring cloud的RabbitMQ的實現,實際上包裝了spring-cloud-stater-turbine-stream和spring-cloud-starter-stream-rabbitmq -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine-amqp</artifactId>
</dependency>
<!-- 暴露各種指標 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--Hystrix的依賴,不加會報ClassNotFound異常-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<!--加入此依賴,避免Caused by: java.lang.ClassNotFoundException: com.netflix.turbine.aggregator.InstanceKey-->
<dependency>
<groupId>com.netflix.turbine</groupId>
<artifactId>turbine-core</artifactId>
<version>2.0.0-DP.2</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
新建主類TurbineAmqpApp
package com.cnblogs.hellxz;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.turbine.stream.EnableTurbineStream;
/**
* <b>類名</b>: TurbineAmqpApp
* <p><b>描 述</b>: Turbine基於RabbitMQ消息代理的主類</p>
*
* <p><b>創建日期</b>2018/5/28 16:29</p>
* @author HELLXZ 張
* @version 1.0
* @since jdk 1.8
*/
@SpringCloudApplication
@EnableTurbineStream
public class TurbineAmqpApp {
public static void main(String[] args) {
SpringApplication.run(TurbineAmqpApp.class, args);
}
}
這里相較其他文章中用
@SpringBootApplication
/@EnableDiscoveryClient
/@EnableCircuitBreaker
再加上@EnableTurbineStream
作用相同,我們可以發現@SpringCloudApplication
注解封裝了這幾個注解,這個問題以后就不說了
在resources
包下創建application.yml
,如下:
server:
port: 8989
spring:
application:
name: turbine-amqp
management:
port: 8990
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka
項目 在這里就搭建完成了開始測試
3、測試
分別按順序啟動 注冊中心、服務提供者、RibbonConsumHystrix、TurbineAmqp、Dashboard
地址欄訪問:http://localhost:2001/hystrix
在Hystrix Dashboard字樣下的輸入框,輸入http://localhost:8989/turbine.stream
,點擊Monitor
postman 多次訪問帶Hystrix的接口,會出現如圖
在http://localhost:15672/#/
頁面中也會有一些指標顯示
雖然看起來和直接使用Turbine來聚合監控信息,沒什么區別,其實只是這種整合消息代理的方式是異步的。
六、總結
通過本文的學習,我們可以知道Dashboard的作用和用法,各個參數的意義,單體監控/hystrix.stream
,集群可用Turbine的/turbine.stream
,還有關於Turbine與消息代理作整合的使用方法。
有了Dashboard這種神器,我們就可以即時地了解服務中Hystrix熔斷器的工作情況和健康情況,從而對服務作針對性調整。
說點題外話,總有朋友問我:這就完了?
是啊,的確寫完了,但是有個問題就是,我寫這些文章中出現的問題與解決的辦法是什么,看了文章你會有所了解
但是
- 為什么這么做?
- 這些答案是在哪里找到的?
- 最后的解決方案是怎么想到的?
這些都是單單看個樂呵所不能體會的,看起來簡單的東西不一定就能做得好,所以在這里推薦大家動手操作,你可以創建兩個workspace,一個放自己的代碼,另一個放我的代碼,對比着學習,我想這樣你會有更多的收獲。
最后碼字不易,如果本文對你有所幫助,還請大家點個推薦,評論一下:)
本文引用
《Spring Cloud 微服務實戰》 翟永超
java.lang.NoClassDefFoundError: com/netflix/hystrix/contrib/javanica/aop/aspectj/HystrixCommandAspec
ClassNotFound exception when using Spring Cloud Starter Turbine AMQP
本文為實踐筆記,如需轉載,請注明出處:https://www.cnblogs.com/hellxz/p/9100224.html