本篇文章為大家展示了SpringCloud怎樣使用Zuul實現(xiàn)容錯回退功能,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
創(chuàng)新互聯(lián)建站于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務公司,擁有項目成都網(wǎng)站設計、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元福鼎做網(wǎng)站,已為上家服務,為福鼎各地企業(yè)和個人服務,聯(lián)系電話:18982081108
Zuul 主要功能就是轉(zhuǎn)發(fā),在轉(zhuǎn)發(fā)過程中我們無法保證被轉(zhuǎn)發(fā)的服務是可用的,這個時候就需要容錯機制及回退機制。
容錯,簡單來說就是當某個服務不可用時,能夠切換到其他可用的服務上去,也就是需要有重試機制。在 Zuul 中開啟重試機制需要依賴 spring-retry。
首先在 pom.xml 中添加 spring-retry 的依賴,代碼如下所示。
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency>
在屬性文件中開啟重試機制以及配置重試次數(shù):
zuul.retryable=trueribbon.connectTimeout=500ribbon.readTimeout=5000ribbon.maxAutoRetries=1ribbon.maxAutoRetriesNextServer=3ribbon.okToRetryOnAllOperations=trueribbon.retryableStatusCodes=500,404,502
其中:
zuul.retryable:開啟重試。
ribbon.connectTimeout:請求連接的超時時間(ms)。
ribbon.readTimeout:請求處理的超時時間(ms)。
ribbon.maxAutoRetries:對當前實例的重試次數(shù)。
ribbon.maxAutoRetriesNextServer:切換實例的最大重試次數(shù)。
ribbon.okToRetryOnAllOperations:對所有操作請求都進行重試。
ribbon.retryableStatusCodes:對指定的 Http 響應碼進行重試。
可以啟動兩個 hystrix-feign-demo 服務,默認 Ribbon 的轉(zhuǎn)發(fā)規(guī)則是輪詢,然后我們停掉一個 hystrix-feign-demo 服務。沒加重試機制之前,當你請求接口的時候肯定有一次是會被轉(zhuǎn)發(fā)到停掉的服務上去的,返回的是異常信息。
當我們加入了重試機制后,你可以循環(huán)請求接口,這個時候不會返回異常信息,因為 Ribbon 會根據(jù)重試配置進行重試,當請求失敗后會將請求重新轉(zhuǎn)發(fā)到可用的服務上去。
在 Spring Cloud 中,Zuul 默認整合了 Hystrix,當后端服務異常時可以為 Zuul 添加回退功能,返回默認的數(shù)據(jù)給客戶端。
實現(xiàn)回退機制需要實現(xiàn) ZuulFallbackProvider 接口,代碼如下所示。
@Componentpublic class ServiceConsumerFallbackProvider implements ZuulFallbackProvider {private Logger log = LoggerFactory.getLogger(ServiceConsumerFallbackProvider.class);@Overridepublic String getRoute() {return "*"; }@Overridepublic ClientHttpResponse fallbackResponse(String route, Throwable cause) {return new ClientHttpResponse() {@Overridepublic HttpStatus getStatusCode() throws IOException {return HttpStatus.OK; }@Overridepublic int getRawStatusCode() throws IOException {return this.getStatusCode().value(); }@Overridepublic String getStatusText() throws IOException {return this.getStatusCode().getReasonPhrase(); }@Overridepublic void close() { }@Overridepublic InputStream getBody() throws IOException {if (cause != null) { log.error("", cause.getCause()); } RequestContext ctx = RequestContext.getCurrentContext(); ResponseData data = ResponseData.fail("服務器內(nèi)部錯誤 ", ResponseCode.SERVER_ERROR_CODE.getCode());return new ByteArrayInputStream(JsonUtils.toJson(data).getBytes()); }@Overridepublic HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8")); headers.setContentType(mt);return headers; } }; } }
getRoute 方法中返回*
表示對所有服務進行回退操作,如果只想對某個服務進行回退,那么就返回需要回退的服務名稱,這個名稱一定要是注冊到 Eureka 中的名稱。
通過 ClientHttpResponse 構(gòu)造回退的內(nèi)容。通過 getStatusCode 返回響應的狀態(tài)碼。通過 getStatusText 返回響應狀態(tài)碼對應的文本。通過 getBody 返回回退的內(nèi)容。通過 getHeaders 返回響應的請求頭信息。
通過 API 網(wǎng)關(guān)來訪問 hystrix-feign-demo 服務,將 hystrix-feign-demo 服務停掉,然后再次訪問,就可以看到回退的內(nèi)容了,如圖 1 所示。
跟業(yè)務相關(guān)的服務我們都是注冊到 Eureka 中,通過 Ribbon 來進行負載均衡,服務可以通過水平擴展來實現(xiàn)高可用。
現(xiàn)實使用中,API 網(wǎng)關(guān)這層往往是給 APP、Webapp、客戶來調(diào)用接口的,如果我們將 Zuul 也注冊到 Eureka 中是達不到高可用的,因為你不可能讓你的客戶也去操作你的注冊中心。
這時最好的辦法就是用額外的負載均衡器來實現(xiàn) Zuul 的高可用,比如我們最常用的 Nginx,或者 HAProxy、F5 等。
這種方式也是單體項目最常用的負載方式,當用戶請求一個地址的時候,通過 Nginx 去做轉(zhuǎn)發(fā),當一個服務掛掉的時候,Nginx 會把它排除掉。
如果想要 API 網(wǎng)關(guān)也能隨時水平擴展,那么我們可以用腳本來動態(tài)修改 Nginx 的配置,通過腳本操作 Eureka,發(fā)現(xiàn)有新加入的網(wǎng)關(guān)服務或者下線的網(wǎng)關(guān)服務,直接修改 Nginx 的 upstream,然后通過重載(reload)配置來達到網(wǎng)關(guān)的動態(tài)擴容。
如果不用腳本結(jié)合注冊中心去做的話,就只能提前規(guī)劃好 N 個節(jié)點,然后手動配置上去。
上述內(nèi)容就是SpringCloud怎樣使用Zuul實現(xiàn)容錯回退功能,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁名稱:SpringCloud怎樣使用Zuul實現(xiàn)容錯回退功能
本文URL:http://chinadenli.net/article28/gijcjp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計公司、網(wǎng)站制作、響應式網(wǎng)站、搜索引擎優(yōu)化、品牌網(wǎng)站制作、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)