1. 程式人生 > >微服務架構--SpringCloud(7)

微服務架構--SpringCloud(7)

Hystrix

*斷路器、熔斷器 Hystrix   避免單口呼叫導致全域性宕掉

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

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

*分散式系統面臨的問題:

*複雜分散式體系結構中的應用程式有數十個依賴關係,每個依賴關係在某些時候將不可避免地失敗.

*服務雪崩:

*多個為服務之間呼叫的時候,假設微服務A呼叫微服務B和微服務C,微服務B和微服務C又呼叫其它的微服務,這就是所謂的“扇出”。如果扇出的鏈路上某個微服務的呼叫時間過長或者不可用,對微服務A的呼叫就會佔用越來越多的系統資源,進而引起系統崩潰,所謂的“雪崩效應”。

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

*Hystrix的功能:

*服務降級

*服務熔斷

*服務限流

*接近實時的監控

*。。。

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

*服務熔斷:

*熔斷機制是應對雪崩效應的一種微服務鏈路保護機制

*當扇出鏈路的某個微服務不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的應用,快速返回“錯誤”的響應資訊。當檢測到該節點微服務呼叫響應正常後恢復呼叫鏈路。在SpringCloud框架裡熔斷機制通過Hystrix實現。Hystrix會監控微服務間調呼叫的狀況,當失敗的呼叫到一定閾值,預設是5秒內20次呼叫失敗就會啟動熔斷機制

。熔斷機制的註解是@HystrixCommand。

1.新建microservicecloud-provider-dept-hystrix-8001

2.複製8001工程

3.修改pom 新增

<!-- hystrix -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-hystrix</artifactId>

</dependency>

4.修改yml

service-url:

defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

# 單機版 defaultZone : http://localhost:7001/eureka

instance:

instance-id: microservicecloud-provider-dept-hystrix-8001

prefer-ip-address: true #訪問路徑可以顯示IP地址

5.修改DeptController

@RestController

public class DeptController {

@Autowired

private DeptService deptService = null;

@RequestMapping(value = "/dept/get/{id}",method = RequestMethod.GET)

//一旦呼叫服務方法失敗並丟擲了錯誤資訊後,會自動呼叫@HystrixCommand標註好的fallbackMethod呼叫類中的指定方法

@HystrixCommand(fallbackMethod = "processHystrix_Get")

public Dept get(@PathVariable("id") Long id){

Dept dept = this.deptService.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 + "沒有對應的資訊," +

"[email protected]").setDb_source("no this database in MySQL");

}

}

*6.修改主啟動類 加上

@EnableCircuitBreaker //對hystrix熔斷機制的支援

*服務降級:

*整體資源容量不足,忍痛將某些服務先關閉掉,待度過難關,再開啟

*服務降級處理是在客戶端實現完成的,與服務端沒有關係

*不想讓HystrixCommand一個方法新增一個,要實現解耦,用Spring的面向切面程式設計的置入+異常通知,避免程式碼膨脹、業務邏輯和異常處理分離

*1.新建DeptClientServiceFallbackFactory類 實現FallbackFactory<DeptClientService>介面

*為了與主程式Controller解耦,在介面層進行服務的降級處理

*千萬不要忘記在類上面新增@Component註解*

*2.編寫DeptClientServiceFallbackFactory類

@Component

public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {

@Override

public DeptClientService create(Throwable throwable) {

return new DeptClientService() {

@Override

public boolean add(Dept dept) {

return false;

}

@Override

public Dept get(Long id) {

return new Dept().setDeptno(id).setDname("該ID:" + id + "沒有對應的資訊," +

"Consumer客戶端提供的降級資訊,此刻服務Provider已經關閉"

).setDb_source("no this database in MySQL");

}

@Override

public List<Dept> list() {

return null;

}

};

}

}

*3.修改DeptClientService 註解替換為

@FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory = DeptClientServiceFallbackFactory.class)

*4.clean+install專案api

*5.修改microservicecloud-consumer-dept-feign的yml

feign: #供api中@FeignClient使用

hystrix:

enabled: true

*服務降級熔斷總結:

*服務熔斷:一般是某個服務故障或者異常引起,類似現實世界中的“保險絲”,當某個異常條件被觸發,直接熔斷整個服務,而不是一直等到此服務超時。

*將分散的fallback方法,集中起來,統一放到一個接口裡面

*如遇異常問題,就找負責fallback的類,統一管理

*服務降級:

*所謂降級,一般是從整體負荷考慮。就是當某個服務熔斷之後,伺服器將不再被呼叫,此時客戶端可以自己準備一個本地的fallback回撥,返回一個預設值。這樣做,雖然服務水平下降,但好歹可用。比直接掛掉要強。

*重要的事情多說幾遍:服務降級處理實在客戶端實現完成的,與服務端沒有關係。

*服務監控hystrixDashboard 豪豬

*除了隔離依賴服務的呼叫以外,Hystrix還提供了準實時的呼叫監控(Hystrix Dashboard),Hystrix會持續地記錄所有通過Hystrix發起的請求的執行資訊,並以統計報表和圖形的形式展示給使用者,包括每秒執行多少請求多少成功,多少失敗等。Netflix通過hystrix-metrics-event-stream專案實現了對以上指標的監控。Spring Cloud也提供了Hystrix Dashboard的整合,對監控內容轉換成視覺化介面。

所有Provider依賴配置

<!-- 主管監控和資訊配置 監控資訊完善 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

1.Delay:該引數用來控制伺服器上輪詢監控資訊的延遲時間,預設為2000毫秒,可以通過配置該屬性來降低客戶端的網路和CPU消耗。

2.Title:該引數對應了頭部標題Hystrix Stream之後的內容,預設會使用具體監控例項的URL,可以通過配置該資訊來展示合適的標題。

*實心圓:共有兩種含義。它通過顏色的變化代表了例項的健康程度,它的健康度從綠色<黃色<橙色<紅色遞減。該實心圓除了顏色的變化之外,它的大小也會根據例項的請求流量發生變化,流量越大該實心圓就越大。所以通過該實心圓的展示,就可以在大量的例項中快速的發現故障例項和高壓力例項