上一節( 跟我學Spring Cloud(Finchley版)-16-Zuul )中,已經實現用Zuul轉發到Eureka上的微服務。默認的路由規則是:訪問$ZUUL_URL/指定爲服務/**
會被轉發到指定微服務
的/**
。git
但在實際項目中,每每須要本身定義路由規則,Zuul的路由配置很是靈活、簡單,本節詳細講解Zuul的路由配置。github
配置zuul.routes.指定微服務的serviceId = 指定路徑
便可。例如:正則表達式
zuul: routes: microservice-provider-user: /user/**
這樣設置,microservice-provider-user微服務就會被映射到/user/**路徑。spring
忽略服務很是簡單,能夠使用zuul.ignored-services
配置須要忽略的服務,多個用逗號分隔。例如:api
zuul: ignored-services: microservice-provider-user,microservice-consumer-movie
這樣就可以讓Zuul忽略microservice-provider-user和microservice-consumer-movie微服務,只代理其餘微服務。app
不少場景下,咱們可能只想要讓Zuul代理指定的微服務,此時能夠將zuul.ignored-services
設爲’*’負載均衡
zuul: ignored-services: '*' # 使用'*'可忽略全部微服務 routes: microservice-provider-user: /user/**
這樣就可讓Zuul只路由microservice-provider-user微服務。ide
例如:函數
zuul: routes: user-route: # 該配置方式中,user-route只是給路由一個名稱,能夠任意起名。 service-id: microservice-provider-user path: /user/** # service-id對應的路徑
本例配置的效果同示例(1)。微服務
zuul: routes: user-route: # 該配置方式中,user-route只是給路由一個名稱,能夠任意起名。 url: http://localhost:8000/ # 指定的url path: /user/** # url對應的路徑。
這樣就能夠將/user/**
映射到http://localhost:8000/**
。
須要注意的是,使用這種方式配置的路由不會做爲HystrixCommand執行,同時也不能使用Ribbon來負載均衡多個URL。例(6)可解決該問題。
zuul: routes: user-route: path: /user/** service-id: microservice-provider-user ribbon: eureka: enabled: false microservice-provider-user: ribbon: listOfServers: localhost:8000,localhost:8001
這樣就能夠既指定path與URL,又不破壞Zuul的Hystrix與Ribbon特性了。
藉助PatternServiceRouteMapper,實現從微服務到映射路由的正則配置。例如:
@Bean public PatternServiceRouteMapper serviceRouteMapper() { // 調用構造函數PatternServiceRouteMapper(String servicePattern, String routePattern) // servicePattern指定微服務的正則 // routePattern指定路由正則 return new PatternServiceRouteMapper("(?<name>^.+)-(?<version>v.+$)", "${version}/${name}"); }
經過這段代碼便可實現將諸如microservice-provider-user-v1這個微服務,映射到/v1/microservice-provider-user/**這個路徑。
示例1:
zuul: prefix: /api strip-prefix: false routes: microservice-provider-user: /user/**
這樣,訪問Zuul的/api/microservice-provider-user/1路徑,請求將會被轉發到microservice-provider-user的/api/1
示例2:
zuul: routes: microservice-provider-user: path: /user/** strip-prefix: false
這樣訪問Zuul的/user/1路徑,請求將會被轉發到microservice-provider-user的/user/1
TIPS:
① 可參考該Issue輔助理解: https://github.com/spring-cloud/spring-cloud-netflix/issues/1365
上文咱們講解了如何忽略微服務,但有時咱們還須要更細粒度的路由控制。例如,咱們想讓Zuul代理某個微服務,同時又想保護該微服務的某些敏感路徑。此時,可以使用ignoredPatterns,指定忽略的正則。例如:
zuul: ignoredPatterns: /**/admin/** # 忽略全部包含/admin/的路徑 routes: microservice-provider-user: /user/**
這樣就可將microservice-provider-user微服務映射到/user/**路徑,但會忽略該微服務中全部包含/admin/的路徑。
讀者如沒法掌握Zuul路由的規律,可將com.netflix包的日誌級別設爲DEBUG。這樣,Zuul就會打印轉發的具體細節,從而幫助咱們更好地理解Zuul的路由配置,例如:
logging: level: com.netflix: DEBUG
http://www.itmuch.com/spring-cloud/finchley-17/