1. 程式人生 > >嗡湯圓的Spring Cloud自學(PART.3):API熔斷與監控(hystrix)

嗡湯圓的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 dashboardconfig-clienteureka 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圖形介面將出現熔斷的請求。
這裡寫圖片描述