上一節( 跟我學Spring Cloud(Finchley版)-16-Zuul )中,已經實現用Zuul轉發到Eureka上的微服務。默認的路由規則是:訪問$ZUUL_URL/指定爲服務/**
會被轉發到指定微服務
的/**
。
但在實際項目中,往往需要自己定義路由規則,Zuul的路由配置非常靈活、簡單,本節詳細講解Zuul的路由配置。
一、自定義指定微服務的訪問路徑
配置zuul.routes.指定微服務的serviceId = 指定路徑
即可。例如:
zuul:
routes:
microservice-provider-user: /user/**
這樣設置,microservice-provider-user微服務就會被映射到/user/**路徑。
二、忽略指定微服務
忽略服務非常簡單,可以使用zuul.ignored-services
配置需要忽略的服務,多個用逗號分隔。例如:
zuul:
ignored-services: microservice-provider-user,microservice-consumer-movie
這樣就可讓Zuul忽略microservice-provider-user和microservice-consumer-movie微服務,只代理其他微服務。
三、忽略所有微服務,只路由指定的微服務
很多場景下,我們可能只想要讓Zuul代理指定的微服務,此時可以將zuul.ignored-services
設爲’*’
zuul:
ignored-services: '*' # 使用'*'可忽略所有微服務
routes:
microservice-provider-user: /user/**
這樣就可以讓Zuul只路由microservice-provider-user微服務。
四、同時指定微服務的serviceId和對應路徑
例如:
zuul:
routes:
user-route: # 該配置方式中,user-route只是給路由一個名稱,可以任意起名。
service-id: microservice-provider-user
path: /user/** # service-id對應的路徑
本例配置的效果同示例(1)。
五、同時指定path和URL,例如:
zuul:
routes:
user-route: # 該配置方式中,user-route只是給路由一個名稱,可以任意起名。
url: http://localhost:8000/ # 指定的url
path: /user/** # url對應的路徑。
這樣就可以將/user/**
映射到http://localhost:8000/**
。
需要注意的是,使用這種方式配置的路由不會作爲HystrixCommand執行,同時也不能使用Ribbon來負載均衡多個URL。例(6)可解決該問題。
六、同時指定path和URL,並且不破壞Zuul的Hystrix、Ribbon特性。
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特性了。
七、使用正則表達式指定Zuul的路由匹配規則
藉助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/