Spring Cloud 微服务项目实战
姚秋辰(姚半仙)
PayPal 研发经理
15862 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
结束语 (1讲)
Spring Cloud 微服务项目实战
15
15
1.0x
00:00/00:00
登录|注册

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
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • Ever
    没明白为啥不直接在nacos上用spring.cloud.gateway.routes配置项配置路由,明明本身就支持动态刷新,哪里需要画蛇添足自定义监听配置和刷新路由。 RefreshRoutesEvent 事件会触发路由刷新,这一步本身就比较耗CPU(可以自己抓个火焰图),这里在forEach里还不停触发是否合理(放在循环外面不是更好)。

    作者回复: 文中我特意提到“我这里我不打算使用 @RefreshScope 来获取 Nacos 动态参数了”,前者Nacos动态属性是很容易就能想到的方案,前面章节也都学过了,所以为了兼具演示Nacos Config实现监听的原理和过程,才用了一套可以更加灵活做自定义配置的listener。

    2022-05-21
    6
    10
  • theodore
    我们的路由是自己实现的前后端分离的服务,增删改查都在上面操作 没有依靠nacos config

    作者回复: 这个吊炸天,大中台路由:)

    2022-04-07
    4
  • 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-14
    1
  • so long
    请教老师一个问题:publisher.publishEvent(new RefreshRoutesEvent(this));这行代码是必须的吗?我自己测试的时候执行该行代码后就卡主不会往下执行了,然后我注释掉该行代码,也可以实现路由的动态刷新。

    作者回复: RefreshRoutesEvent做了很多善后的事儿,比如说清理cache啊之类的,还有很多类似的注解,比如@RefreshScope注解背后也会发布一个Event,他们背后都有不少的其它支线任务

    2022-03-01
    4
  • Geek_bf202a
    publisher.publishEvent(new RefreshRoutesEvent(this)); 这行代码会导致gateway项目起不来,卡住,怎么解决呢?
    2023-10-12归属地:广东
    1
  • Geek_bf202a
    publisher.publishEvent(new RefreshRoutesEvent(this));
    2023-10-12归属地:广东
  • 安静的美男子
    看起来没有支持路由删除的场景,updateRoutes 实现的只支持新增、修改,不支持删除呀,如果删除了路由会不起效
    2023-04-25归属地:上海
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部