Hystrix
斷路器機(jī)制
斷路器很好理解, 當(dāng)Hystrix Command請求后端服務(wù)失敗數(shù)量超過一定比例(默認(rèn)50%), 斷路器會切換到開路狀態(tài)(Open)。這時(shí)所有請求會直接失敗而不會發(fā)送到后端服務(wù)摄杂。斷路器保持在開路狀態(tài)一段時(shí)間后(默認(rèn)5秒), 自動切換到半開路狀態(tài)(HALF-OPEN)愧沟。這時(shí)會判斷下一次請求的返回情況, 如果請求成功, 斷路器切回閉路狀態(tài)(CLOSED), 否則重新切換到開路狀態(tài)(OPEN)宗收。Hystrix的斷路器就像我們家庭電路中的保險(xiǎn)絲, 一旦后端服務(wù)不可用, 斷路器會直接切斷請求鏈, 避免發(fā)送大量無效請求影響系統(tǒng)吞吐量, 并且斷路器有自我檢測并恢復(fù)的能力。Fallback
Fallback相當(dāng)于是降級操作。對于查詢操作, 我們可以實(shí)現(xiàn)一個(gè)fallback方法, 當(dāng)請求后端服務(wù)出現(xiàn)異常的時(shí)候, 可以使用fallback方法返回的值缕碎。fallback方法的返回值一般是設(shè)置的默認(rèn)值或者來自緩存善已。資源隔離
在Hystrix中, 主要通過線程池來實(shí)現(xiàn)資源隔離灼捂。通常在使用的時(shí)候我們會根據(jù)調(diào)用的遠(yuǎn)程服務(wù)劃分出多個(gè)線程池。例如調(diào)用產(chǎn)品服務(wù)的Command放入A線程池, 調(diào)用賬戶服務(wù)的Command放入B線程池换团。這樣做的主要優(yōu)點(diǎn)是運(yùn)行環(huán)境被隔離開了悉稠。這樣就算調(diào)用服務(wù)的代碼存在bug或者由于其他原因?qū)е伦约核诰€程池被耗盡時(shí), 不會對系統(tǒng)的其他服務(wù)造成影響。但是帶來的代價(jià)就是維護(hù)多個(gè)線程池會對系統(tǒng)帶來額外的性能開銷艘包。如果是對性能有嚴(yán)格要求而且確信自己調(diào)用服務(wù)的客戶端代碼不會出問題的話, 可以使用Hystrix的信號模式(Semaphores)來隔離資源的猛。
Feign Hystrix
上一篇我們使用了producer和consumers,熔斷器是只作用在服務(wù)調(diào)用端想虎,因此上一篇使用到的consumers我們可以直接拿來使用卦尊。因?yàn)镕eign中已經(jīng)依賴了Hystrix所以在maven配置上不用做任何改動。
(1)配置文件application.yml新增 feign.hystrix.enabled = true
server:
port: 8091
spring:
application:
name: spring-cloud-consumers
eureka:
server:
enable-self-preservation: false #關(guān)閉eureka的自我保護(hù)舌厨,防止已被關(guān)停的節(jié)點(diǎn)也錯(cuò)誤的顯示在線
client:
register-with-eureka: true #否允許客戶端向Eureka 注冊表獲取信息岂却,服務(wù)器為設(shè)置為false,客戶端設(shè)置為true
fetch-registry: true #是否允許向Eureka Server注冊信息 如果是服務(wù)器端,應(yīng)該設(shè)置為false
service-url:
defaultZone: http://peer1:8761/eureka/ #此eureka server的應(yīng)用注冊地址
feign:
hystrix:
enabled: true
(2)創(chuàng)建fallback類,繼承HelloRemote實(shí)現(xiàn)回調(diào)的方法躏哩。
//fallback指定的類必須實(shí)現(xiàn)@FeignClient標(biāo)記的接口署浩。
@Component
public class HelloRemoteFallback implements HelloRemote {
@Override
public String hello(@RequestParam(value = "name") String name) {
return "hello " + name + ",i am fallback message";
}
}
(3)添加fallback屬性
//在HelloRemote類添加指定fallback類扫尺,在服務(wù)熔斷的時(shí)候返回fallback類中的內(nèi)容
@FeignClient(name= "spring-cloud-producer",fallback = HelloRemoteFallback.class)
public interface HelloRemote {
@RequestMapping(value = "/hello")
String hello(@RequestParam(value = "name") String name);
}
(4)測試
依次啟動注冊中心Eureka筋栋、producer、consumer正驻,訪問http://localhost:8091/hello?name=1弊攘,可以看到hello 1,producer is ready姑曙。關(guān)閉producer肴颊,再次訪問http://localhost:8091/hello?name=1,就會看到fallback提供的內(nèi)容渣磷。