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

上一節( 跟我學Spring Cloud(Finchley版)-16-Zuul )中,已經實現用Zuul轉發到Eureka上的微服務。默認的路由規則是:訪問$ZUUL_URL/指定爲服務/** 會被轉發到指定微服務/**git

但在實際項目中,每每須要本身定義路由規則,Zuul的路由配置很是靈活、簡單,本節詳細講解Zuul的路由配置。github

1、自定義指定微服務的訪問路徑

配置zuul.routes.指定微服務的serviceId = 指定路徑 便可。例如:正則表達式

zuul:
  routes:
    microservice-provider-user: /user/**

這樣設置,microservice-provider-user微服務就會被映射到/user/**路徑。spring

2、忽略指定微服務

忽略服務很是簡單,能夠使用zuul.ignored-services 配置須要忽略的服務,多個用逗號分隔。例如:api

zuul:
  ignored-services: microservice-provider-user,microservice-consumer-movie

這樣就可以讓Zuul忽略microservice-provider-user和microservice-consumer-movie微服務,只代理其餘微服務。app

3、忽略全部微服務,只路由指定的微服務

不少場景下,咱們可能只想要讓Zuul代理指定的微服務,此時能夠將zuul.ignored-services 設爲’*’負載均衡

zuul:
  ignored-services: '*'   # 使用'*'可忽略全部微服務
  routes:
    microservice-provider-user: /user/**

這樣就可讓Zuul只路由microservice-provider-user微服務。ide

4、同時指定微服務的serviceId和對應路徑

例如:函數

zuul:
  routes:
    user-route:                   # 該配置方式中,user-route只是給路由一個名稱,能夠任意起名。
      service-id: microservice-provider-user
      path: /user/**              # service-id對應的路徑

本例配置的效果同示例(1)。微服務

5、同時指定path和URL,例如:

zuul:
  routes:
    user-route:                   # 該配置方式中,user-route只是給路由一個名稱,能夠任意起名。
      url: http://localhost:8000/ # 指定的url
      path: /user/**              # url對應的路徑。

這樣就能夠將/user/** 映射到http://localhost:8000/**

須要注意的是,使用這種方式配置的路由不會做爲HystrixCommand執行,同時也不能使用Ribbon來負載均衡多個URL。例(6)可解決該問題。

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特性了。

7、使用正則表達式指定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/**這個路徑。

8、路由前綴

示例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

9、忽略某些路徑

上文咱們講解了如何忽略微服務,但有時咱們還須要更細粒度的路由控制。例如,咱們想讓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/

乾貨分享

全是乾貨哦!

相關文章
相關標籤/搜索