Hystrix儀表盤:
在斷路器原理的介紹中 ,我們多次提到關千請求命令的度量指標的判斷。這些度量指標都是HystrixComrnand和HystrixObservableComrnand實例在執行過程中記錄的重要信息, 它們除了在Hystrix斷路器實現中使用之外,對千系統運維也有非常大的幫助 。這些指標信息會以“ 滾動時間窗 ”與“ 桶 ”結合的方式進行匯總,並在內存中駐留一 段時間,以供內部或外部進行查詢使用,包括每秒執行多少請求,多少成功,多少失敗等。Netflix通過hystrix-metrics-event-stream項目實現了對以上指標的監控。SpringCloud也提供了hystrix dashboard的整合,對監控內容轉化成可視化界面。Hystrix儀表盤就是這些指標內容的消費者之 一 。通過之前的內容,我們已經體驗到了Spring Cloud對Hystrix的優雅整合。除此之外,Spring Cloud還完美地整合了它的儀表盤組件Hystrix Dashboard, 它主要用來 實時監控Hystrix的各項指標信息。通過HystrixDashboard反饋的實時信息,可以幫助我們快速發現系統中存在的問題,從而及時地采取應對措施。構建一個Hystrix Dashboard 來對RIBBON-SERVER實現監控。
在 Spring Cloud 中構建 一 個 Hystrix Dashboard 非常簡單, 只需要下面 4 步:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR3</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <!-- SpringCloud 所有子項目 版本集中管理. 統一所有SpringCloud依賴項目的版本依賴--> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> <version>1.4.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> <version>1.4.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> <build> <plugins> <plugin><!-- SpringBoot 項目打jar包的Maven插件 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
2.修改application.yml
server: port: 9005 spring: application: name: hystrix-dasboard #服務注冊到Eureka上使用的名稱
3.修改啟動類
@SpringBootApplication @EnableHystrixDashboard //開啟儀表盤圖形化監控的注解
public class HystrixDasboardApp { private final static Logger log = LoggerFactory.getLogger(HystrixDasboardApp.class); public static void main(String[] args) { SpringApplication.run(HystrixDasboardApp.class,args); log.info("服務啟動成功"); } }
4.啟動本微服務 訪問路徑為 http://localhost:9005/hystrix,看到以下界面,說明儀表盤配置成功
Delay: 該參數用來控制服務器上輪詢監控信息的延遲時間,默認為 2000 毫秒, 可以通過配置該屬性來降低客戶端的網絡和CPU消耗。
Title: 該參數對應了上圖頭部標題 Hystrix Stream 之后的內容, 默認會使用具體監控實例的URL, 可以通過配置該信息來展示更合適的標題。
這是Hystrix Dashboard的監控首頁, 該頁面中並沒有具體的監控信息。 從頁面的文字內容中我們可以知道,Hystrix Dashboard共支持三種不同的監控方式, 如下所示。
- 默認的集群監控: 通過URL http://turbine-hostname:port/turbine.stream開啟, 實現對默認集群的監控。
- 指定的集群監控: 通過URL http://turbine-hostname:port/turbine.strearn?cluster = [clusterName]開啟, 實現對clusterName集群的監控。
- 單體應用的監控: 通過URL http: //hystrix-app:port/hystrix.stream開啟, 實現對具體某個服務實例的監控。
單體應用的監控:
前兩者都是對集群的監控,需要整合Turbine才能實現。這里我們先來實現單個服務實例的監控。既然Hystrix Dashboard監控單實例節點需要通過訪間實例的/hystrix.stream接口來實現, 我們自然需要為服務實例添加這個端點, 而添加該功能的步驟也同樣簡單, 只需要下面兩步。
- 在服務實例 pom.xml 中的 dependencies 節點中新增 spring-boot-starter-actuator 監控模塊以開啟監控相關的端點, 並確保已經引入斷路器的依賴 spring-cloud-starter-hystrix.
- 確保在服務實例的主類中已經使用 @EnableCircuitBreaker 注解, 開啟了斷路器功能。
- 另外,由於版本的原因,我這里還需要在RIBBON-SERVER中添加一個Bean:
@Bean public ServletRegistrationBean getServlet(){ HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/actuator/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; }
在為 RIBBON-SERVER加入上面的配置之后,重啟它的實例, /actuator/hystrix.stream 就是用於 Hystrix Dashboard 來展現監控信息的接口。
到這里已經完成了所有的配置,在 Hystrix Dashboard 的首頁輸入 http://localhost:9001/actuator/hystrix.stream, 可以看到已啟動對 RIBBON-SERVER的監控,單擊 MonitorStream 按鈕, 可以看到如下頁面。
實心圓:共有兩種含義,他通過顏色的變化代表了實例的健康程度,它的健康程度從綠<黃<橙<紅遞減,該實心圓除了顏色的變化之外,它的大小也會根據實例的請求流量發生變化。流量越大該實心圓就越大。所以通過該實心圓,就可以在大量的實例中快速發現故障實例和高壓力實例
對於可視化監控界面(上圖) 7 色 1 圈 1 線的含義如下圖:
至此就配置好了儀表盤供用戶查看服務實例的健康狀況.
Turbine集群監控:
上面我們提到提到過除了可以開啟單個實例的監控頁面之外, 還有 一 個監控端點 /turbine.stream 是對集群使用的。 從端點的命名中, 可猜測到這里我們將引入 Turbine, 通過它來匯集監控信息,並將聚合后的信息提供給 HystrixDashboard 來集中展示和監控。
構建監控聚合服務
通過引入 Turbine 來聚合RIBBON-SERVER服務的監控信息,並輸出給 Hystrix Dashboard 來進行展示。
1.創建 一 個標准的Spring Boot工程, 命名為turbine。
2.編輯porn. xml, 具體依賴內容如下所示。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
3.創建應用主類TurbineApplication, 並使用@EnableTurbine 注解開啟 Turbine。
@EnableTurbine @EnableDiscoveryClient @SpringBootApplication public class TurbineApp { public static void main(String[] args) { SpringApplication.run(TurbineApp.class, args); } }
4.在application.yml中加入Eureka和Turbine的相關配置, 具體如下:
server: port: 9006 spring: application: name: turbine #服務注冊到Eureka上使用的名稱 turbine: aggregator: cluster-config: default app-config: RIBBON-SERVER,ribbon-server-two #指定了需要收集監 控信息的服務名 cluster-name-expression: new String("default") #參數指定了集群名稱為default combine-host-port: true # true 同一主機上的服務通過host和port的組合來進行區分,默認為true # false 時 在本機測試時 監控中host集群數會為1了 因為本地host是一樣的 eureka: client: service-url: # 集群情況下如下,如果是單機版,只需要配置單機版Eureka地址 defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/
instance: instance-id: hystrix-dasboard-turbine prefer-ip-address: true #訪問路徑顯示IP地址
在完成了上面的內容構建之后,我們來體驗 一 下Turbine對集群的監控能力。分別啟動eureka-server、 cloud-provider、 RIBBON-SERVER、 Turbine 以及 HystrixDashboard。
整個架構在注冊中心上的注冊信息來看是這樣的:
訪問Hystrix Dashboard, 並開啟對 http://localhost:9006/turbine.stream的監控, 我們可以看到如下頁面:
我們啟動了兩個Ribbon-consumer,但是在監控頁面依然只是展示了一個監控圖。但是可以發現集群報告區域中的Hosts屬性已經變成了2個實例。由此我們知道ribbon-consumer啟動了兩個實例,只是展示在一個監控圖中,是由於兩個實例是同一個服務,而對於服務集群來說,我們關注的是服務集群的高可用,所以Turbine會將相同的服務作為整體看待,並匯總成一個監控圖。
與消息代理結合:
Spring Cloud在封裝Turbine的時候, 還封裝了基於消息代理的收集實現。這里多了一 個重要元素RabbitMQ。 對於RabbitMQ 的安裝我們可以參考 https://www.cnblogs.com/wuzhenzhao/p/10315642.html 。所以, 我們可以將所有需要收集的監控信息都輸出到消息代理中,然后Turbine服務再從消息代理中異步獲取這些監控信息, 最后將這些監控信息聚合並輸出到Hystrix Dashboard中。
1.創建 一 個標准的Spring Boot工程, 命名為turbine-amqp。
2.編輯pom.xml, 具體依賴內容如下所示:這里我們需要使用 Java 8 來運行。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine-amqp</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
3.在應用主類中使用@EnableTurbineStrearn注解來啟用Turbine Stream的配置。
@EnableTurbineStream @EnableDiscoveryClient @SpringBootApplication public class TurbineAMQPApp { public static void main(String[] args) { SpringApplication.run(TurbineAMQPApp.class, args); } }
4.配置application.yml文件。
server: port: 9008 spring: rabbitmq: host: 192.168.1.101 username: guest password: guest port: 5672 application: name: turbine-amqp #服務注冊到Eureka上使用的名稱 turbine: aggregator: cluster-config: default app-config: RIBBON-SERVER,ribbon-server-two #指定了需要收集監 控信息的服務名 cluster-name-expression: new String("default") #參數指定了集群名稱為default combine-host-port: true # true 同一主機上的服務通過host和port的組合來進行區分,默認為true # false 時 在本機測試時 監控中host集群數會為1了 因為本地host是一樣的 eureka: client: service-url: # 集群情況下如下,如果是單機版,只需要配置單機版Eureka地址 defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/
instance: instance-id: hystrix-dasboard-turbine-amqp prefer-ip-address: true #訪問路徑顯示IP地址
對於Turbine的配置已經完成了, 下面需要對服務消費者RIBBON-SERVER做 一 些修改, 使其監控信息能夠輸出到RabbitMQ上。 這個修改也非常簡單, 只需在pom.xml中
增加對spring-cloud-netflix-hystrix-amqp的依賴, 具體如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix-amqp</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
再配置相關Rabbitmq配置
spring: rabbitmq: host: 192.168.1.101 username: guest password: guest port: 5672
重啟 RIBBON-SERVER、turbine-amqp。通過引入消息代理,我們的Turbine和Hystrix Dashboard實現的監控架構在注冊中心上的注冊信息來看是這樣的:
此時可以查看RabbitMQ會有對應的連接的:
我們可以獲得如之前實現的同樣結果, 只是這里的監控信息收集是通過消息代理異步實現的。下圖就是最終的監控效果的呈現,原來兩個RIBBON-SERVER都在這里顯示了。並不像 turbine 那樣子合到了一起