咱們今天繼續說springcloud的zuul。在最早我們是沒有閘道器這個概念的,微服務搭建起來後,客戶端就直接訪問一個個微服務了,這些方式有很多的弊端,上次都說了,針對這些弊端,我們用一種什麼樣的方式去解決呢,那就是springcloud為我們整合一個框架zuul統一的微服務,在這些所有的後端的微服務中間加了一層閘道器層,閘道器層類似於設計模式裡面的門面模式,就是靠這種門面進行隔離讓後端的和請求端進行隔離解耦,互相之前不進行相互的影響,他們之前的影響都通過門面來進行解決。切記:閘道器呼叫後端的微服務,全部使用無狀態請求。
原始碼:https://github.com/limingios/netFuture/tree/master/原始碼/『網際網路架構』軟體架構-zuul微服務閘道器(中)(101)/
(一)zuul聚合微服務
許多場景下,外部請求需要查詢 zuul後端的多個微服務。舉個例子,一個電影售票手機APP,在購票訂單頁上,既需要查詢“電影微服務"獲得電影相關資訊,又需要查詢“使用者微服務"獲得當前使用者的資訊。如果讓手機端直接請求各個微服務(即使使用 zuul進行轉發),那麼網路開銷、流量耗費、耗費時長可能都無法令我們滿意。那麼對於這種場景,可使用 zuul聚合微服務請求一一一手機 APP只需傳送一個請求給 zuul,由 zuul請求使用者微服務以及電影微服務,並組織好資料給手機 APP,使用這種方式,手機端只須傳送一次請求即可,簡化了客戶端側的開發;不僅如此,由於 zuul、使用者微服務、電影微服務一般都在同一個區域網中,因此速度會非常快,效率會非常高。
例項程式碼08-ms-gateway-zuul-aggregation
執行專案(需啟動兩個使用者微服務和一個訂單微服務,eureka-server,zuul的專案1.08-ms-consumer-order-ribbon2.08-ms-eureka-server3.08-ms-gateway-zuul-aggregation4.08-ms-provider-usereureka裡面有3個服務
聚合請求其實就是訪問一個zuul的一個controller,通過zuul中的controller來選擇性的請求多個微服務。http://127.0.0.1:8040/aggregate/1
一個請求order的微服務,一個請求user的微服務。
(二)zuul的路由配置
原始碼前文已經編寫了一個簡單的 zuul閘道器,並讓該閘道器代理了所有註冊到 Eureka server的微服務。但在現實中可能只想讓 zuul代理部分微服務,又或者需要對 URL進行更加精確的控制。
路由忽略微服務08-ms-gateway-zuul
配置忽略指定微服務,只需在application.yml里加上如下配置
zuul: ignored-services: microservice-provider-user
其他路由配置課檢視專案示例的配置檔案
指定微服務地址routes, user = microservice-provider-user
server: port: 8040spring: application: name: microservice-gateway-zuuleureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: truezuul: routes: microservice-provider-user: /user/**management: security: enabled: false
忽略指定微服務ignored-services
server: port: 8040spring: application: name: microservice-gateway-zuuleureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: truezuul: ignored-services: microservice-provider-usermanagement: security: enabled: false
忽略所有微服務,只路由指定的微服務
server: port: 8040spring: application: name: microservice-gateway-zuuleureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: truezuul: ignored-services: '*' # 使用'*'可忽略所有微服務 routes: microservice-provider-user: /user/**management: security: enabled: false
同時指定微服務的serviceId和對應路徑
server: port: 8040spring: application: name: microservice-gateway-zuuleureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: truezuul: routes: user-route: # 該配置方式中,user-route只是給路由一個名稱,可以任意起名。 service-id: microservice-provider-user path: /user/** # service-id對應的路徑management: security: enabled: false
同時指定path和url
server: port: 8040spring: application: name: microservice-gateway-zuuleureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: truezuul: routes: user-route: # 該配置方式中,user-route只是給路由一個名稱,可以任意起名。 url: http://localhost:8000/ # 指定的url path: /user/** # url對應的路徑。 這樣就可以將/user/**對映到http://localhost:8000/**,這種方式訪問不會作為HystrixCommand執行,也不能使用ribbon來負載多個URL,例6可以解決該問題management: security: enabled: false
強烈建議使用下面的配置,同時指定path和URL,並且不破壞Zuul的Hystrix、Ribbon特性。
server: port: 8040spring: application: name: microservice-gateway-zuuleureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: truezuul: routes: user-route: path: /user/** service-id: microservice-provider-userribbon: eureka: enabled: false # 禁用掉ribbon的eureka使用microservice-provider-user: ribbon: listOfServers: localhost:8000,localhost:8001management: security: enabled: false
為Zuul新增對映字首1
server: port: 8040spring: application: name: microservice-gateway-zuuleureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: truezuul: prefix: /api strip-prefix: false routes: microservice-provider-user: /user/**logging: level: com.netflix: DEBUGmanagement: security: enabled: false# 訪問Zuul的/api/microservice-provider-user/1路徑,請求將會被轉發到microservice-provider-user的/api/1,可檢視日誌列印,有助於理解。
為Zuul新增對映字首2
server: port: 8040spring: application: name: microservice-gateway-zuuleureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: truezuul: routes: microservice-provider-user: path: /user/** strip-prefix: falselogging: level: com.netflix: DEBUGmanagement: security: enabled: false# 這樣訪問Zuul的/user/1路徑,請求將會被轉發到microservice-provider-user的/user/1,可檢視日誌列印,有助於理解。
忽略某些路徑
server: port: 8040spring: application: name: microservice-gateway-zuuleureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: truezuul: ignoredPatterns: /**/admin/** # 忽略所有包括/admin/的路徑 routes: microservice-provider-user: /user/**management: security: enabled: false
忽略某些路徑
server: port: 8040spring: application: name: microservice-gateway-zuuleureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: truezuul: routes: route-name: path: /path-a/** url: forward:/path-bmanagement: security: enabled: false
忽略某些路徑
server: port: 8040spring: application: name: microservice-gateway-zuuleureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: truezuul: routes: route-name: path: /path-a/** url: forward:/path-bmanagement: security: enabled: false
其實上邊的例子:https://cloud.spring.io/spring-cloud-static/Edgware.SR6/single/spring-cloud.html 都是從官網拆出來的,要看一手文件。其實我就是搬運工,加上了自己的理解。
PS:這次說了zuul的路由和在zuul閘道器做聚合專案。下次繼續說zuul的微閘道器設定。