1、Zuul的路由端點java
當@EnableZuulProxy與SpringBoot Actuator配合使用時,Zuul會暴露一個路由管理端點/routes。藉助這個端點,能夠方便、直觀地查看以及管理Zuul的路由。正則表達式
/routes端點的使用很是簡單,使用GET方法訪問該端點,便可返回Zuul當前映射的路由列表;使用POST方法訪問該端點就會強制刷新Zuul當前映射的路由列表(儘管路由會自動刷新,Spring Cloud依然提供了強制當即刷新的方式)。spring
因爲spring-cloud-starter-zuul已經包含了spring-boot-starter-actuator,所以以前編寫的microservice-gateway-zuul已具有路由管理的能力。api
測試:app
一、依次啓動eureka-server(4010)、eureka-server-2(5010)、provide-user(4011)、hystrix-consumer-movie(5012)、microservice-gateway-zuul(5016)負載均衡
二、訪問http://localhost:5016/routes,結果報401ide
解決:配置management.security.enabled=falsespring-boot
從中能夠直觀地看出路徑到微服務的映射。微服務
2、路由配置詳解
測試
前面已經編寫了一個簡單的Zuul網關,並讓該網關代理了全部註冊到Eureka Server的微服務。但在現實中可能只想讓Zuul代理部分微服務,又或者須要對URL進行更加精確的控制。
2.一、自定義指定微服務的訪問路徑
配置zuul.routes.指定微服務的serverId = 指定路徑便可。例如:
zuul: routes: hystrix-consumer-movie: /movie/**
效果:
2.二、忽略指定微服務
使用zuul.ignored-services配置須要忽略的服務,多個用逗號分隔,例如:
zuul: ignored-services: provide-user
效果:
2.三、忽略全部微服務,只路由指定微服務
將zuul.ignored-services設爲'*',routes配置指定的微服務,例如:
zuul: ignored-services: '*' routes: hystrix-consumer-movie: /movie/**
效果:
2.四、同時指定微服務的serviceId和對應的路徑
zuul: routes: user-route: # user-route只是給路由一個名稱,能夠隨便命名 service-id: hystrix-consumer-movie path: /movie/** # service-id對應的路徑
效果與2.1同樣。
2.五、同時指定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
效果:
注意:使用這種方式配置的路由不會做爲HystrixCommand執行,同時也不能使用Ribbon來負載均衡多個URL
2.六、同時指定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.七、使用正則表達式指定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.八、路由前綴
設置 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.九、忽略某些路徑
2.2中有講有忽略微服務,可是有時須要更細粒度的路由控制。如,想讓Zuul代理某個微服務,同時又想保護該微服務的某些敏感路徑。此時,可以使用ignored-patterns指定忽略的正則,如:
zuul: ignored-patterns: /**/provide-user/** # 忽略全部包含/provide-user/的路徑