SpringCloud Gateway网关微服务实现动态路由功能

如何将自己的网关微服务从静态路由修改实现动态路由功能

0 什么是网关的动态路由

动态路由 = 网关不用重启,不用改 yml,就能实时从注册中心 / 配置中心拿到最新的路由规则。

静态路由 vs 动态路由

特性 静态路由(Static Route) 动态路由(Dynamic Route)
配置方式 写死在 gateway.yml 从 Nacos/Consul/数据库实时读取
变更方式 必须重启网关 变更后 立刻生效,无需重启
适用场景 路由很少改变 微服务频繁扩缩容、上线下架
故障恢复 手动改配置 自动感知服务上线/下线

1 删除/注释 gateway 本地的静态 routes

你当前的 bootstrap.yml 中应该有类似内容:

1
2
3
4
5
6
7
8
spring:
cloud:
gateway:
routes:
- id: aimin-search-server
uri: lb://aimin-search
predicates:
- Path=/aimin-search/**

把整个 spring.cloud.gateway.routes 注释或删除

1
2
3
4
5
# spring:
# cloud:
# gateway:
# routes:
# ...

因为路由将从 Nacos 加载。

2 在 bootstrap.yml 增加动态路由的 Nacos 配置引入

bootstrap.yml 添加以下内容(要放到 spring.config.import 下):

1
2
3
4
spring:
config:
import:
- nacos:gateway-routes.yaml

注意:gateway-routes.yaml 是你即将创建的 Nacos 配置文件

3 在 Nacos 中创建动态路由文件 gateway-routes.yaml

Nacos ➝ 配置管理 ➝ 新建配置

项目 内容
Data ID gateway-routes.yaml
Group DEFAULT_GROUP
格式 YAML

写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
spring:
cloud:
gateway:
routes:
- id: aimin-auth-server
uri: lb://aimin-auth
predicates:
- Path=/aimin-auth/**

- id: aimin-drug-server
uri: lb://aimin-drug
predicates:
- Path=/aimin-drug/**

- id: aimin-admin-server
uri: lb://aimin-admin
predicates:
- Path=/aimin-admin/**

- id: aimin-search-server
uri: lb://aimin-search
predicates:
- Path=/aimin-search/**

- id: aimin-ai-server
uri: lb://aimin-ai
predicates:
- Path=/aimin-ai/**

4 开启自动刷新配置(你已实现)

在这个类依赖 Nacos 的配置,并且希望在不重启应用的情况下让配置生效,就必须加 @RefreshScope

1
@RefreshScope

例如:

1
2
3
4
5
6
7
8
9
10
@Data
@NoArgsConstructor
@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "security.ignore")
public class IgnoreWhiteProperties {

private List<String> whites = new ArrayList<>();

}

5 最终实现

路由文件 gateway-routes.yaml 修改 → 网关立即刷新

END