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ù)路由、均衡負載功能之外,它還具備了權(quán)限控制(鑒權(quán))等功能。
Spring Cloud Netflix中的Zuul就擔任了這樣的一個角色,為微服務(wù)架構(gòu)提供了前門保護的作用,同時將權(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實際的服務(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/ # 當調(diào)用getHostname獲取實例的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)可以正常運作了。
這便是 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)計: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)身份驗證、在集群中選擇請求的微服務(wù)、記錄調(diào)試信息等。
- ROUTING:這種過濾器將請求路由到微服務(wù)。這種過濾器用于構(gòu)建發(fā)送給微服務(wù)的請求,并使用 Apache HttpClient 或 Netfilx Ribbon 請求微服務(wù)。
- POST:這種過濾器在路由到微服務(wù)以后執(zhí)行。這種過濾器可用來為響應(yīng)添加標準的 HTTP Header、收集統(tǒng)計信息和指標、將響應(yīng)從微服務(wù)發(fā)送給客戶端等。
- ERROR:在其他階段發(fā)生錯誤時執(zhí)行該過濾器。 除了默認的過濾器類型,Zuul 還允許我們創(chuàng)建自定義的過濾器類型。例如,我們可以定制一種 STATIC 類型的過濾器,直接在 Zuul 中生成響應(yīng),而不將請求轉(zhuǎn)發(fā)到后端的微服務(wù)。

- 正常流程:
- 請求到達首先會經(jīng)過pre類型過濾器,而后到達routing類型,進行路由,請求就到達真正的服務(wù)提供者,執(zhí)行請求,返回結(jié)果后,會到達post過濾器。而后返回響應(yīng)。
- 異常流程:
- 整個過程中,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ù)網(wǎng)關(guān)詳解的文章就介紹到這了,更多相關(guān)Zuul服務(wù)網(wǎng)關(guān)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基礎(chǔ)篇之serialVersionUID用法及注意事項詳解
這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)篇之serialVersionUID用法及注意事項的相關(guān)資料,SerialVersionUID屬性是用于序列化/反序列化可序列化類的對象的標識符,我們可以用它來記住可序列化類的版本,以驗證加載的類和序列化對象是否兼容,需要的朋友可以參考下2024-02-02
java8 stream自定義分組求和并排序的實現(xiàn)
這篇文章主要介紹了java8 stream自定義分組求和并排序的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
@RequestParam?和@RequestBody注解的區(qū)別解析
在 Spring MVC 中,我們可以使用 @RequestParam 和 @RequestBody 來獲取請求參數(shù),但它們在用法和作用上有一些區(qū)別,這篇文章主要介紹了@RequestParam?和@RequestBody注解的區(qū)別,需要的朋友可以參考下2023-06-06
Java實現(xiàn)經(jīng)典游戲推箱子的示例代碼
《推箱子》推箱子是一個古老的游戲,目的是在訓(xùn)練你的邏輯思考能力。本文將利用Java實現(xiàn)這一經(jīng)典的小游戲,并采用了swing技術(shù)進行了界面化處理,需要的可以參考一下2022-02-02
FeignClient實現(xiàn)接口調(diào)用方式(不同參數(shù)形式)
這篇文章主要介紹了FeignClient實現(xiàn)接口調(diào)用方式(不同參數(shù)形式),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
圖解Springboot集成七牛云并實現(xiàn)圖片上傳功能過程
在實際開發(fā)中 ,基本都會有應(yīng)用到文件上傳的場景,但隨著或多或少的需求問題,之前有在springboot上用過七牛云實現(xiàn)圖片上傳,今天因為某些原因又重新使用了下七牛云因此想總結(jié)下七牛云2021-11-11

