通过Nacos配置spring-cloud-gateway
的路由规则,实现路由规则的动态更新,代码在托管gateway-nacos
依赖
1 | <properties> |
spring-cloud-starter-alibaba-nacos-config
的原理是将配置信息注入到Spring
的environment
中,并在配置更新时自动触发context refresh
事件,从而将environment
环境中的配置变更为最新配置
application.yml
1 | server: |
bootstrap.properties
1 | spring.application.name=nacos-spring-cloud-gateway-example |
refresh要配置为true,否则不能动态更新 gateway.yaml 的配置项
App.java
1 | import org.springframework.boot.SpringApplication; |
在 Nacos 控制台新建 gateway.yaml 配置
Data ID: gateway.yaml
Group: DEFAULT_GROUP1
2
3
4
5
6
7
8
9
10
11
12spring:
cloud:
gateway:
routes:
- id: baidu
uri: https://www.baidu.com
predicates:
- Path=/s
- id: taobao
uri: https://www.taobao.com/
predicates:
- Path=/markets/3c/tbdc
配置完成后,执行 App.java
启动网关项目
浏览器访问
分别访问http://localhost:8080/s和http://localhost:8080/markets/3c/tbdc,能正常转发到百度、淘宝网站
修改 gateway.yaml 配置
1 | spring: |
控制台打印以下日志,说明配置修改已经被监听到1
2org.springframework.cloud.endpoint.event.RefreshEventListener.handle(37) | Refresh keys changed: [spring.cloud
.gateway.routes.xxx]
再次访问http://localhost:8080/markets/3c/tbdc,会返回404页面
说明修改的配置已经动态更新了
动态更新原理
- Nacos 配置更新的时候,
spring-cloud-starter-alibaba-nacos-config
会publish
一个RefreshEvent
事件,从而使spring-cloud-commons
的RefreshEventListener
监听到并触发ContextRefresher.refresh()
方法。 spring-cloud-gateway
的RouteRefreshListener
监听了ApplicationEvent
事件,当Nacos
触发ContextRefresher.refresh()
后,会监听到RefreshScopeRefreshedEvent
事件并调用RouteRefreshListener.reset()
方法publish
一个RefreshRoutesEvent
路由更新事件,达到路由动态更新的目的。
spring-cloud-alibaba-nacos-config
在spring-cloud-alibaba-nacos-config
中,会默认监听配置的更新,并publish refresh事件
- NacosRefreshProperties.java
1 |
|
...refresh.enabled:true
默认开启配置更新事件推送
- NacosContextRefresher.java
1 | public class NacosContextRefresher |
spring-cloud-gateway
- RefreshEventListener.java
1 | public class RefreshEventListener { |
- RouteRefreshListener.java
1 | public class RouteRefreshListener |