SpringCloud (十) Hystrix Dashboard單體監控、集羣監控、與消息代理結合

1、前言


Dashboard又稱爲儀表盤,是用來監控項目的執行狀況的,本文旨在Dashboard的使用
分別爲單體監控、集羣監控、與消息代理結合。
代碼請戳個人githubhtml

2、快速入門


新建一個SpringBoot項目起名爲HystrixDashboardjava

pom文件:git

<?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註解github

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,只需指定應用名和端口號2001web

spring:
  application:
    name: hystrix-dashboard

server:
  port: 2001

啓動項目,在地址欄上輸入http://localhost:2001/hystrixspring

DashBoard不用註冊到註冊中心的,只須要被監控 服務作一些配置便可express

3、單體應用的監控(這裏以RibbonConsumHystrix爲例)


單體應用是說咱們一個服務只有一個實例,Dashboard經過這個實例暴露的監控信息,將這些信息展現出來,如圖apache

在被監控的服務pom.xml中添加windows

<!--暴露各類指標-->
        <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線,經過它的上升和降低來觀察即時流量變化

4、Turebine 集羣監控


在上一節咱們對Hystrix儀表盤進行了快速入門,使用的是單個實例監控的/hystrix.stream節點

這一節咱們使用/turbine.stream對集羣進行監控,這裏咱們須要引入Turbine,經過它來聚集監控信息,並將信息提供給Hystrix Dashboard來集中展現

一、構建監控聚合服務

新建一個標準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名稱,從而更清晰的區分各個集羣

如今咱們測試一下:

一、分別啓動 註冊中心、服務提供者

二、maven 打包RibbonConsumHystrix,指定一個端口是8089啓動,一個用默認啓動,注意,RibbonCustomHystrix項目中我有其餘用於測試的main方法,打包會失敗,因此先註釋掉UserCommand的main方法,打包以後執行代碼

java -jar RibbonConsumHystrix-1.0-SNAPSHOT.jar --server.port=8089

三、啓動RibbonConsumHystrix項目

四、接着啓動Turbine、儀表盤

五、在地址欄輸入並訪問 http://localhost:2001/hystrix

六、在Hystrix Dashboard下方的地址欄輸入http://localhost:8989/turbine.stream,點擊Monitor Stream

七、使用postman對兩個端口8088和8089分別進行請求

這裏說明一下,若是是沒有對這兩個端口發送請求, http://localhost:8989/turbine.stream 這裏會一直在loading,

若是隻請求一個端口,而另外一個沒有被請求,那麼會只顯示Hosts:1

5、與消息代理結合

Spring Cloud 在封裝Turbine的同時也封裝了基於消息代理的收集實現。因此咱們能夠經過將全部須要收集的監控消息都輸出到消息代理中,而後Turbine 服務再從消息代理中異步獲取這些監控信息,最後將信息交給Hystrix Dashboard中作展現。如圖

使用這個架構以前,咱們須要先安裝好RabbitMQ,這裏先說一下本文的簡單配置,使RabbitMQ可用,其實不只可使用RabbitMQ,只要實現了AMQP的消息代理,理論上均可以結合Turbine使用

一、安裝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,此時默認是直接註冊到系統服務的

安裝完成菜單欄會有這樣的顯示

img

查看服務,服務已經正常啓動

img

推薦使用 img 來進行操做,安裝在默認的位置的話,打開這個直接就在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,點擊查看個人解決辦法

img

還沒完,接着輸入rabbitmq-plugins enable rabbitmq_management,來開啓 web管理插件

打開瀏覽器,地址欄輸入http://localhost:15672/

帳號密碼 默認都是guest ,對於使用其餘帳號登陸請參考其餘文章,這裏僅爲此實驗可用

這樣RabbitMQ Server基本上咱們就已經配好了,開始正菜

二、建立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

項目 在這裏就搭建完成了開始測試

三、測試

分別按順序啓動 註冊中心、服務提供者、RibbonConsumHystrix、TurbineAmqp、Dashboard

地址欄訪問:http://localhost:2001/hystrix

在Hystrix Dashboard字樣下的輸入框,輸入http://localhost:8989/turbine.stream,點擊Monitor

postman 屢次訪問帶Hystrix的接口,會出現如圖

http://localhost:15672/#/頁面中也會有一些指標顯示

雖然看起來和直接使用Turbine來聚合監控信息,沒什麼區別,其實只是這種整合消息代理的方式是異步的。

6、總結


經過本文的學習,咱們能夠知道Dashboard的做用和用法,各個參數的意義,單體監控/hystrix.stream,集羣可用Turbine的/turbine.stream,還有關於Turbine與消息代理做整合的使用方法。

有了Dashboard這種神器,咱們就能夠即時地瞭解服務中Hystrix熔斷器的工做狀況和健康狀況,從而對服務做針對性調整。

說點題外話,總有朋友問我:這就完了?

是啊,的確寫完了,可是有個問題就是,我寫這些文章中出現的問題與解決的辦法是什麼,看了文章你會有所瞭解

可是

  • 爲何這麼作?
  • 這些答案是在哪裏找到的?
  • 最後的解決方案是怎麼想到的?

這些都是單單看個樂呵所不能體會的,看起來簡單的東西不必定就能作得好,因此在這裏推薦你們動手操做,你能夠建立兩個workspace,一個放本身的代碼,另外一個放個人代碼,對比着學習,我想這樣你會有更多的收穫。

​ 最後碼字不易,若是本文對你有所幫助,還請你們點個推薦,評論一下:)

####本文引用

《Spring Cloud 微服務實戰》 翟永超

windows下安裝rabbitmq的步驟詳解

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

相關文章
相關標籤/搜索