嗡湯圓的Spring Cloud自學(PART.3):API熔斷與監控(hystrix)
前言
結合上篇部落格”嗡湯圓的Spring Cloud自學(PART.2):eureka服務註冊與代理端使用” 中API服務代理的使用,我們將使用者請求交由代理完成API呼叫以及後端的負載均衡。
同時,通過代理,我們也可以很方便的將後端的異常捕獲並處理。比如發生後端API錯誤,或者後端無可用的微服務的情況時的異常處理,我們稱之為API熔斷(Circuit Break),起到保護客戶端與代理間程式正常執行的目的。本文通過Hystrix實現API熔斷機制。
Hystrix支援
新增Hystrix支援
在代理應用依賴POM中新增對hystrix的依賴。
<dependency >
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
並在應用程式碼入口處,添加註解@EnableCircuitBreaker
即可完成熔斷特性的新增。
對API新增熔斷機制
即通過註解的方式對RestMapping對映的方法新增錯誤處理fallback。事例程式碼如下:
public Collection<String> getReservationNamesFallback (){
return Collections.emptyList();
}
@HystrixCommand(fallbackMethod="getReservationNamesFallback")
@RequestMapping("/names")
public Collection<String> getReservationNames(){
ParameterizedTypeReference<Resources<Reservation>> ptr =
new ParameterizedTypeReference<Resources<Reservation>>() { };
String url = discoveryClient.getInstances("reservation-service").get(0).getUri()+"/reservations";
ResponseEntity<Resources<Reservation>> responseEntity =
this.restTemplate.exchange(url,
HttpMethod.GET, null, ptr);
return responseEntity
.getBody()
.getContent()
.stream()
.map(Reservation::getReservationName)
.collect(Collectors.toList());
}
此處是之前API代理處理中間請求的程式碼,現在假設處理中間請求的過程當中發生異常時,我們通過getReservationNamesFallback
返回空列表,而不是丟擲異常。
例項演示
我們模擬後端微服務異常退出的情況,關閉reservation-service
應用,此時代理通過eureka查詢reservation-service服務時將無法找到可用伺服器。因此在沒有Hystrix熔斷是,代理會返回HTTP 500異常。如下三幅圖所示:
1)API代理正常
2)後端無服務,無熔斷處理
3)後端無服務員,熔斷處理
hystrix監控
Spring提供了hystrix-dashboard專案對支援hystrix熔斷的專案提供鏈路狀態監視的功能。
構建hystrix-dashboard專案
通過start.spring.io構建,勾選hystrix dashboard
、config-client
、eureka discovery
即可。POM檔案省略。
修改application.properties檔案指定埠。
在應用入口處添加註解@EnableHystrixDashboard
即可啟動應用。
監控
hystrix dashboard主頁面
假設該應用部署於8010埠,則訪問http://localhost:8010/hystrix
即可開啟hystrix主頁面。
代理端的hystrix監控流
在支援hystrix監控的專案中,輸入hystrix.stream即可得到監控流資訊,如http://localhost:8800/hystrix.stream
將該地址輸入hystrix主頁的輸入框中,即可已圖形形式觀察代理的執行情況。
上圖可以看出該API代理的兩個介面呼叫情況,和執行緒池狀態資訊。
當我們關閉後臺微服務reservation-service後,該代理將被熔斷,此時hystrix圖形介面將出現熔斷的請求。