在微服務架構中,咱們將系統拆分紅了一個個的服務單元,各單元應用間經過服務註冊與訂閱的方式互相依賴。因爲每一個單元都在不一樣的進程中運行,依賴經過遠程調用的方式執行,這樣就有可能由於網絡緣由或是依賴服務自身問題出現調用故障或延遲,而這些問題會直接致使調用方的對外服務也出現延遲,若此時調用方的請求不斷增長,最後就會出現因等待出現故障的依賴方響應而造成任務積壓,線程資源沒法釋放,最終致使自身服務的癱瘓,進一步甚至出現故障的蔓延最終致使整個系統的癱瘓。若是這樣的架構存在如此嚴重的隱患,那麼相較傳統架構就更加的不穩定。爲了解決這樣的問題,所以產生了斷路器等一系列的服務保護機制。html
針對上述問題,在Spring Cloud Hystrix中實現了線程隔離、斷路器等一系列的服務保護功能。它也是基於Netflix的開源框架 Hystrix實現的,該框架目標在於經過控制那些訪問遠程系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具有了服務降級、服務熔斷、線程隔離、請求緩存、請求合併以及服務監控等強大功能。web
接下來,咱們就從一個簡單示例開始對Spring Cloud Hystrix的學習與使用。spring
動手試一試緩存
在開始使用Spring Cloud Hystrix實現斷路器以前,咱們先拿以前實現的一些內容做爲基礎,其中包括:網絡
eureka-server工程:服務註冊中心,端口:1001 eureka-client工程:服務提供者,兩個實例啓動端口分別爲2001 下面咱們能夠複製一下以前實現的一個服務消費者:eureka-consumer-ribbon,命名爲eureka-consumer-ribbon-hystrix。下面咱們開始對其進行改在:架構
第一步:pom.xml的dependencies節點中引入spring-cloud-starter-hystrix依賴:app
org.springframework.cloud spring-cloud-starter-hystrix 第二步:在應用主類中使用@EnableCircuitBreaker或@EnableHystrix註解開啓Hystrix的使用:@EnableCircuitBreaker @EnableDiscoveryClient @SpringBootApplication public class Application {框架
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
複製代碼
} 注意:這裏咱們還可使用Spring Cloud應用中的@SpringCloudApplication註解來修飾應用主類,該註解的具體定義以下所示。咱們能夠看到該註解中包含了上咱們所引用的三個註解,這也意味着一個Spring Cloud標準應用應包含服務發現以及斷路器。函數
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker public @interface SpringCloudApplication { } 第三步:改造服務消費方式,新增ConsumerService類,而後將在Controller中的邏輯遷移過去。最後,在爲具體執行邏輯的函數上增長@HystrixCommand註解來指定服務降級方法,好比:微服務
@RestController public class DcController {
@Autowired
ConsumerService consumerService;
@GetMapping("/consumer")
public String dc() {
return consumerService.consumer();
}
class ConsumerService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "fallback")
public String consumer() {
return restTemplate.getForObject("http://eureka-client/dc", String.class);
}
public String fallback() {
return "fallback";
}
}
複製代碼
} 下面咱們來驗證一下上面Hystrix帶來的一些基礎功能。咱們先把涉及的服務都啓動起來,而後訪問localhost:2101/consumer,此時能夠獲取正常的返回,好比:Services: [eureka-consumer-ribbon-hystrix, eureka-client]。
爲了觸發服務降級邏輯,咱們能夠將服務提供者eureka-client的邏輯加一些延遲,好比:
@GetMapping("/dc") public String dc() throws InterruptedException { Thread.sleep(5000L); String services = "Services: " + discoveryClient.getServices(); System.out.println(services); return services; }
重啓eureka-client以後,再嘗試訪問localhost:2101/consumer,此時咱們將得到的返回結果爲:fallback。咱們從eureka-client的控制檯中,能夠看到服務提供方輸出了本來要返回的結果,可是因爲返回前延遲了5秒,而服務消費方觸發了服務請求超時異常,服務消費者就經過HystrixCommand註解中指定的降級邏輯進行執行,所以該請求的結果返回了fallback。這樣的機制,對自身服務起到了基礎的保護,同時還爲異常狀況提供了自動的服務降級切換機制。
源碼來源:http://minglisoft.cn/honghu/technology.html