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