何爲熔斷器
熔斷器(fuse)是指當電流超過規定值時,以本身產生的熱量使熔體熔斷,斷開電路的一種電器。如果一段時間內監測到由於服務器壓力過大導致內部資源耗盡,請求堆積是的服務徹底不可用,還會導致依賴該過載服務器的其他服務請求堆積,造成雪崩效應,致使整個系統出現大面積癱瘓。熔斷器會在發現部分報錯行爲後及時隔離掉出問題服務的訪問,避免雪崩效應產生,熔斷器同時可以使程序能夠診斷錯誤是否已經修正,修正後會嘗試啓用服務,從而提高分佈式系統的彈性。
Hystrix作用
在SpringCloud分佈式服務中,Hystrix就充當着熔斷器的作用,在高併發的情況下,單個服務的延遲會導致整個請求都處於延遲狀態,可能在幾秒鐘就使整個服務處於線程負載飽和的狀態。
- 防止單個服務的故障耗盡整個服務的Servlet容器的線程資源
- 快速失敗機制,服務出了故障,調用該服務的請求失敗
- 可以設置fallback,在請求發生故障時,提供設定好的回退方案
- 使用熔斷機制,防止故障擴散到其他服務
- 提供監控組件,可以實時查看熔斷的狀態
斷路機制
Hystrix Command請求後端服務失敗數量超過一定比例(默認爲50%),斷路器會切換到開路狀態(Open)。這時所有請求會直接失敗而不會發送到後端服務。斷路器保持在開路狀態一段時間後(默認爲5秒),自動切換到半開路狀態(HALF-OPEN)。這時會判斷下一次請求的返回情況,如果請求成功,斷路器切回閉路狀態(CLOSED),否則重新切換到開路狀態(OPEN)。
fallback
降級處理,對於查詢操作,我們可以實現一個fallback方法,當請求後端服務出現異常的時候,可以使用fallback方法返回的值。
資源隔離
在Hystrix中,主要通過線程池來實現資源隔離。通常在使用的時候我們會根據調用的遠程服務劃分出多個線程池,維護多個線程池會對系統帶來額外的性能開銷。如果是對性能有嚴格要求而且確信自己調用服務的客戶端代碼不會出問題,就可以使用Hystrix的信號模式(Semaphores)來隔離資源。
Hystrix使用
在RestTemplate和Ribbon上使用
添加依賴:
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix:2.2.2.RELEASE'
ps:feign集成了hystrix,如果使用feign的話不需要再添加該依賴
啓動類,添加@EnableHystrix
啓用Hystrix
修改服務代碼,添加@HystrixCommand
註解啓動Hystrix熔斷功能,fallbackMethod爲處理回退(fallback)邏輯的方法,本例中指向了callError方法:
斷掉一個provider的服務,訪問服務出現熔斷:
在Feign上使用熔斷器
Feign中整合了hystrix,不需要添加依賴,只需要在配置文件重將hystrix功能開啓即可:
feign:
hystrix:
enabled: true
創建一個回調類,實現ProviderService的接口:
@Component
public class ProviderHystrix implements ProviderService {
@RequestMapping("hello")
public String hello() {
return "<h1>So Sorry, Error</h1>";
}
}
對ProviderService藉口進行修改,添加fallback:
@FeignClient(name = "consul-provider", fallback = ProviderHystrix.class)
public interface ProviderService {
@RequestMapping("hello")
String hello();
}
停掉一個provider,端口8702的那個:
這時刷新服務會觸發fallback:
這時我們重現啓動服務:
刷新網頁發現又可以訪問了,說明hystrix起作用了
Hystrix Dashboard使用
在微服務架構中,爲了保證服務實例的可用性,防止服務實例出現故障導致線程阻塞,而出現了熔斷器模型。熔斷器的狀況反映了一個程序的可用性和健壯性,是一個重要指標。Hystrix Dashboard是監控Hystrix的熔斷器狀況的一個組件,提供了數據監控和友好的圖形化展示界面
創建新項目consul-hystrix
依賴如下:
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery:2.2.2.RELEASE'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix-dashboard:2.2.2.RELEASE'
配置文件:
server:
port: 8720
spring:
application:
name: consul-hystrix
cloud:
consul:
host: localhost
port: 8500
discovery:
prefer-ip-address: true
service-name: ${spring.application.name}
啓動類添加註解:
啓動consul-hystrix項目,訪問http://localhost:8720/hystrix
出現如下頁面:
修改consul-consumer項目
添加依賴:
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix-dashboard:2.2.2.RELEASE'
啓動類添加相應註解@EnableHystrixDashboard
啓動之後,在Dashboard網頁上輸入http://localhost:8710/actuator/hystrix.stream
之後點擊Monitor Stream
之後進入監控界面:
指標對應含義:
- 圓圈:它是代表流量的大小和流量的健康,有綠色、黃色、橙色、紅色這幾個顏色,通過這些顏色的標識,可以快速發現故障、具體的實例、請求壓力等。
- 曲線:它代表2分鐘內流量的變化,可以根據它發現流程的浮動趨勢
- Host&Cluster:代表機器和集羣的請求頻率。
- Circuit:斷路器狀態,open/closed。
- Hosts&Median&Mean&:集羣下的報告,百分位延遲數。
- Thread Pools:線程池的指標,核心線程池指標,隊列大小等。
Hystrix Dashboard共支持以下3種不同的監控方式:
- 單體Hystrix消費者:通過URL
http://hystrix-app:port/actuator/hystrix.stream
開啓,實現對具體某個服務實例的監控。 - 默認集羣監控:通過URL
http://turbine-hostname:port/turbine.stream
開啓,實現對默認集羣的監控。 - 自定集羣監控:通過URL
http://turbine-hostname:port/turbine.stream?cluster=[clusterName]
開啓,實現對clusterName集羣的監控。
我們嘗試刷新http://localhost:8710/feign
模擬訪問,圖像隨訪問產生變化:
Turbine
使用Hystrix Dashboard可以看到單個應用內的服務信息。顯然這是不夠的,我們還需要一個工具能讓我們彙總系統內多個服務的數據並顯示到Hystrix Dashboard上,這個工具就是Turbine。
添加依賴:
implementation ('org.springframework.cloud:spring-cloud-starter-netflix-turbine:2.2.2.RELEASE') {
exclude group: 'org.springframework.cloud', module: 'spring-cloud-starter-netflix-eureka-client'
}
主類添加@EnableTurbine
註解
配置更改如下:
server:
port: 8720
spring:
application:
name: consul-hystrix
cloud:
consul:
host: localhost
port: 8500
discovery:
prefer-ip-address: true
service-name: ${spring.application.name}
turbine:
app-config: consul-consumer # 指定收集信息的服務名稱 多個 用 , 隔開
combine-host-port: true # 默認爲false ,服務以host區分, true 以 host + port 進行區分
cluster-name-expression: "'default'" # 設置集羣名稱, default爲默認集羣,多個集羣通過這個配置區分
啓動訪問http://localhost:8720/turbine.stream
,顯式如下: