27 | 微服务网关:如何借助 Nacos 实现动态路由规则?
姚秋辰
你好,我是姚秋辰。
在上节课中,我们通过一系列谓词和过滤器的组合为三个微服务模块配置了路由规则,这套方案足以应对大部分线上业务的需求,但在可扩展性方面还不够完美。为什么这么说呢?因为这些路由规则是以 yml 文件或者 Java 代码配置在项目中的静态规则。随着项目启动,这些路由规则会被加载到应用上下文并生效。但在程序运行期,如果我们想要改变这些预定义的路由规则,或者创建新的路由规则,似乎只有提交改动到 Gateway 组件 -> 编译项目 -> 重新部署这一条路子。
那么,如果我们希望不重新部署网关,就能更改路由规则,可以有哪些途径呢?
有一种“临时性”的方案,是借助 Gateway 网关的 actuator endpoiont 进行 CRUD。Gateway 组件内定义了一套内置的 actuator endpoints,当满足下面两个条件时,我们就可以借助 actuator 提供的能力对路由表进行修改了。
项目中存在 spring-boot-starter-actuator 依赖项;
Gateway 组件的 actuator endpoint 已对外开放。
为了满足上面这两个条件,我已经将配置项添加到了 Gateway 模块中,并且在 application.yml 文件中的 management 节点下,对外开放了所有 actuator 端点。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
利用Nacos实现动态路由规则的持久化是一种重要的技术方案。本文详细介绍了如何通过Nacos Config实现动态路由规则的持久化,包括使用Nacos Config添加动态路由表、定义底层的网关路由规则编辑类GatewayService、中间层转换层DynamicRoutesListener的实现以及动态加载Nacos路由配置文件的过程。作者还提到了在Nacos中创建路由规则配置文件的步骤,并强调了搭建了一套可被持久化的动态路由方案。此外,文章还提供了一个思考题,引导读者设计并实现一个优雅的路由删除方案。通过本文,读者可以快速了解如何利用Nacos实现动态路由规则的持久化,并且得到了进一步思考和探索的启发。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Spring Cloud 微服务项目实战》,新⼈⾸单¥59
《Spring Cloud 微服务项目实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(7)
- 最新
- 精选
- Ever没明白为啥不直接在nacos上用spring.cloud.gateway.routes配置项配置路由,明明本身就支持动态刷新,哪里需要画蛇添足自定义监听配置和刷新路由。 RefreshRoutesEvent 事件会触发路由刷新,这一步本身就比较耗CPU(可以自己抓个火焰图),这里在forEach里还不停触发是否合理(放在循环外面不是更好)。
作者回复: 文中我特意提到“我这里我不打算使用 @RefreshScope 来获取 Nacos 动态参数了”,前者Nacos动态属性是很容易就能想到的方案,前面章节也都学过了,所以为了兼具演示Nacos Config实现监听的原理和过程,才用了一套可以更加灵活做自定义配置的listener。
2022-05-21610 - theodore我们的路由是自己实现的前后端分离的服务,增删改查都在上面操作 没有依靠nacos config
作者回复: 这个吊炸天,大中台路由:)
2022-04-074 - peter请教老师四个问题啊: Q1:Gateway内置的actuator endpoint是Gateway独有的?还是具有通用性?比如其他的组件(e.g,nacos)也可以加入actuator endpoint? Q2:DynamicRoutesListener是观察者模式吗? Q3:DynamicRoutesLoader是把Nacos中的文件“routes-config.json”读取过来吗?(相当于跨进程或跨机器传输文件) Q4:在middleware下面的Gateway这个module本身是个独立的服务,它不同于Gateway组件,对吗? 如果是这样,GatewayService是定义在Gateway这个服务中的,GatewayService要把路由信息更新到Gateway组件的上下文中,是通过跨进程或跨机器通信,对吗?
作者回复: Q1:通用规范接口,理念类似于jmx Q2:设计模式是微观层面的实现,很难把某个功能归类到设计模式上。只能说表现方式上是observer,但底层实现复杂得多 Q3:读取文件内容 Q4:gatewayserv是gateway这个module的一个类,和templateserv->Template模块这个所属关系一样
2022-02-141 - so long请教老师一个问题:publisher.publishEvent(new RefreshRoutesEvent(this));这行代码是必须的吗?我自己测试的时候执行该行代码后就卡主不会往下执行了,然后我注释掉该行代码,也可以实现路由的动态刷新。
作者回复: RefreshRoutesEvent做了很多善后的事儿,比如说清理cache啊之类的,还有很多类似的注解,比如@RefreshScope注解背后也会发布一个Event,他们背后都有不少的其它支线任务
2022-03-014 - Geek_bf202apublisher.publishEvent(new RefreshRoutesEvent(this)); 这行代码会导致gateway项目起不来,卡住,怎么解决呢?2023-10-12归属地:广东1
- Geek_bf202apublisher.publishEvent(new RefreshRoutesEvent(this));2023-10-12归属地:广东
- 安静的美男子看起来没有支持路由删除的场景,updateRoutes 实现的只支持新增、修改,不支持删除呀,如果删除了路由会不起效2023-04-25归属地:上海
收起评论