路由網關Zuul(五)

1.介紹

在微服務架構中,後端服務往往不直接開放給調用端,而是通過一個 API 網關根據請求的 URL,路由到相應的服務。當添加 API 網關後,在第三方調用端和服務提供方之間就創建了一面牆,這面牆直接與調用方通信進行權限控制後將請求均衡分發給後臺服務端。

在 Spring Cloud 體系中, Spring Cloud Zuul 就是提供負載均衡、反向代理、權限認證的一個 API 網關。我們這說的 Zuul 是 Zuul 1,實際上 Netflix 已經發布了 Zuul 2,不過 Spring 好像並沒有將 Zuul 2 整合到 Spring Cloud 生態中的意思,因爲它自己做了一個 Spring Cloud Gateway高性能的網關),暫且先學會Zuul吧,東西都是大同小異的。Spring Cloud Zuul 路由是微服務架構的不可或缺的一部分,提供動態路由、監控、彈性、安全等的邊緣服務。Zuul 是 Netflix 出品的一個基於 JVM 路由和服務端的負載均衡器。

2.Zuul路由功能的使用(基於前面的工程)

2.1 新建工程,添加依賴

新建module,api-gateway

主要依賴:

 

2.2 添加配置文件,註解開啓功能

使用@EnableZuulProxy註解開啓Zuul的功能

 

2.3啓動和測試

啓動服務,訪問註冊中心:http://localhost:7000,看到服務已註冊上去了

由於 Spring Cloud Zuul 在整合了 Eureka 之後,具備默認的服務路由功能,即:當我們這裏構建的 api-gateway 應用啓動並註冊到 Eureka 之後,服務網關會發現上面我們啓動的兩個服務 eureka-producer 和 service-feign,這時候 Zuul 就會創建兩個路由規則。每個路由規則都包含兩部分,一部分是外部請求的匹配規則,另一部分是路由的服務 ID。針對當前的情況,Zuul 會創建下面的兩個路由規則:

轉發到 eureka-producer 服務的請求規則爲:/eureka-producer/**

轉發到 service-feign服務的請求規則爲:/service-feign/**

最後,我們可以通過訪問 8000 端口的服務網關來驗證上述路由的正確性:

訪問請求:localhost:8000/service-feign/helloFeign?name=feign。返回:

該請求最終被路由到service-feign的/helloFeign接口上。

 

3. Zuul過濾器功能

3.1  自定義Filter

假設服務網關應對的是外部的所有請求,爲了避免產生安全隱患,我們需要對請求做一定的限制,比如請求中含有 Token 便讓請求繼續往下走,如果請求不帶 Token 就直接返回並給出提示。

這裏我們通過 currentContext.setSendZuulResponse(false) 令 Zuul 過濾該請求,不對其進行路由,然後通過 currentContext.setResponseStatusCode(401) 設置了其返回的錯誤碼,當然我們也可以進一步優化我們的返回,比如,通過 currentContext.setResponseBody(body) 對返回 body 內容進行編輯等。

在實現了自定義的過濾器之後,它並不會直接生效,還需要爲其創建具體的bean注入ioc容器中才能啓動該過濾器,如下:

訪問:localhost:8000/service-feign/helloFeign?name=feign​​​​​​​

返回:

加上token,訪問:localhost:8000/service-feign/helloFeign?name=feign&token=666​​​​​​​

成功返回:​​​​​​​

 

源碼地址:https://github.com/wxkhz/springcloud

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章