本篇文章為大家展示了SpringCloud怎樣使用Zuul實現(xiàn)容錯回退功能,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
創(chuàng)新互聯(lián)建站于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元福鼎做網(wǎng)站,已為上家服務(wù),為福鼎各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108
Zuul 主要功能就是轉(zhuǎn)發(fā),在轉(zhuǎn)發(fā)過程中我們無法保證被轉(zhuǎn)發(fā)的服務(wù)是可用的,這個時候就需要容錯機制及回退機制。
容錯,簡單來說就是當(dāng)某個服務(wù)不可用時,能夠切換到其他可用的服務(wù)上去,也就是需要有重試機制。在 Zuul 中開啟重試機制需要依賴 spring-retry。
首先在 pom.xml 中添加 spring-retry 的依賴,代碼如下所示。
org.springframework.retry spring-retry
在屬性文件中開啟重試機制以及配置重試次數(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:對當(dāng)前實例的重試次數(shù)。
ribbon.maxAutoRetriesNextServer:切換實例的最大重試次數(shù)。
ribbon.okToRetryOnAllOperations:對所有操作請求都進行重試。
ribbon.retryableStatusCodes:對指定的 Http 響應(yīng)碼進行重試。
可以啟動兩個 hystrix-feign-demo 服務(wù),默認(rèn) Ribbon 的轉(zhuǎn)發(fā)規(guī)則是輪詢,然后我們停掉一個 hystrix-feign-demo 服務(wù)。沒加重試機制之前,當(dāng)你請求接口的時候肯定有一次是會被轉(zhuǎn)發(fā)到停掉的服務(wù)上去的,返回的是異常信息。
當(dāng)我們加入了重試機制后,你可以循環(huán)請求接口,這個時候不會返回異常信息,因為 Ribbon 會根據(jù)重試配置進行重試,當(dāng)請求失敗后會將請求重新轉(zhuǎn)發(fā)到可用的服務(wù)上去。
在 Spring Cloud 中,Zuul 默認(rèn)整合了 Hystrix,當(dāng)后端服務(wù)異常時可以為 Zuul 添加回退功能,返回默認(rèn)的數(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("getRoute 方法中返回
*
表示對所有服務(wù)進行回退操作,如果只想對某個服務(wù)進行回退,那么就返回需要回退的服務(wù)名稱,這個名稱一定要是注冊到 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 所示。Zuul 高可用
跟業(yè)務(wù)相關(guān)的服務(wù)我們都是注冊到 Eureka 中,通過 Ribbon 來進行負(fù)載均衡,服務(wù)可以通過水平擴展來實現(xiàn)高可用。
現(xiàn)實使用中,API 網(wǎng)關(guān)這層往往是給 APP、Webapp、客戶來調(diào)用接口的,如果我們將 Zuul 也注冊到 Eureka 中是達不到高可用的,因為你不可能讓你的客戶也去操作你的注冊中心。
這時最好的辦法就是用額外的負(fù)載均衡器來實現(xiàn) Zuul 的高可用,比如我們最常用的 Nginx,或者 HAProxy、F5 等。
這種方式也是單體項目最常用的負(fù)載方式,當(dāng)用戶請求一個地址的時候,通過 Nginx 去做轉(zhuǎn)發(fā),當(dāng)一個服務(wù)掛掉的時候,Nginx 會把它排除掉。
如果想要 API 網(wǎng)關(guān)也能隨時水平擴展,那么我們可以用腳本來動態(tài)修改 Nginx 的配置,通過腳本操作 Eureka,發(fā)現(xiàn)有新加入的網(wǎng)關(guān)服務(wù)或者下線的網(wǎng)關(guān)服務(wù),直接修改 Nginx 的 upstream,然后通過重載(reload)配置來達到網(wǎng)關(guān)的動態(tài)擴容。
如果不用腳本結(jié)合注冊中心去做的話,就只能提前規(guī)劃好 N 個節(jié)點,然后手動配置上去。上述內(nèi)容就是SpringCloud怎樣使用Zuul實現(xiàn)容錯回退功能,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前標(biāo)題:SpringCloud怎樣使用Zuul實現(xiàn)容錯回退功能
文章網(wǎng)址:http://weahome.cn/article/gijcjp.html