SpringCloud之Zuul服務(wù)網(wǎng)關(guān)詳解
ZUUL服務(wù)網(wǎng)關(guān)是什么
服務(wù)網(wǎng)關(guān)是微服務(wù)架構(gòu)中一個不可或缺的部分。
通過服務(wù)網(wǎng)關(guān)統(tǒng)一向外系統(tǒng)提供REST API的過程中,除了具備服務(wù)路由、均衡負(fù)載功能之外,它還具備了權(quán)限控制(鑒權(quán))等功能。
Spring Cloud Netflix中的Zuul就擔(dān)任了這樣的一個角色,為微服務(wù)架構(gòu)提供了前門保護(hù)的作用,同時將權(quán)限控制這些較重的非業(yè)務(wù)邏輯內(nèi)容遷移到服務(wù)路由層面,使得服務(wù)集群主體能夠具備更高的可復(fù)用性和可測試性。
ZUUL官網(wǎng):https://github.com/Netflix/zuul
ZUUL服務(wù)架構(gòu)
ZUUL 路由(Router)
ZUUL的簡單使用
1)新建一個服務(wù)
2)引入依賴
<!-- zuul依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <!-- 導(dǎo)入eureka客戶端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
3)編寫啟動類
@SpringBootApplication @EnableEurekaClient // 開啟Eureka客戶端 @EnableZuulProxy // 開啟服務(wù)網(wǎng)關(guān) public class ZuulApp { public static void main(String[] args) { System.out.println("Zuul網(wǎng)關(guān)服務(wù)啟動。。。8885"); SpringApplication.run(ZuulApp.class, args); } }
4)配置zuul
server.port=8885 spring.application.name=springcloud-zuul-gateway # springcloud-consumer:指定路由ID,名字是自定義的 # path:映射的地址 zuul.routes.springcloud-consumer.path=/consumer/** # url:springcloud-consumer實(shí)際的服務(wù)地址,寫服務(wù)名即可 zuul.routes.springcloud-consumer.url=springcloud-consumer # 讓zuul去eureka獲取服務(wù) # 獲取服務(wù)列表的周期 eureka.client.registry-fetch-interval-seconds=5 # eureka的服務(wù)地址 eureka.client.service-url.defaultZone=http://eureka-8888:8888/eureka/ # 當(dāng)調(diào)用getHostname獲取實(shí)例的hostname時,返回ip而不是host名稱 eureka.instance.prefer-ip-address=true # 指定ip地址 eureka.instance.ip-address=127.0.0.1
5)測試
先啟動 eureka服務(wù),再啟動其他服務(wù)
訪問 //localhost:8885/consumer/queryUserList
可以看出,zuul服務(wù)網(wǎng)關(guān)已經(jīng)可以正常運(yùn)作了。
這便是 ZUUL服務(wù)網(wǎng)關(guān)中路由(Router)的功能。接下來我們來了解zuul的另一大功能—過濾器(Filter)。
ZUUL 過濾器 Filter
zuulFilter的使用場景
- 請求鑒權(quán):一般放在pre類型,如果發(fā)現(xiàn)沒有訪問權(quán)限,直接就攔截了
- 異常處理:一般會在error類型和post類型過濾器中結(jié)合來處理。
- 服務(wù)調(diào)用時長統(tǒng)計(jì):pre和post結(jié)合使用。
filter的類型
- pre:請求在被路由之前執(zhí)行
- routing:在路由請求時調(diào)用
- post:在routing和errror過濾器之后調(diào)用
- error:處理請求時發(fā)生錯誤調(diào)用
Filter 的生命周期
Filter 的生命周期有 4 個,分別是 “PRE”、“ROUTING”、“POST” 和“ERROR”。
- PRE:這種過濾器在請求被路由之前調(diào)用。我們可利用這種過濾器實(shí)現(xiàn)身份驗(yàn)證、在集群中選擇請求的微服務(wù)、記錄調(diào)試信息等。
- ROUTING:這種過濾器將請求路由到微服務(wù)。這種過濾器用于構(gòu)建發(fā)送給微服務(wù)的請求,并使用 Apache HttpClient 或 Netfilx Ribbon 請求微服務(wù)。
- POST:這種過濾器在路由到微服務(wù)以后執(zhí)行。這種過濾器可用來為響應(yīng)添加標(biāo)準(zhǔn)的 HTTP Header、收集統(tǒng)計(jì)信息和指標(biāo)、將響應(yīng)從微服務(wù)發(fā)送給客戶端等。
- ERROR:在其他階段發(fā)生錯誤時執(zhí)行該過濾器。 除了默認(rèn)的過濾器類型,Zuul 還允許我們創(chuàng)建自定義的過濾器類型。例如,我們可以定制一種 STATIC 類型的過濾器,直接在 Zuul 中生成響應(yīng),而不將請求轉(zhuǎn)發(fā)到后端的微服務(wù)。
- 正常流程:
- 請求到達(dá)首先會經(jīng)過pre類型過濾器,而后到達(dá)routing類型,進(jìn)行路由,請求就到達(dá)真正的服務(wù)提供者,執(zhí)行請求,返回結(jié)果后,會到達(dá)post過濾器。而后返回響應(yīng)。
- 異常流程:
- 整個過程中,pre或者routing過濾器出現(xiàn)異常,都會直接進(jìn)入error過濾器,再error處理完畢后,會將請求交給POST過濾器,最后返回給用戶。
- 如果是error過濾器自己出現(xiàn)異常,最終也會進(jìn)入POST過濾器,而后返回。
- 如果是POST過濾器出現(xiàn)異常,會跳轉(zhuǎn)到error過濾器,但是與pre和routing不同的時,請求不會再到達(dá)POST過濾器了。
Zuul中Filter的默認(rèn)執(zhí)行順序
到此這篇關(guān)于SpringCloud之Zuul服務(wù)網(wǎng)關(guān)詳解的文章就介紹到這了,更多相關(guān)Zuul服務(wù)網(wǎng)關(guān)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring boot通過HttpSessionListener監(jiān)聽器統(tǒng)計(jì)在線人數(shù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Spring boot通過HttpSessionListener監(jiān)聽器統(tǒng)計(jì)在線人數(shù)的實(shí)現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-02-02java中for循環(huán)執(zhí)行的順序圖文詳析
關(guān)于java的for循環(huán)想必大家非常熟悉,它是java常用的語句之一,這篇文章主要給大家介紹了關(guān)于java中for循環(huán)執(zhí)行順序的相關(guān)資料,需要的朋友可以參考下2021-06-06Java 實(shí)戰(zhàn)項(xiàng)目錘煉之在線美食網(wǎng)站系統(tǒng)的實(shí)現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個在線美食網(wǎng)站系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11解決SpringBoot項(xiàng)目中l(wèi)og4j與logback的Jar包沖突問題
這篇文章主要給大家介紹了解決SpringBoot項(xiàng)目中l(wèi)og4j與logback的Jar包沖突問題,文中有詳細(xì)的解決方法和沖突的原因,有遇到相同問題的朋友可以參考閱讀本文2023-10-10java實(shí)現(xiàn)Excel的導(dǎo)入導(dǎo)出
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)Excel的導(dǎo)入導(dǎo)出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06使用Spring Data JDBC實(shí)現(xiàn)DDD聚合的示例代碼
這篇文章主要介紹了使用Spring Data JDBC實(shí)現(xiàn)DDD聚合的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09基于Java 數(shù)組內(nèi)存分配的相關(guān)問題
本篇文章是對Java中數(shù)組內(nèi)存分配進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05