很多時候诱鞠,由于服務(wù)的重啟互例、宕機或者網(wǎng)絡(luò)的不佳奢入,Zuul進行路由時會出現(xiàn)異常,然后媳叨,異常信息直接展示給用戶是不友好的腥光, 需要我們提示一些通俗易懂的信息告知用戶為什么會出現(xiàn)失敗,這時就可以用到回退處理糊秆,SpringCloud中使用Hystrix實現(xiàn)微服務(wù)的容錯與回退武福,其實Zuul默認(rèn)已經(jīng)整合了Hystrix
本文講解Zuul如何實現(xiàn)回退策略,Hystrix組件大家不了解的話可以前往我這篇文章:SpringCloud組件之Hystrix
一扩然、實現(xiàn)FallbackProvider接口
本文用的Zuul服務(wù)為前幾篇文章所搭建的艘儒,這里不在搭建Zuul服務(wù),對Zuul不了解的話可以查看之前的文章:SpringCloud組件之Zuul
/**
* @author Gjing
**/
@Component
public class GlobalFallback implements FallbackProvider {
/**
* 這里配置是為哪個服務(wù)提供回退,*號代表所有服務(wù)
*/
@Override
public String getRoute() {
return "*";
}
/**
* 回退返回
*/
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
@Override
@NonNull
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.BAD_REQUEST;
}
@Override
public int getRawStatusCode() throws IOException {
return HttpStatus.BAD_REQUEST.value();
}
@Override
@NonNull
public String getStatusText() throws IOException {
return HttpStatus.BAD_REQUEST.getReasonPhrase();
}
@Override
public void close() {
}
@Override
@NonNull
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("服務(wù)器異常請稍后再試".getBytes(StandardCharsets.UTF_8));
}
@Override
@NonNull
public HttpHeaders getHeaders() {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
return httpHeaders;
}
};
}
}
相關(guān)方法介紹
方法名 | 說明 |
---|---|
getRoute | 為哪個服務(wù)提供回退界睁,*號代表所有服務(wù) |
fallbackResponse | 回退響應(yīng) |
getStatusCode | 回退時的狀態(tài)碼 |
getRawStatusCode | 數(shù)字類型狀態(tài)碼 |
getStatusText | 狀態(tài)文本 |
close | 這個不用管 |
getBody | 響應(yīng)體 |
getHeaders | 返回的響應(yīng)頭 |
二觉增、配置超時時間
# 負載均衡超時時間設(shè)置
ribbon:
ReadTimeout: 讀超時時間(單位毫秒)
socketTimeOut: 連接超時時間(單位毫秒)
注意!7濉S饨浮:如果zuul配置了熔斷fallback的話,熔斷超時也要配置访惜,不然如果你配置的ribbon超時時間大于熔斷的超時(Hystirx超時默認(rèn)1秒)嘹履,那么會先走熔斷,相當(dāng)于你配的ribbon超時就不生效了债热,ribbon和hystrix是同時生效的砾嫉,哪個值小哪個生效,另一個就看不到效果了窒篱。
hystrix:
command:
# default為默認(rèn)所有焕刮,可以配置指定服務(wù)名
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 超時時間(單位毫秒)
三、啟動Eureka墙杯、Zuul和一個Web服務(wù)配并,并在web服務(wù)接口設(shè)置線程休眠,模擬超時高镐,當(dāng)請求實際達到設(shè)置的超時時間后會進行回退
1562037222(1).jpg
1562037222(1).jpg
本文到此就結(jié)束了溉旋,合理的配置超時時間和回退,有助于讓程序體驗性更好哦嫉髓,具體還是要視實際業(yè)務(wù)場景而定哦观腊,本Demo源代碼地址為:SpringCloud-Demo