关于 Zuul + Nacos 自动注册路由
有个项目中使用了 Zuul + Nacos 实现的网关,服务启用了 discovery client( @EnableDiscoveryClient
),默认情况下会动态的为注册到 Nacos 的服务配置一个同名的路由。
自动注册路由的具体处理可以参考 DiscoveryClientRouteLocator
、 CompositeDiscoveryClient
和 NacosDiscoveryClient
这几个类。
本次调查对应依赖的版本:
- spring-cloud-netflix-zuul:2.1.3.RELEASE
- spring-cloud-alibaba-nacos-discovery:2.1.1.RELEASE
由于是自动注册路由,可能会导致不小心暴露本来不应该公开的服务(如仅内网可访问的服务)。虽然网关一般都会有统一的鉴权,但风险总归还是有的。
案 1:禁用路由自动注册
此时可以将 spring.cloud.nacos.discovery.enabled
设置为 false
来禁用自动注册路由。这个配置项默认为 true
。
禁用后就需要在 zuul.routes
中手动配置路由和服务的映射关系。
spring:
cloud:
nacos:
discovery:
enabled: false
zuul:
routes:
user-route:
path: /user-path/**
url: user-service-name
zuul.routes 在代码中是一个 Map<String, ZuulRoute>
类型的实例:
key
- 上面示例中的 user-route ,只要不重复即可。
value
path
:匹配的路由路径;url
:映射的服务名,需要和注册到 Nacos 中的服务名称一致;- 其它配置项见
ZuulRoute
类。
这种方案会带来一些使用起来不太方便的地方:
所有服务路由都要手动配置;
在 Nacos 中删除路由后需要重启网关服务才能生效。
新增路由映射时会自动添加,但是删除时不会自动删除。至于为什么没有自动删除可以参考这篇文章。
案 2:忽略指定服务注册路由
在启用自动注册路由时,通过 zuul.ignored-services 来配置需要被忽略的服务。
这个配置项支持使用通配符 *
。
zuul:
ignored-services:
- current-service-name
- ignored-service-name
- private-service-*
注意:DiscoveryClientRouteLocator
默认会将当前服务添加到这个配置项,但是如果服务启动后又在 Nacos 中修改了 zuul.ignored-services ,配置刷新后将不再忽略当前服务。为保持一致,如果使用这种方式,建议将当前服务也添加到忽略服务列表里。