Spring Cloud :斷路器集羣監控(Turbine)

一. 簡介
      上一篇文章咱們已經實現了對單個服務實例的監控,固然在實際應用中,單個實例的監控數據沒有多大的價值,咱們更須要的是一個集羣系統的監控信息,這時咱們就須要引入Turbine。Turbine可以聚集監控信息,並將聚合後的信息提供給Hystrix Dashboard來集中展現和監控。java

二. 構建監控局和服務
2.1 總體結構與準備git

      本文的工程實現是基於上一篇文章的工程,經過引入Turbine來聚合service-ribbon服務的監控信息,並輸出給Hystrix Dashboard來進行展現。由於咱們須要多個服務的Dashboard,因此咱們將構建service-ribbon集羣,同時須要新建一個service-turbine工程,用於聚合信息並展現。最終總體架構以下:github

 


2.2 建立service-turbinespring

      新建一個Spring Boot工程,命名爲service-turbine,在pom.xml中導入必要的依賴:express

<?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.dan</groupId>
<artifactId>service-turbine</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>service-turbine</name>
<description>Demo project for Spring Boot</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<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>Edgware.SR1</spring-cloud.version>
</properties>

<dependencies>
  <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-turbine</artifactId>
  </dependency>
  <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-netflix-turbine</artifactId>
  </dependency>
  <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>

  <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
  </dependency>
  </dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>


</project>
      在工程啓動類上加上@EnableTurbine註解,開啓Turbine,該註解已經包含了@EnableDiscoveryClient註解,即已開啓了註冊服務:
@SpringBootApplication
@EnableTurbine
public class ServiceTurbineApplication {

public static void main(String[] args) {
SpringApplication.run(ServiceTurbineApplication.class, args);
}
}
      在application.properties中加入Eureka和Turbine的相關配置,具體以下:
spring.application.name=service-turbine
server.port=8766
security.basic.enabled=false

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka

turbine.aggregator.cluster-config=default
turbine.app-config=service-ribbon
turbine.cluster-name-expression="default"
turbine.combine-host-port=true
      上面的配置中,turbine.app-config參數配置Eureka中的serviceId列表,代表監控哪些服務;turbine.cluster-name-expression參數指定了集羣名稱爲default,當服務數量很是多的時候,能夠啓動多個Turbine服務來構建不一樣的聚合集羣,而該參數能夠用來區分這些不一樣的聚合集羣,同時該參數值能夠再Hystrix儀表盤中用來定位不一樣的聚合集羣,只需在Hystrix Stream的URL中經過cluster參數來指定;turbine.combine-host-port參數設置爲true,可讓同一主機上的服務經過主機名與端口號的組合來進行區分,默認狀況下會以host來區分不一樣的服務,這會使得在本機調試的時候,本機上的不一樣服務聚合成一個服務來統計。apache

 

三. 集羣監控
      啓動eureka-server工程,端口號爲8761;架構

      啓動eureka-client工程,端口號爲8762和8763;app

      啓動service-ribbon工程,端口號爲8764和8765;異步

      啓動service-turbine工程,端口號爲8766。maven

      訪問http://localhost:8766/turbine.stream看到:


      訪問http://localhost:8765/hystrix,輸入監控流http://localhost:8766/turbine.stream看到:

 

      在圖中能夠看到,雖然咱們啓動了兩個service-ribbon,可是監控頁面中依然只是展現了一個監控圖。不過咱們能夠發現,圖中集羣報告區域中的Hosts屬性與以前嘗試單機監控時已有不一樣,只是由於這兩個實例是同一個服務,而對於集羣來講咱們關注的是服務集羣的高可用性,因此Turbine會將相同服務做爲總體來看待,並彙總成一個監控圖。

      固然啦,若是你真想看到兩個監控圖,能夠把service-ribbon其中的一個實例的spring.application.name設置成別的名稱,這樣運行起來後就會出現兩個不一樣的監控圖。

 

四. 與消息代理結合
      Spring Cloud在封裝Turbine的時候,還封裝了基於消息代理的收集實現。因此,咱們能夠將全部須要收集的監控信息都輸出到消息代理中,而後Turbine服務再從消息代理中異步獲取這些監控信息,最後將這些監控信息聚合並輸出到Hystrix Dashboard中。經過引入消息代理,咱們的Turbine和Hystrix Dashboard實現的監控架構能夠改爲以下圖所示的結構:


      首先新建一個Spring Boot工程,命名爲service-turbine-amqp,引入spring-cloud-starter-turbine-amqp和spring-boot-starter-actuator依賴。看到這裏只是引入這兩個依賴,由於spring-cloud-starter-turbine-amqp實際上包裝了spring-cloud-starter-turbine-stream和spring-cloud-starter-stream-rabbit。

<?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.dan</groupId> <artifactId>service-turbine-amqp</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>service-turbine-amqp</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <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>Edgware.SR1</spring-cloud.version> </properties> <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> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>      在主類中使用@EnableTurbineStream註解來啓用Turbine Stream的配置:@SpringBootApplication@EnableTurbineStream@EnableDiscoveryClientpublic class ServiceTurbineAmqpApplication { public static void main(String[] args) { SpringApplication.run(ServiceTurbineAmqpApplication.class, args); }}      接着配置application.properties文件:spring.application.name=service-turbine-amqpserver.port=8766eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka      對於Turbine的配置已經完成了,下面須要對service-ribbon作一些修改,使其監控信息可以輸出到RabbitMQ上。這個修改也很是簡單,只需在pom.xml中增長對spring-cloud-netflix-hystrix-amqp的依賴,具體以下:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-hystrix-amqp</artifactId></dependency>      完成上面的配置後,一樣啓動全部須要的工程,一樣訪問http://localhost:8765/hystrix,輸入監控流http://localhost:8766/turbine.stream,咱們能夠看到跟以前一樣的結果,只是這裏的監控信息收集是經過消息代理異步實現的。

相關文章
相關標籤/搜索