跟我學Spring Cloud(Finchley版)-17-Zuul路由配置詳解

上一節( 跟我學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/

乾貨分享

全是乾貨哦!

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