在微服務場景中,通常會有很多層的服務調(diào)用。如果一個底層服務出現(xiàn)問題,故障會被向上傳播給用戶。我們需要一種機制,當?shù)讓臃詹豢捎脮r,可以阻斷故障的傳播。這就是斷路器的作用。他是系統(tǒng)服務穩(wěn)定性的最后一重保障。
在springcloud中斷路器組件就是hystrix。hystrix也是netflix套件的一部分。他的功能是,當對某個服務的調(diào)用在一定的時間內(nèi)(默認10s,由metrics.rollingstats.timeinmilliseconds配置),有超過一定次數(shù)(默認20次,由circuitbreaker.requestvolumethreshold參數(shù)配置)并且失敗率超過一定值(默認50%,由circuitbreaker.errorthresholdpercentage配置),該服務的斷路器會打開。返回一個由開發(fā)者設定的fallback
fallback可以是另一個由hystrix保護的服務調(diào)用,也可以是固定的值。fallback也可以設計成鏈式調(diào)用,先執(zhí)行某些邏輯,再返回fallback。
如何使用
netflix斷路器是安裝在服務消費者上。我們需要做的是在服務消費者上開啟斷路器并配置。
ribbon消費者:
1,引入依賴
2,打開開關
只需要在啟動類上加上@enablecircuitbreaker注解即可
3,在服務上加上fallback
4,測試,將服務提供者關掉
過一會,再將服務提供者啟動,可以觀察到,服務消費者自動恢復。
注意,配置的fallbackmethod方法必須與被@hystrixcommand注解的方法有意向的入?yún)⒑头祷刂?/p>
否則會報錯fallback method wasn't found: defaultfallback
在feign中使用
@enablefeignclients中已經(jīng)默認打開了斷路器功能,所以這里的啟動類上不需要再加@enablecircuitbreaker注解
只需要在@feignclient中為fallback參數(shù)指定fallback方法
因為@feignclient注解的是接口,所以我們必須創(chuàng)建一個替代的類,就像mock一樣
創(chuàng)建一個實現(xiàn)了helloservice接口的類
最后一步
在配置文件application.yml中開啟斷路器
在很早的版本中,feign的斷路器默認是開啟的。后來有人提issue,認為這樣不方便。一旦使用feign就默認使用了斷路器功能,導致了一些問題。后面從d版本開始斷路器就是默認關閉的,需要手動打開。
可以看到和ribbon一樣的效果
注意事項
如果方法執(zhí)行需要用到thread local的屬性,這個屬性默認是不能傳遞到fallback方法中的,因為在hystrix中, 主要通過線程池來實現(xiàn)資源隔離. 通常在使用的時候我們會根據(jù)調(diào)用的遠程服務劃分出多個線程池. 例如調(diào)用產(chǎn)品服務的command放入a線程池, 調(diào)用賬戶服務的command放入b線程池. 這樣做的主要優(yōu)點是運行環(huán)境被隔離開了. 這樣就算調(diào)用服務的代碼存在bug或者由于其他原因?qū)е伦约核诰€程池被耗盡時, 不會對系統(tǒng)的其他服務造成影響. 但是帶來的代價就是維護多個線程池會對系統(tǒng)帶來額外的性能開銷. 如果是對性能有嚴格要求而且確信自己調(diào)用服務的客戶端代碼不會出問題的話, 可以使用hystrix的信號模式(semaphores)來隔離資源.
你需要做如下配置
hystrix dashboard
既然斷路器可以檢測到服務的可用性,但是不夠直觀。hystrix dashboard可以提供一個監(jiān)控平臺,方便查看服務的可用性。
1,新建一個工程
因為dashboard是一個統(tǒng)一的斷路器監(jiān)控平臺,所以我們新建一個項目。不和現(xiàn)在服務消費者混在一起
2,引入依賴
3,注解啟動類
用@enablehystrixdashboard注解啟動類
啟動引用,訪問/hystrix
看上面的說明,我們可以知道,hystrix dashboard共支持三種不同的監(jiān)控方式
1,默認的集群監(jiān)控:通過url:turbine-hostname:port/turbine.stream開啟,實現(xiàn)對默認集群的監(jiān)控。
2,指定的集群監(jiān)控:通過url:turbine-hostname:port/turbine.stream?cluster=[clustername]開啟,實現(xiàn)對clustername集群的監(jiān)控。
3,單體應用的監(jiān)控:通過url/hystrix-app:port/hystrix.stream開啟,實現(xiàn)對具體某個服務實例的監(jiān)控。
注意,這里有點問題,我們以前說過,從springboot2開始,actuator都是要在請求路徑加上/actuator,也就是hystrix-app:port/actuator/hystrix.stream才對
delay:控制服務器上輪詢監(jiān)控信息的延遲時間,默認為2000毫秒,可以通過配置該屬性來降低客戶端的網(wǎng)絡和cpu消耗。
title:該參數(shù)可以展示合適的標題。
監(jiān)控單個實例的服務
我們先測試第3個,監(jiān)控單個實例的服務。這個最好理解
對于robbon工程,在上面我們已經(jīng)加好了斷路器。現(xiàn)在需要做的是引入actuator依賴
然后暴露hystrix.stream接口
啟動應用。
現(xiàn)在我把windows10.microdone.cn:8781/actuator/hystrix.stream的服務填上,點擊monitor
多點擊幾次請求,可以看到請求的成功失敗情況被監(jiān)控起來了
對于feign
我們上面講過,feign自己已經(jīng)集成了斷路器。但是如果要暴露hystrix.stream接口,還是必須引入spring-cloud-starter-netflix-hystrix依賴,在啟動類上打上@enablecircuitbreaker注解注解
然后測試,和ribbon一樣的效果
turbine
turbine又是個什么概念?
turbine是netflix的一個獨立項目,單獨的一個springcloud實例的斷路器數(shù)據(jù)用處并不大,而且很麻煩,像上面我們有兩個消費者項目,就需要開兩個頁面查看,能不能把這些監(jiān)控都聚合在以前看呢?
當然是可以的,所以才有了這個turbine項目
turbine的原理是,通過將將自己注冊到注冊中心,發(fā)現(xiàn)同一個注冊中心上的hystrix服務,然后聚合數(shù)據(jù)。再通過暴露自己的端點,在儀表盤上進行展示。
操作:
1,創(chuàng)建一個應用
2,引入依賴:
啟動類注解:
@enableturbine
@enablediscoveryclient
yml配置:
啟動,我們現(xiàn)在8792端口起來了turbine
在到hystrix頁面,在監(jiān)控地址填127.0.0.1:8792/turbine.stream
點擊monitor
可以看到已經(jīng)將feign和ribbon兩個工程的消費者集合在了一起
服務名helloservice#hello(string)和hiservice 是被hystrix fallback的方法名
關于default
cluster-name-expression集群名字,可以是spel表達式,這里用的是默認的default。如果想自定義集群的名字,改為如下配置:
turbine:
# 要監(jiān)控的應用,多個用逗號隔開
app-config: feign-consumer,ribbon-consumer
# 指定聚合哪些集群,多個使用","分割,默認為default
aggregator:
cluster-config: ribbon,feign
# 配合被監(jiān)控的應用使用。假設想要監(jiān)控的應用配置了eureka.instance.metadata-map.cluster: abc,則需要配置,同時turbine.aggregator.clusterconfig: abc
cluster-name-expression: metadata['cluster']
# 讓同一主機上的服務通過主機名與端口號的組合來進行區(qū)分,默認情況下會以host來區(qū)分不同的服務,這會使得在本機調(diào)試的時候,本機上的不同服務聚合成一個服務來統(tǒng)計。
combine-host-port: true
這個配置是用了兩個集群,ribbon和feign
cluster-name-expression配的是取元數(shù)據(jù)的cluster值
這個就需要對應去修改被監(jiān)控應用的配置文件了,
ribbon消費者工程:
feign消費者工程:
全部重啟一下
再去hystrix頁面
這個時候再用 127.0.0.1:8792/turbine.stream是連不上的,因為集群名字已經(jīng)變了,不再有default集群了
分別用127.0.0.1:8792/turbine.stream?cluster=feign和ribbon去監(jiān)控
以上是網(wǎng)絡信息轉(zhuǎn)載,信息真實性自行斟酌。