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


一、前言


Dashboard又稱為儀表盤,是用來監控項目的執行情況的,本文旨在Dashboard的使用
分別為單體監控、集群監控、與消息代理結合。
代碼請戳我的github

二、快速入門


新建一個SpringBoot項目起名為HystrixDashboard

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>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注解

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

spring:
  application:
    name: hystrix-dashboard

server:
  port: 2001

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

DashBoard不用注冊到注冊中心的,只需要被監控 服務做一些配置即可

三、單體應用的監控(這里以RibbonConsumHystrix為例)


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

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

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

四、Turebine 集群監控


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

這一節我們使用/turbine.stream對集群進行監控,這里我們需要引入Turbine,通過它來匯集監控信息,並將信息提供給Hystrix Dashboard來集中展示

1、構建監控聚合服務

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

現在我們測試一下:

1、分別啟動 注冊中心、服務提供者

2、maven 打包RibbonConsumHystrix,指定一個端口是8089啟動,一個用默認啟動,注意,RibbonCustomHystrix項目中我有其他用於測試的main方法,打包會失敗,所以先注釋掉UserCommand的main方法,打包之后執行代碼

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

3、啟動RibbonConsumHystrix項目

4、接着啟動Turbine、儀表盤

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

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

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

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

如果只請求一個端口,而另一個沒有被請求,那么會只顯示Hosts:1

五、與消息代理結合

Spring Cloud 在封裝Turbine的同時也封裝了基於消息代理的收集實現。所以我們可以通過將所有需要收集的監控消息都輸出到消息代理中,然后Turbine 服務再從消息代理中異步獲取這些監控信息,最后將信息交給Hystrix Dashboard中做展示。如圖

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

1、安裝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基本上我們就已經配好了,開始正菜

2、創建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

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

3、測試

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

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

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

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

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

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

六、總結


通過本文的學習,我們可以知道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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM