SpringCloud內建Hystrix
之前在SpringCLoud了解的部落格簡單介紹了Hystrix,現在就來詳細介紹一下,順帶編寫一個demo。
為了防止雪崩現象(一個系統中的錯誤導緻系統大面積不可用),是以要讓請求在發生錯誤時仍然可以維持後續的步驟,就是讓操作降級,或者後續再處理。總之就是要維持後續的步驟,讓系統在發生錯誤的情況下仍然可用。(這個感覺需要和業務緊密連接配接,雖然元件可以達到高可用,但是業務上的後續處理還是需要自己編寫相關的業務代碼的。)
Hystrix的原理。
- 防止任何單個依賴項耗盡所有容器(例如Tomcat)使用者線程。
- 減少負載并快速失敗,而不是排隊。
- 在可行的情況下提供備用,以保護使用者免受故障的影響。
- 使用隔離技術(例如如 bulkhead, swimlane, 和 circuit breaker 模式)來限制任何一種依賴關系的影響。
- 通過近實時名額,監視和警報優化發現時間。
- 通過在Hystrix的大多數方面中以低延遲傳播配置更改來優化恢複時間,并支援動态屬性更改,這使您可以通過低延遲回報回路進行實時操作修改。
- 防止整個依賴性用戶端執行失敗,而不僅僅是網絡流量失敗。
為了實作這些目标,Hystrix也做了一些處理。
- 将對外部系統(或“依賴關系”)的所有調用包裝在通常在單獨線程中執行的
或
HystrixCommand
對象中(這是指令模式的示例)。
HystrixObservableCommand
- 逾時呼叫花費的時間超過您定義的門檻值。有一個預設的,而是由“屬性”,使它們比測量的99.5略高的方式對大多數依賴你自定義設定這些逾時個百分點每個依存性的性能。
- 為每個依賴項維護一個小的線程池(或信号燈);如果已滿,發往該依賴項的請求将立即被拒絕,而不是排隊。
- 測量成功,失敗(用戶端抛出的異常),逾時和線程拒絕。
- 如果某個服務的錯誤百分比超過門檻值,則使斷路器跳閘,以在一段時間内手動或自動停止所有對特定服務的請求。
- 當請求失敗,被拒絕,逾時或短路時執行回退邏輯。
- 幾乎實時監控名額和配置更改。
上面都是翻譯自Hystrix的GitHub頁面,找了一圈,沒有找到官網,隻找到這個GitHub頁面,上面也有一些文檔。GitHub位址如下:
https://github.com/Netflix/hystrix/wiki
然後就是一些圖檔,關于服務的正常調用和異常調用。
正常的服務之間的調用

異常的服務之間的調用
一個服務的節點阻塞,導緻阻塞使用者的整個請求,最後産生雪崩現象。
Hystrix之間的調用
還是那句話,有能力的最好直接看官網文檔,比較詳細而且比較全。
介紹完了大緻的原理,下面就開始撸代碼。
因為feign預設內建了Hystrix,是以這裡和上一節的Ribbon都不需要添加新的依賴。直接就可以編寫。需要修改的地方有三個,一個是在feign接口代碼添加一個回調類,還有就是建立一個回調類,寫一些業務邏輯代碼。最後就是在配置檔案中開啟Hystrix,因為feign預設不開啟。
接口代碼修改如下:
package com.psq.eurekaclient.feign;
import com.psq.eurekaclient.hystrix.UserHystrix;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
* UserFeign.java
* Description: User的feign
*
* @author Peng Shiquan
* @date 2020/6/16
*/
@FeignClient(name = "provider-mysql", fallback = UserHystrix.class)
public interface UserFeign {
/**
* Description: 查詢list中的id所對應的使用者資訊
*
* @param ids
* @return java.lang.String
* @Author: Peng Shiquan
* @Date: 2020/6/16
*/
@GetMapping("/user/")
String selectUserByID(@RequestParam List<String> ids);
}
回調類代碼如下:
package com.psq.eurekaclient.hystrix;
import com.psq.eurekaclient.feign.UserFeign;
import java.util.List;
/**
* UserHystrix.java
* Description: UserFeign的回調類
*
* @author Peng Shiquan
* @date 2020/7/4
*/
public class UserHystrix implements UserFeign {
/**
* Description: 查詢的回調方法,裡面可以放一些異常後處理機制
*
* @param ids
* @return java.lang.String
* @Author: Peng Shiquan
* @Date: 2020/7/4
*/
@Override
public String selectUserByID(List<String> ids) {
return "調用異常,但是可以繼續往下執行";
}
}
配置代碼如下:
#################################### common config : ####################################
spring:
application:
name: eureka-client
server:
port: 8081
#eureka注冊中心的配置
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8080/eureka
instance:
prefer-ip-address: true
#日志的級别
logging:
level:
com.psq.eurekaclient.feign.UserFeign: debug
#feign預設不開啟Hystrix,需要配置開啟
feign:
hystrix:
enabled: true
關閉生産者前的調用截圖如下:
關閉生産者後的調用截圖如下:
以上就是簡單的調用,說了這麼多,這些元件都是為了保證服務的高可用,但是寫下來後發現,企業裡面要保證高可用隻有這些事不夠的,需要結合自己公司的情況做對應的修改,有可能需要對這些元件的源碼修。還是之前說的,公司的實力不夠還是不要搞微服務了,很坑。
上面簡單的調用沒有什麼技術點,後面還是需要看看源碼或者分析具體的原理。但是現在顯然短短一篇部落格是不可能的了,這些都可以算到後面的債。
就這樣吧,結束。