六、SpringCloud——Hystrix斷路器(熔斷、降級、hystrixDashboard監控)

1 Hystrix簡介

1)背景
分佈式系統面臨的問題
複雜分佈式體系結構中的應用程序有數十個依賴關係,每個依賴關係在某些時候將不可避免地失敗。
在這裏插入圖片描述
服務雪崩
多個微服務之間調用的時候,假設微服務A調用微服務B和微服務C,微服務B和微服務C又調用其它的微服務,這就是所謂的“扇出”。如果扇出的鏈路上某個微服務的調用響應時間過長或者不可用,對微服務A的調用就會佔用越來越多的系統資源,進而引起系統崩潰,所謂的“雪崩效應”.

對於高流量的應用來說,單一的後端依賴可能會導致所有服務器上的所有資源都在幾秒鐘內飽和。比失敗更糟糕的是,這些應用程序還可能導致服務之間的延遲增加,備份隊列,線程和其他系統資源緊張,導致整個系統發生更多的級聯故障。這些都表示需要對故障和延遲進行隔離和管理,以便單個依賴關係的失敗,不能取消整個應用程序或系統。

2)Hystrix 是什麼
Hystrix是一個用於處理分佈式系統的延遲和容錯的開源庫,在分佈式系統裏,許多依賴不可避免的會調用失敗,比如超時、異常等,Hystrix能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,避免級聯故障,以提高分佈式系統的彈性。

“斷路器”本身是一種開關裝置,當某個服務單元發生故障之後,通過斷路器的故障監控(類似熔斷保險絲),向調用方返回一個符合預期的、可處理的備選響應(FallBack),而不是長時間的等待或者拋出調用方無法處理的異常,這樣就保證了服務調用方的線程不會被長時間、不必要地佔用,從而避免了故障在分佈式系統中的蔓延,乃至雪崩。

3)能幹嘛
服務降級
服務熔斷
服務限流
接近實時的監控
。。。

官網資料https://github.com/Netflix/Hystrix/wiki/How-To-Use

2 Hystrix服務熔斷 Demo
服務熔斷
熔斷機制是應對雪崩效應的一種微服務鏈路保護機制。
==當扇出鏈路的某個微服務不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速返回"錯誤"的響應信息。當檢測到該節點微服務調用響應正常後恢復調用鏈路。==在SpringCloud框架裏熔斷機制通過Hystrix實現。Hystrix會監控微服務間調用的狀況,當失敗的調用到一定閾值,缺省是5秒內20次調用失敗就會啓動熔斷機制。熔斷機制的註解是@HystrixCommand。

承接https://mp.csdn.net/mdeditor/96334784#

參考microservicecloud-provider-8001

1)新建microservicecloud-provider-dept-hystrix-8001,拷貝代碼,配置,pom依賴

2)編輯pom.xml 新增依賴,推薦使用spring-cloud-starter-netflix-hystrix
在這裏插入圖片描述

  <!--  hystrix -->
   <dependency>
     <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
   </dependency>

3)修改配置文件中的實例ID

eureka.instance.instance-id=microservicecloud-dept8001-hystrix

4)修改DeptController

@RestController
public class DeptController
{
  @Autowired
  private DeptService service = null;
  
  @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
    @HystrixCommand(fallbackMethod = "processHystrix_Get")
  public Dept get(@PathVariable("id") Long id)
  {
   Dept dept =  this.service.get(id);
   if(null == dept)
   {
     throw new RuntimeException("該ID:"+id+"沒有沒有對應的信息");
   }
   return dept;
  }
  
  public Dept processHystrix_Get(@PathVariable("id") Long id)
  {
   return new Dept().setDeptno(id)
           .setDname("該ID:"+id+"沒有沒有對應的信息,null--@HystrixCommand")
           .setDb_source("no this database in MySQL");
  }
}

在這裏插入圖片描述
@HystrixCommand報異常後如何處理?
一旦調用服務方法失敗並拋出了錯誤信息後,會自動調用@HystrixCommand標註好的fallbackMethod調用類中的指定方法

5)修改主啓動類DeptProvider8001_Hystrix_App並添加新註解@EnableCircuitBreaker

@EnableCircuitBreaker//對hystrixR熔斷機制的支持
@SpringBootApplication
@EnableEurekaClient
public class DeptProvider8001_Hystrix {
    public static void main(String[] args)
    {
        SpringApplication.run(DeptProvider8001_Hystrix.class, args);
    }
}

6)測試
啓動3個eureka集羣
主啓動類DeptProvider8001_Hystrix_App
Consumer啓動microservicecloud-consumer-dept-80
http://localhost/consumer/dept/get/112

服務熔斷@HystrixCommand標註好的fallbackMethod調用類中的指定方法的缺點
方法膨脹:每個方法都fallbackMethod一個新方法,方法增多一倍
耦合:異常處理與業務耦合在一起

3 Hystrix服務降級 Demo

服務降級是什麼
整體資源快不夠了,忍痛將某些服務先關掉,待渡過難關,再開啓回來。
服務降級處理是在客戶端實現完成的,與服務端沒有關係

1)修改microservicecloud-api工程,
根據已經有的DeptClientService接口新建一個實現了
FallbackFactory接口的類DeptClientServiceFallbackFactory

2)修改microservicecloud-api工程,DeptClientService接口在註解@FeignClient中添加fallbackFactory屬性值

3)microservicecloud-api工程 mvn clean install

  1. microservicecloud-consumer-dept-feign工程修改YML,添加如下配置
feign.hystrix.enabled=true
  1. 測試
    3個eureka先啓動
    微服務microservicecloud-provider-dept-8001啓動
    microservicecloud-consumer-dept-feign啓動
    正常訪問測試http://localhost/consumer/dept/get/1
    故意關閉微服務microservicecloud-provider-dept-8001
    客戶端自己調用提示

此時服務端provider已經down了,但是我們做了服務降級處理,讓客戶端在服務端不可用時也會獲得提示信息而不會掛起耗死服務器
在這裏插入圖片描述

4 服務監控hystrixDashboard

1)hystrixDashboard概述
除了隔離依賴服務的調用以外,Hystrix還提供了準實時的調用監控(Hystrix Dashboard),Hystrix會持續地記錄所有通過Hystrix發起的請求的執行信息,並以統計報表和圖形的形式展示給用戶,包括每秒執行多少請求多少成功,多少失敗等。Netflix通過hystrix-metrics-event-stream項目實現了對以上指標的監控。Spring Cloud也提供了Hystrix Dashboard的整合,對監控內容轉化成可視化界面。

2)hystrixDashboard Demo
a)新建工程microservicecloud-consumer-hystrix-dashboard maven moudle

b) pom.xml,添加如下依賴

 <dependencies>
        <dependency><!-- 引入自己定義的api通用包,可以使用Dept部門Entity -->
            <groupId>com.tang</groupId>
            <artifactId>micro-service-cloud-api</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 修改後立即生效,熱部署 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <!-- Ribbon相關 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <!-- feign相關 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
        <!-- hystrix和 hystrix-dashboard相關-->
        <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>
    </dependencies>

c)主啓動類改名+新註解@EnableHystrixDashboard

@SpringBootApplication
@EnableHystrixDashboard
public class DeptConsumer_DashBoard
{
    public static void main(String[] args)
    {
        SpringApplication.run(DeptConsumer_DashBoard.class,args);
    }
}

d )所有Provider微服務提供類(8001/8002/8003)都需要監控依賴配置,添加如下依賴配置

  <!-- actuator監控信息完善 -->
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>

e )啓動microservicecloud-consumer-hystrix-dashboard該微服務監控消費端
http://localhost:9001/hystrix
在這裏插入圖片描述

f )啓動3個eureka集羣

g )啓動microservicecloud-provider-dept-hystrix-8001
http://localhost:8001/dept/get/1
http://localhost:8001/hystrix.stream
在這裏插入圖片描述

h)啓動的相關微服務工程

i)監控測試
多次刷新http://localhost:8001/dept/get/1

觀察監控窗口
(1)填寫監控地址
在這裏插入圖片描述

(2)監控結果

在這裏插入圖片描述

(3)
在這裏插入圖片描述
7色
7種顏色一一對應訪問結果
在這裏插入圖片描述
1圈
實心圓:共有兩種含義。它通過顏色的變化代表了實例的健康程度,它的健康度從綠色<黃色<橙色<紅色遞減。
該實心圓除了顏色的變化之外,它的大小也會根據實例的請求流量發生變化,流量越大該實心圓就越大。所以通過該實心圓的展示,就可以在大量的實例中快速的發現故障實例和高壓力實例。

1線
曲線:用來記錄2分鐘內流量的相對變化,可以通過它來觀察到流量的上升和下降趨勢。

多個微服務監控
在這裏插入圖片描述

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