springCloud(14):使用Zuul構建微服務網關-路由端點與路由配置詳解

一、Zuul的路由端點

當@EnableZuulProxy與SpringBoot Actuator配合使用時,Zuul會暴露一個路由管理端點/routes。藉助這個端點,可以方便、直觀地查看以及管理Zuul的路由。

/routes端點的使用非常簡單,使用GET方法訪問該端點,即可返回Zuul當前映射的路由列表;使用POST方法訪問該端點就會強制刷新Zuul當前映射的路由列表(儘管路由會自動刷新,Spring Cloud依然提供了強制立即刷新的方式)。


由於spring-cloud-starter-zuul已經包含了spring-boot-starter-actuator,因此之前編寫的microservice-gateway-zuul已具備路由管理的能力。


測試:

 1、依次啓動eureka-server(4010)、eureka-server-2(5010)、provide-user(4011)、hystrix-consumer-movie(5012)、microservice-gateway-zuul(5016)

 2、訪問http://localhost:5016/routes,結果報401

   wKiom1mb7yqx4WhnAABaxJ8lMvI356.png

   解決:配置management.security.enabled=false

    wKioL1mb757gJcpcAABgwt7jkjQ519.png

從中可以直觀地看出路徑到微服務的映射。

二、路由配置詳解

前面已經編寫了一個簡單的Zuul網關,並讓該網關代理了所有註冊到Eureka Server的微服務。但在現實中可能只想讓Zuul代理部分微服務,又或者需要對URL進行更加精確的控制。

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

配置zuul.routes.指定微服務的serverId = 指定路徑即可。例如:

zuul:
  routes:
    hystrix-consumer-movie: /movie/**

效果:

  wKioL1mb8f7AXmvAAABDrim09uU285.png

2.2、忽略指定微服務

使用zuul.ignored-services配置需要忽略的服務,多個用逗號分隔,例如:

zuul:
  ignored-services: provide-user

效果:

  wKioL1mb85_wsI5PAABJQdh4oqo014.png

2.3、忽略所有微服務,只路由指定微服務

將zuul.ignored-services設爲'*',routes配置指定的微服務,例如:

zuul:
  ignored-services: '*'
  routes:
    hystrix-consumer-movie: /movie/**

效果:

  wKiom1mb9H-wKCpDAAAYNgu-ZBE372.png

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

zuul:
  routes:
    user-route: # user-route只是給路由一個名稱,可以隨便命名
     service-id: hystrix-consumer-movie
     path: /movie/**  # service-id對應的路徑

效果與2.1一樣。

2.5、同時指定path和URL

zuul:
  routes:
    user-route: # user-route只是給路由一個名稱,可以隨便命名
     url: http://localhost:5200/ #指定URL
     path: /movie/**  # URL對應的路徑

說明:當訪問http://localhost:5016/movie/user/1時,則會轉發至http://localhost:5200/user/1

效果:

  wKiom1mb9q_Q0q0OAABCOErrr7s599.png

注意:使用這種方式配置的路由不會作爲HystrixCommand執行,同時也不能使用Ribbon來負載均衡多個URL

2.6、同時指定path和URL,並且不破壞Hystrix、Ribbon特性

zuul:
  routes:
    user-route: 
     path: /user/** 
     service-id: provide-user
ribbon: 
  eureka: 
    enabled: false  # 爲Ribbon禁用Eureka
provide-user: # 這邊是serviceId
  ribbon: 
    listOfServers: http://localhost:4011,http://localhost:4012

2.7、使用正則表達式指定Zuul的路由匹配規則

藉助PatternServiceRouteMapper,實現從微服務到映射路由的正則配置。

@SpringBootApplication
@EnableZuulProxy
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
	
	/*正則表達式指定Zuul的路由匹配規則**/
	@Bean
	public PatternServiceRouteMapper serviceRouteMapper() {
		return new PatternServiceRouteMapper("(?<name>^.+)-(?<version>v.+$)", "${version}/${name}");
	}
}

說明:上面將如provide-user-v2這個微服務,映射到/v2/provide-user/**這個路徑上

 例:我們隊微服務的serviceId命名爲provide-user-v2,那麼我們可以這麼來訪問http://localhost:5017/v2/provide-user/1

2.8、路由前綴

設置 zuul.prefix 可以爲所有的匹配增加前綴, 例如 /api,代理前綴默認會從請求路徑中移除(通過zuul.stripPrefix=false可以關閉這個功能),zuul.stripPrefix默認爲true.

如:配置全局的,與prefix一起使用

zuul:
  prefix: /api
  strip-prefix: true

當strip-prefix=true的時候 (http://localhost:5016/api/provide-user/1 -> http://localhost:4011/1)  

當strip-prefix=false的時候(http://localhost:5016/api/provide-user/1 -> http://localhost:4011/api/1)  

說明上面爲true的配置,當訪問zuul的/api/provide-user/1路徑,請求將會被轉發到provide-user微服務的/1路徑


如:配置局部的,與path一起使用

zuul:
  routes:
    provide-user: 
      path: /user/**
      strip-prefix: false

當strip-prefix=true的時候 (http://localhost:5016/user/1 -> http://localhost:4011/1)  

當strip-prefix=false的時候(http://localhost:5016/user/1 -> http://localhost:4011/user/1)

說明上面爲true的配置,當訪問zuul的/user/1路徑,請求將會被轉發到provide-user微服務的/1路徑

2.9、忽略某些路徑

2.2中有講有忽略微服務,但是有時需要更細粒度的路由控制。如,想讓Zuul代理某個微服務,同時又想保護該微服務的某些敏感路徑。此時,可使用ignored-patterns指定忽略的正則,如:

zuul:
  ignored-patterns: /**/provide-user/** # 忽略所有包含/provide-user/的路徑



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