SpringCloud怎樣使用Zuul實(shí)現(xiàn)容錯(cuò)回退功能

本篇文章為大家展示了SpringCloud怎樣使用Zuul實(shí)現(xiàn)容錯(cuò)回退功能,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)建站于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元福鼎做網(wǎng)站,已為上家服務(wù),為福鼎各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108

Zuul 主要功能就是轉(zhuǎn)發(fā),在轉(zhuǎn)發(fā)過程中我們無法保證被轉(zhuǎn)發(fā)的服務(wù)是可用的,這個(gè)時(shí)候就需要容錯(cuò)機(jī)制及回退機(jī)制。

容錯(cuò)機(jī)制

容錯(cuò),簡單來說就是當(dāng)某個(gè)服務(wù)不可用時(shí),能夠切換到其他可用的服務(wù)上去,也就是需要有重試機(jī)制。在 Zuul 中開啟重試機(jī)制需要依賴 spring-retry。

首先在 pom.xml 中添加 spring-retry 的依賴,代碼如下所示。

<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency>

在屬性文件中開啟重試機(jī)制以及配置重試次數(shù):

zuul.retryable=trueribbon.connectTimeout=500ribbon.readTimeout=5000ribbon.maxAutoRetries=1ribbon.maxAutoRetriesNextServer=3ribbon.okToRetryOnAllOperations=trueribbon.retryableStatusCodes=500,404,502

其中:

  • zuul.retryable:開啟重試。

  • ribbon.connectTimeout:請求連接的超時(shí)時(shí)間(ms)。

  • ribbon.readTimeout:請求處理的超時(shí)時(shí)間(ms)。

  • ribbon.maxAutoRetries:對當(dāng)前實(shí)例的重試次數(shù)。

  • ribbon.maxAutoRetriesNextServer:切換實(shí)例的最大重試次數(shù)。

  • ribbon.okToRetryOnAllOperations:對所有操作請求都進(jìn)行重試。

  • ribbon.retryableStatusCodes:對指定的 Http 響應(yīng)碼進(jìn)行重試。


可以啟動(dòng)兩個(gè) hystrix-feign-demo 服務(wù),默認(rèn) Ribbon 的轉(zhuǎn)發(fā)規(guī)則是輪詢,然后我們停掉一個(gè) hystrix-feign-demo 服務(wù)。沒加重試機(jī)制之前,當(dāng)你請求接口的時(shí)候肯定有一次是會被轉(zhuǎn)發(fā)到停掉的服務(wù)上去的,返回的是異常信息。

當(dāng)我們加入了重試機(jī)制后,你可以循環(huán)請求接口,這個(gè)時(shí)候不會返回異常信息,因?yàn)?Ribbon 會根據(jù)重試配置進(jìn)行重試,當(dāng)請求失敗后會將請求重新轉(zhuǎn)發(fā)到可用的服務(wù)上去。

回退機(jī)制

在 Spring Cloud 中,Zuul 默認(rèn)整合了 Hystrix,當(dāng)后端服務(wù)異常時(shí)可以為 Zuul 添加回退功能,返回默認(rèn)的數(shù)據(jù)給客戶端。

實(shí)現(xiàn)回退機(jī)制需要實(shí)現(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("服務(wù)器內(nèi)部錯(cuò)誤 ", 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 方法中返回*表示對所有服務(wù)進(jìn)行回退操作,如果只想對某個(gè)服務(wù)進(jìn)行回退,那么就返回需要回退的服務(wù)名稱,這個(gè)名稱一定要是注冊到 Eureka 中的名稱。

通過 ClientHttpResponse 構(gòu)造回退的內(nèi)容。通過 getStatusCode 返回響應(yīng)的狀態(tài)碼。通過 getStatusText 返回響應(yīng)狀態(tài)碼對應(yīng)的文本。通過 getBody 返回回退的內(nèi)容。通過 getHeaders 返回響應(yīng)的請求頭信息。

通過 API 網(wǎng)關(guān)來訪問 hystrix-feign-demo 服務(wù),將 hystrix-feign-demo 服務(wù)停掉,然后再次訪問,就可以看到回退的內(nèi)容了,如圖 1 所示。
SpringCloud怎樣使用Zuul實(shí)現(xiàn)容錯(cuò)回退功能

Zuul 高可用

跟業(yè)務(wù)相關(guān)的服務(wù)我們都是注冊到 Eureka 中,通過 Ribbon 來進(jìn)行負(fù)載均衡,服務(wù)可以通過水平擴(kuò)展來實(shí)現(xiàn)高可用。

現(xiàn)實(shí)使用中,API 網(wǎng)關(guān)這層往往是給 APP、Webapp、客戶來調(diào)用接口的,如果我們將 Zuul 也注冊到 Eureka 中是達(dá)不到高可用的,因?yàn)槟悴豢赡茏屇愕目蛻粢踩ゲ僮髂愕淖灾行摹?br/>
這時(shí)最好的辦法就是用額外的負(fù)載均衡器來實(shí)現(xiàn) Zuul 的高可用,比如我們最常用的 Nginx,或者 HAProxy、F5 等。

這種方式也是單體項(xiàng)目最常用的負(fù)載方式,當(dāng)用戶請求一個(gè)地址的時(shí)候,通過 Nginx 去做轉(zhuǎn)發(fā),當(dāng)一個(gè)服務(wù)掛掉的時(shí)候,Nginx 會把它排除掉。

如果想要 API 網(wǎng)關(guān)也能隨時(shí)水平擴(kuò)展,那么我們可以用腳本來動(dòng)態(tài)修改 Nginx 的配置,通過腳本操作 Eureka,發(fā)現(xiàn)有新加入的網(wǎng)關(guān)服務(wù)或者下線的網(wǎng)關(guān)服務(wù),直接修改 Nginx 的 upstream,然后通過重載(reload)配置來達(dá)到網(wǎng)關(guān)的動(dòng)態(tài)擴(kuò)容。

如果不用腳本結(jié)合注冊中心去做的話,就只能提前規(guī)劃好 N 個(gè)節(jié)點(diǎn),然后手動(dòng)配置上去。

上述內(nèi)容就是SpringCloud怎樣使用Zuul實(shí)現(xiàn)容錯(cuò)回退功能,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁名稱:SpringCloud怎樣使用Zuul實(shí)現(xiàn)容錯(cuò)回退功能
本文URL:http://bm7419.com/article28/gijcjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、網(wǎng)站制作響應(yīng)式網(wǎng)站搜索引擎優(yōu)化、品牌網(wǎng)站制作、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)