簡介(是什麼)
服務拆分,使得原本清晰的業務線不那麼明朗了,各個服務散落在不同角落,爲了實現一個具體的業務邏輯,可能調用多個不同的服務,此時需要一個面向服務治理的組件——網關,Zuul就是在這種場景下誕生的。
在沒有引入網關時,用戶的請求的一個購買請求需要調用多個微服務。
此時可能遇到的問題:
- 請求由客戶端(網頁、APP)控制,對其來說稍顯複雜
- 需要解決跨域問題
- 很多服務需要認證授權
在引入網關後,用戶請求直達網關,由網關決定之後的請求分發到哪個微服務。
此時帶來的好處:
- 請求由後端控制,易於監控
- 認證、鑑權、登錄一步搞定
Zuul is the front door for all requests from devices and web sites to the backend fo the Netflix streaming application.
Zuul像網站後端應用的前門,其底層是Servlet,本質是過濾器,從代碼層面看是一系列Filter所構成的責任鏈。
案例(怎麼用)
創建項目ms-g1-zuul
,添加網關依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
添加註解:
@EnableZuulProxy
添加配置:
server:
port: 10070
spring:
application:
name: zuul-server
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
zuul:
routes:
product:
path: /product/**
serviceId: product-service
這裏Zuul網關的端口爲 10070,項目名爲zuul-server。
關於zuul的配置在最後幾行:
- product 我起的路由名稱
- path 表示將所有
/product
開頭的請求做URL映射 - serviceId 即服務名稱
依次啓動3個項目:
- ms-a1-eureka-server 註冊中心
- ms-c1-product-service 服務提供者
- ms-g1-zuul 網關服務
路由配置
路由規則在實際項目中可能非常複雜,Zuul提供了多種方式來進行路由配置。
基礎配置
zuul:
routes:
product-service: /product/**
將product-service
服務映射到 ‘/product’
忽略服務
zuul:
ignored-services: product-service, user-service
這樣Zuul就不會處理被忽略的服務,而代理其他服務。
zuul:
ignored-patterns: /**/delete/**
忽略某些接口,屏蔽掉服務中含有delete
的接口。
路由指定服務
zuul:
ignored-services: '*'
routes:
product-service: /product/**
這樣Zuul就只路由 product-service
服務。
多個路由規則
zuul:
routes:
route-rule-a:
serviceId: product-service
path: /product/**
route-rule-b:
serviceId: user-service
path: /user/**
這裏的route-rule-a
只是一個名稱,沒有實際意義。
路由某個URL
zuul:
routes:
user-route:
url: http://localhost:8080/
path: /user/**
這裏不是路由某個服務,而是代理一個URL地址。
路由前綴
zuul:
prefix: /ms-service
strip-prefix: false
routes:
product-service: /product/**
在訪問Zuul服務 /ms-service/product-service/s1
路徑時,請求會被轉發到product-service服務的/ms-service/s1
失敗重試
zuul:
retryable: true // 開啓重試機制
ribbon:
MaxAutoRetries: 2 // 服務失敗重試次數
MaxAutoRetriesNextServer: 1 //切換相同服務數量
某些場景下,開啓自動重試能提升用戶體驗。
配置說明
在上面的舉例中,映射路徑使用的是/product/**
,還有其他幾種選項:
配置方式 | 說明 | 舉例 |
---|---|---|
/** | 匹配任意路徑 | /product/add,/product/save,/product/id/123 |
/* | 匹配單級路徑 | /product/add,/product/save,/product/list |
/? | 匹配一個字符 | /product/a,/product/s |
未完待續
Zuul是外界進入微服務應用內部的入口,其原理不復雜,但是需要面對的業務場景太多,因此需要較好的擴展性,Zuul還給用戶暴露了更多了擴展能力,在下一節中將從Zuul的生命週期來探索更多可能。
項目代碼託管於Github。