Netflix建立了一個名爲Hystrix的庫,用於實現斷路器模式,在微服務架構中,一般有多層服務調用,如如下示例所示:html
較低級別的服務中的服務故障可能致使級聯故障一直到用戶,當對特定服務的調用超過circuitBreaker.requestVolumeThreshold
(默認值:20個請求)而且在metrics.rollingStats.timeInMilliseconds
(默認值:10秒)定義的滾動窗口中,失敗百分比大於circuitBreaker.errorThresholdPercentage
(默認值:> 50%)時,電路打開,沒有調用,在出現錯誤和開路的狀況下,開發人員能夠提供回退。java
擁有一個開放的電路能夠中止級聯故障,並容許過載或故障服務有時間恢復,回退能夠是另外一個受Hystrix保護的調用、靜態數據或合理的空值,回退能夠被連接,以便第一個回退執行一些其餘業務調用,而這些業務調用又反過來回退到靜態數據。git
要在項目中包含Hystrix,請使用組ID爲org.springframework.cloud
和工件ID爲spring-cloud-starter-netflix-hystrix
的啓動器。github
如下示例顯示了具備Hystrix斷路器的最小Eureka服務器:web
@SpringBootApplication @EnableCircuitBreaker public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } } @Component public class StoreIntegration { @HystrixCommand(fallbackMethod = "defaultStores") public Object getStores(Map<String, Object> parameters) { //do stuff that might fail } public Object defaultStores(Map<String, Object> parameters) { return /* something useful */; } }
@HystrixCommand
由名爲「javanica」的Netflix contrib庫提供,Spring Cloud在鏈接到Hystrix斷路器的代理中自動包裝帶有該註解的Spring bean,斷路器計算什麼時候打開和關閉電路以及在發生故障時應採起的措施。spring
要配置@HystrixCommand
,能夠將commandProperties
屬性與@HystrixProperty
註解列表一塊兒使用,有關詳細信息,請參見此處,有關可用屬性的詳細信息,請參閱Hystrix wiki。segmentfault
若是但願某些線程本地上下文傳播到@HystrixCommand
,則默認聲明不起做用,由於它在線程池中執行該命令(在超時的狀況下),你能夠經過配置或直接在註解中切換Hystrix以使用與調用者相同的線程,方法是讓它使用不一樣的「隔離策略」,如下示例演示如何在註解中設置線程:安全
@HystrixCommand(fallbackMethod = "stubMyService", commandProperties = { @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE") } ) ...
若是你使用@SessionScope
或@RequestScope
,則一樣適用,若是遇到運行時異常,表示沒法找到做用域上下文,則須要使用相同的線程。服務器
你還能夠選擇將hystrix.shareSecurityContext
屬性設置爲true
,這樣作會自動配置Hystrix併發策略插件掛鉤,將SecurityContext
從主線程傳輸到Hystrix命令使用的線程。Hystrix不會註冊多個Hystrix併發策略,所以能夠經過將本身的HystrixConcurrencyStrategy
聲明爲Spring bean來實現擴展機制,Spring Cloud在Spring上下文中查找你的實現,並將其包裝在本身的插件中。架構
鏈接斷路器的狀態也暴露在調用應用程序的/health
端點中,如如下示例所示:
{ "hystrix": { "openCircuitBreakers": [ "StoreIntegration::getStoresByLocationLink" ], "status": "CIRCUIT_OPEN" }, "status": "UP" }
要啓用Hystrix指標流,請包含對spring-boot-starter-actuator
的依賴關係並設置management.endpoints.web.exposure.include: hystrix.stream
,這樣作會將/actuator/hystrix.stream
公開爲管理端點,如如下示例所示:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
Hystrix的主要好處之一是它收集了關於每一個HystrixCommand的指標集,Hystrix儀表板以高效的方式顯示每一個斷路器的健康情況。