javascript
Spring Cloud构建微服务架构:Hystrix监控数据聚合【Dalston版】
上一篇我們介紹了使用Hystrix Dashboard來展示Hystrix用于熔斷的各項度量指標。通過Hystrix Dashboard,我們可以方便的查看服務實例的綜合情況,比如:服務調用次數、服務調用延遲等。但是僅通過Hystrix Dashboard我們只能實現對服務當個實例的數據展現,在生產環境我們的服務是肯定需要做高可用的,那么對于多實例的情況,我們就需要將這些度量指標數據進行聚合。下面,在本篇中,我們就來介紹一下另外一個工具:Turbine。
準備工作
在開始使用Turbine之前,我們先回顧一下上一篇中實現的架構,如下圖所示:
其中,我們構建的內容包括:
- eureka-server:服務注冊中心
- eureka-client:服務提供者
- eureka-consumer-ribbon-hystrix:使用ribbon和hystrix實現的服務消費者
- hystrix-dashboard:用于展示eureka-consumer-ribbon-hystrix服務的Hystrix數據
動手試一試
下面,我們將在上述架構基礎上,引入Turbine來對服務的Hystrix數據進行聚合展示。這里我們將分別介紹兩種聚合方式。
通過HTTP收集聚合
具體實現步驟如下:
- 創建一個標準的Spring Boot工程,命名為:turbine。
- 編輯pom.xml,具體依賴內容如下:
| <parent> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Dalston.SR1</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-turbine</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> |
- 創建應用主類TurbineApplication,并使用@EnableTurbine注解開啟Turbine。
public class TurbineApplication { public static void main(String[] args) { SpringApplication.run(TurbineApplication.class, args); } } |
- 在application.properties加入eureka和turbine的相關配置,具體如下:
| spring.application.name=turbine server.port=8989 management.port=8990 eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ turbine.app-config=eureka-consumer-ribbon-hystrix turbine.cluster-name-expression="default" turbine.combine-host-port=true |
參數說明
- turbine.app-config參數指定了需要收集監控信息的服務名;
- turbine.cluster-name-expression 參數指定了集群名稱為default,當我們服務數量非常多的時候,可以啟動多個Turbine服務來構建不同的聚合集群,而該參數可以用來區分這些不同的聚合集群,同時該參數值可以在Hystrix儀表盤中用來定位不同的聚合集群,只需要在Hystrix Stream的URL中通過cluster參數來指定;
- turbine.combine-host-port參數設置為true,可以讓同一主機上的服務通過主機名與端口號的組合來進行區分,默認情況下會以host來區分不同的服務,這會使得在本地調試的時候,本機上的不同服務聚合成一個服務來統計。
在完成了上面的內容構建之后,我們來體驗一下Turbine對集群的監控能力。分別啟動eureka-server、eureka-client、eureka-consumer-ribbon-hystrix、turbine以及hystrix-dashboard。訪問Hystrix Dashboard,并開啟對http://localhost:8989/turbine.stream`的監控,這時候,我們將看到針對服務`eureka-consumer-ribbon-hystrix`的聚合監控數據。
而此時的架構如下圖所示:
通過消息代理收集聚合
Spring Cloud在封裝Turbine的時候,還實現了基于消息代理的收集實現。所以,我們可以將所有需要收集的監控信息都輸出到消息代理中,然后Turbine服務再從消息代理中異步的獲取這些監控信息,最后將這些監控信息聚合并輸出到Hystrix Dashboard中。通過引入消息代理,我們的Turbine和Hystrix Dashoard實現的監控架構可以改成如下圖所示的結構:
從圖中我們可以看到,這里多了一個重要元素:RabbitMQ。對于RabbitMQ的安裝與基本時候我們可以查看之前的《Spring Boot中使用RabbitMQ》一文,這里不做過多的說明。下面,我們可以來構建一個新的應用來實現基于消息代理的Turbine聚合服務,具體步驟如下:
- 創建一個標準的Spring Boot工程,命名為:turbine-amqp。
- 編輯pom.xml,具體依賴內容如下:
| <parent> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Dalston.SR1</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencies> <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> </dependencies> |
可以看到這里主要引入了spring-cloud-starter-turbine-amqp依賴,它實際上就是包裝了spring-cloud-starter-turbine-stream和pring-cloud-starter-stream-rabbit。
注意:這里我們需要使用Java 8來運行
- 在應用主類中使用@EnableTurbineStream注解來啟用Turbine Stream的配置。
public class TurbineApplication { public static void main(String[] args) { SpringApplication.run(TurbineApplication.class, args); } } |
- 配置application.properties文件:
| spring.application.name=turbine-amqp server.port=8989 management.port=8990 eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ |
對于Turbine的配置已經完成了,下面我們需要對服務消費者eureka-consumer-ribbon-hystrix做一些修改,使其監控信息能夠輸出到RabbitMQ上。這個修改也非常簡單,只需要在pom.xml中增加對spring-cloud-netflix-hystrix-amqp依賴,具體如下:
| <dependencies> ... <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-hystrix-amqp</artifactId> </dependency> </dependencies> |
在完成了上面的配置之后,我們可以繼續之前的所有項目(除turbine以外),并通過Hystrix Dashboard開啟對http://localhost:8989/turbine.stream的監控,我們可以獲得如之前實現的同樣效果,只是這里我們的監控信息收集時是通過了消息代理異步實現的。
更多Spring Cloud內容請持續關注我的博客更新或在《Spring Cloud微服務實戰》中獲取。
代碼示例
樣例工程將沿用之前在碼云和GitHub上創建的SpringCloud-Learning項目,重新做了一下整理。通過不同目錄來區分Brixton和Dalston的示例。
- 碼云:點擊查看
- GitHub:點擊查看
相關閱讀
- Spring Cloud構建微服務架構:服務注冊與發現(Eureka、Consul)
- Spring Cloud構建微服務架構:服務消費者(基礎)
- Spring Cloud構建微服務架構:服務消費者(Ribbon)
- Spring Cloud構建微服務架構:服務消費者(Feign)
- Spring Cloud構建微服務架構:分布式配置中心
- Spring Cloud構建微服務架構:服務容錯保護(hystrix服務降級)
- Spring Cloud構建微服務架構:服務容錯保護(hystrix依賴隔離)
- Spring Cloud構建微服務架構:服務容錯保護(hystrix斷路器)
- Spring Cloud構建微服務架構:Hystrix監控面板
- Spring Cloud構建微服務架構:Hystrix監控數據聚合
- 更多Spring Cloud內容…
總結
以上是生活随笔為你收集整理的Spring Cloud构建微服务架构:Hystrix监控数据聚合【Dalston版】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 史上最强多线程面试44题和答案:线程锁+
- 下一篇: Android组件化方案及组件消息总线m