- DiscoveryClientRouteDefinitionLocator:从注册中心中读取路由信息(如Nacos、Eurka、Zookeeper等)
我们可以通过自定义RouteDefinitionRepository的实现类来实现动态路由的目的。
实现动态路
有的数据加载我们可以查看源码RouteDefinitionRepository的存储的实现类,只有InMemoryRouteDefinitionRepository,此实现类是存放在内存中的。
我们可以重新定义一个nacos作为存储的实现,看下面的代码
上面代码核心的是重写 getRouteDefinitions 方法实现路由信息的读取;这个方法中涉及到了ConfigService对象Api的方法。
管理Api方法,这个老顾这里不详细说了;小伙伴们可以理解为就是操作nacos config的对象
配置Nacos监听器,监听路由配置信息的变化,也是利用api方法,也就是addListener方法;此方法一看就知道,就是用来监听config信息变化的。
此addListener方法中路由变化只需要往 ApplicationEventPublisher 推送一个 RefreshRoutesEvent 事件,即刻gateway会自动监听该事件并调用 getRouteDefinitions 方法更新路由信息。
这样就达到了动态更新路由了。
配置类
为了更好的把此动态路由作为公共core,我们需要利用配置类,达到是否启用的方式;可以让开发者自行配置。
上面的配置类,有两个重要的**@ConditionalOnProperty,这个就是用来控制是否启用动态路由,以及是否用nacos作为存储。**
里面还有@Value注解定义我们存储路由信息的DataId和Group,application.yml如果不配置默认值为scg-routes和SCG_GATEWAY
添加Nacos路由配置
在同一个namespace中创建scg-routes和SCG_GATEWAY
格式选择json,json体里面的格式其实就是RouteDefinition类的属性
注意上面的配置的json是数组格式哦,也就是可以有很多路由哦
[{
“id”: “baidu”,
“order”: 0,
“predicates”: [{
“args”: {
“pattern”: “/baidu/"
}, “name”: “Path”
}], “uri”: “https://www.baidu.com”
},{ “id”: “sina”,
“order”: 2,
“predicates”: [{
“args”: {
“pattern”: "/sina/”
}, “name”: “Path”
}], “uri”: “http://www.sina.com.cn”
}]
测试
在网关项目中的application.yml中配置
rainbow:
gateway:
dynamicRoute:
enabled: true
启动网关,就可以了;为了方便看到网关当前的路由信息,我们需要引入
org.springframework.boot spring-boot-starter-actuator并且在application.yml中配置
management:
endpoints:
web:
最后
由于细节内容实在太多了,为了不影响文章的观赏性,只截出了一部分知识点大致的介绍一下,每个小节点里面都有更细化的内容!
小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》
小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》
[外链图片转存中…(img-48SpeZWx-1719174632586)]