Skip to content

关于 Zuul + Nacos 自动注册路由

🏷️ Zuul Nacos

有个项目中使用了 Zuul + Nacos 实现的网关,服务启用了 discovery client( @EnableDiscoveryClient ),默认情况下会动态的为注册到 Nacos 的服务配置一个同名的路由。

自动注册路由的具体处理可以参考 DiscoveryClientRouteLocatorCompositeDiscoveryClientNacosDiscoveryClient 这几个类。

本次调查对应依赖的版本:

  • spring-cloud-netflix-zuul2.1.3.RELEASE
  • spring-cloud-alibaba-nacos-discovery2.1.1.RELEASE

由于是自动注册路由,可能会导致不小心暴露本来不应该公开的服务(如仅内网可访问的服务)。虽然网关一般都会有统一的鉴权,但风险总归还是有的。

案 1:禁用路由自动注册

此时可以将 spring.cloud.nacos.discovery.enabled 设置为 false 来禁用自动注册路由。这个配置项默认为 true

禁用后就需要在 zuul.routes 中手动配置路由和服务的映射关系。

yaml
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 类。

这种方案会带来一些使用起来不太方便的地方:

  1. 所有服务路由都要手动配置;

  2. 在 Nacos 中删除路由后需要重启网关服务才能生效。

    新增路由映射时会自动添加,但是删除时不会自动删除。至于为什么没有自动删除可以参考这篇文章

案 2:忽略指定服务注册路由

在启用自动注册路由时,通过 zuul.ignored-services 来配置需要被忽略的服务。

这个配置项支持使用通配符 *

yaml
zuul:
  ignored-services:
    - current-service-name
    - ignored-service-name
    - private-service-*

注意DiscoveryClientRouteLocator 默认会将当前服务添加到这个配置项,但是如果服务启动后又在 Nacos 中修改了 zuul.ignored-services ,配置刷新后将不再忽略当前服务。为保持一致,如果使用这种方式,建议将当前服务也添加到忽略服务列表里。