Spring Cloud構建微服務架構:Hystrix監控數據聚合

上一篇我們介紹了使用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。
@Configuration
@EnableAutoConfiguration
@EnableTurbine
@EnableDiscoveryClient
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-servereureka-clienteureka-consumer-ribbon-hystrixturbine以及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-streampring-cloud-starter-stream-rabbit

注意:這裏我們需要使用Java 8來運行

  • 在應用主類中使用@EnableTurbineStream註解來啓用Turbine Stream的配置。
@Configuration
@EnableAutoConfiguration
@EnableTurbineStream
@EnableDiscoveryClient
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的監控,我們可以獲得如之前實現的同樣效果,只是這裏我們的監控信息收集時是通過了消息代理異步實現的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章