一、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
解决:配置management.security.enabled=false
从中可以直观地看出路径到微服务的映射。
二、路由配置详解
前面已经编写了一个简单的Zuul网关,并让该网关代理了所有注册到Eureka Server的微服务。但在现实中可能只想让Zuul代理部分微服务,又或者需要对URL进行更加精确的控制。
2.1、自定义指定微服务的访问路径
配置zuul.routes.指定微服务的serverId = 指定路径即可。例如:
1
2
3
|
zuul:
routes:
hystrix-consumer-movie: /movie/**
|
效果:
2.2、忽略指定微服务
使用zuul.ignored-services配置需要忽略的服务,多个用逗号分隔,例如:
1
2
|
zuul:
ignored-services: provide-user
|
效果:
2.3、忽略所有微服务,只路由指定微服务
将zuul.ignored-services设为'*',routes配置指定的微服务,例如:
1
2
3
4
|
zuul:
ignored-services:
'*'
routes:
hystrix-consumer-movie: /movie/**
|
效果:
2.4、同时指定微服务的serviceId和对应的路径
1
2
3
4
5
|
zuul:
routes:
user-route:
# user-route只是给路由一个名称,可以随便命名
service-id: hystrix-consumer-movie
path: /movie/**
# service-id对应的路径
|
效果与2.1一样。
2.5、同时指定path和URL
1
2
3
4
5
|
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.6、同时指定path和URL,并且不破坏Hystrix、Ribbon特性
1
2
3
4
5
6
7
8
9
10
11
|
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,实现从微服务到映射路由的正则配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@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一起使用
1
2
3
|
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一起使用
1
2
3
4
5
|
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指定忽略的正则,如:
1
2
|
zuul:
ignored-patterns: /**/provide-user/**
# 忽略所有包含/provide-user/的路径
|