Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单

一、说明
网关的核心概念就是路由配置和路由规则,而作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,是尽量要避免重启的,所以实现动态路由是非常有必要的;本文主要介绍 Spring Cloud Gateway 实现的思路,并且以Nacos为数据源来讲解
PS:关于 Spring Cloud Zuul 的动态路由请看文章《Spring Cloud Zuul的动态路由怎样做?集成Nacos实现很简单》
二、实现要点
要实现动态路由只需关注下面4个点
- 网关启动时,
动态路由的数据怎样加载进来 静态路由与动态路由以那个为准,ps:静态路由指的是配置文件里写死的路由配置- 监听
动态路由的数据源变化 - 数据有变化时怎样
通知gateway刷新路由
三、具体实现
Spring Cloud Gateway 中加载路由信息分别由以下几个类负责
- PropertiesRouteDefinitionLocator:从配置文件中读取路由信息(如YML、Properties等)
- RouteDefinitionRepository:从存储器中读取路由信息(如内存、配置中心、Redis、MySQL等)
- DiscoveryClientRouteDefinitionLocator:从注册中心中读取路由信息(如Nacos、Eurka、Zookeeper等)
我们可以通过自定义 RouteDefinitionRepository 的实现类来实现动态路由的目的
3.1. 实现动态路由的数据加载
创建一个Nacos的RouteDefinitionRepository实现类
NacosRouteDefinitionRepository类可查看:NacosRouteDefinitionRepository.java

重写
getRouteDefinitions方法实现路由信息的读取
配置Nacos监听器,监听路由配置信息的变化

路由变化只需要往
ApplicationEventPublisher推送一个RefreshRoutesEvent事件即刻,gateway会自动监听该事件并调用getRouteDefinitions方法更新路由信息
3.2. 创建配置类
DynamicRouteConfig类可查看:DynamicRouteConfig.java

3.3. 添加Nacos路由配置

新增配置项:
- Data Id:scg-routes
- Group:SCG_GATEWAY
- 配置内容:
[
{
"id": "csdn",
"predicates": [{
"name": "Path",
"args": {
"pattern": "/csdn/**"
}
}],
"uri": "https://www.csdn.net/",
"filters": []
},
{
"id": "github",
"predicates": [{
"name": "Path",
"args": {
"pattern": "/github/**"
}
}],
"uri": "http://github.com/",
"filters": []
}
]
添加两条路由数据
四、测试
启动网关通过 /actuator/gateway/routes 端点查看当前路由信息

可以看到
Nacos里配置的两条路由信息
完整的Spring Cloud Gateway代码请查看
https://gitee.com/zlt2000/microservices-platform/tree/master/zlt-gateway/sc-gateway
推荐阅读
- 日志排查问题困难?分布式日志链路跟踪来帮你
- zuul集成Sentinel最新的网关流控组件
- Spring Cloud Zuul的动态路由怎样做?集成Nacos实现很简单
- Spring Cloud开发人员如何解决服务冲突和实例乱窜?
- Spring Cloud同步场景分布式事务怎样做?试试Seata
- Spring Cloud异步场景分布式事务怎样做?试试RocketMQ
扫码关注有惊喜!

Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单的更多相关文章
- Spring Cloud Zuul的动态路由怎样做?集成Nacos实现很简单
一.说明 网关的核心概念就是路由配置和路由规则,而作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,是尽量要避免重启的,所以实现动态路由是非常有必要的:本文主要介绍实现的思路,并且以Na ...
- Spring Cloud Gateway之动态路由(数据库版)
1.实现动态路由的关键是RouteDefinitionRepository接口,该接口存在一个默认实现(InMemoryRouteDefinitionRepository) 通过名字我们应该也知道该实 ...
- Spring cloud gateway 如何在路由时进行负载均衡
本文为博主原创,转载请注明出处: 1.spring cloud gateway 配置路由 在网关模块的配置文件中配置路由: spring: cloud: gateway: routes: - id: ...
- spring cloud学习(四) 动态路由
Zuul的主要功能是路由和过滤器.路由功能是微服务的一部分,zuul实现了负载均衡. 1.1 新建模块zuul pom.xml <?xml version="1.0" enc ...
- Spring Cloud Zuul实现动态路由
1.添加依赖 2.启动类上添加注解 3.配置文件 zuul.ignored-services配置需要忽略的服务,多个用逗号分隔 注释zuul.ignored-services 前: 注释zuul.ig ...
- Spring Cloud同步场景分布式事务怎样做?试试Seata
一.概述 在微服务架构下,虽然我们会尽量避免分布式事务,但是只要业务复杂的情况下这是一个绕不开的问题,如何保证业务数据一致性呢?本文主要介绍同步场景下使用Seata的AT模式来解决一致性问题. Sea ...
- Spring Cloud异步场景分布式事务怎样做?试试RocketMQ
一.背景 在微服务架构中,我们常常使用异步化的手段来提升系统的 吞吐量 和 解耦 上下游,而构建异步架构最常用的手段就是使用 消息队列(MQ),那异步架构怎样才能实现数据一致性呢?本文主要介绍如何使用 ...
- Spring Cloud Alibaba学习笔记(16) - Spring Cloud Gateway 内置的路由谓词工厂
Spring Cloud Gateway路由配置的两种形式 Spring Cloud Gateway的路由配置有两种形式,分别是路由到指定的URL以及路由到指定的微服务,在上文博客的示例中我们就已经使 ...
- .net core下,Ocelot网关与Spring Cloud Gateway网关的对比测试
有感于 myzony 发布的 针对 Ocelot 网关的性能测试 ,并且公司下一步也需要对.net和java的应用做一定的整合,于是对Ocelot网关.Spring Cloud Gateway网关做个 ...
随机推荐
- System类入门学习
System类 System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包.其包含一些有用的字段和方法,不能被实例化 system中包含了in.out和err三 ...
- Day 2 Bash shell 认识
1.拍摄虚拟机的快照 2. 什么是Bash shell? 命令解释器,将用户输入的命令,翻译给内核程序,将用户输入的指令翻译给内核 程序,内核处理完成之后将结果返回给bash. 如何打开一个bash窗 ...
- PiVot 用法
基本语法: SELECT <非透视的列>, [第一个透视的列] AS <列名称>, [第二个透视的列] AS <列名称>, ... [最后一个透视的列] AS &l ...
- Spring入门(十三):Spring MVC常用注解讲解
在使用Spring MVC开发Web应用程序时,控制器Controller的开发非常重要,虽然说视图(JSP或者是Thymeleaf)也很重要,因为它才是直接呈现给用户的,不过由于现在前端越来越重要, ...
- HTML表格列表简介
HTML简介: html列表: ol标签:order list 有序列表. ul标签:unorder list 无序列表. li标签:list item 列表项. style属性: 标签内写css表达 ...
- [MySQL] 02- Optimisation solutions
前言 一.资源 MySQL 对于千万级的大表要怎么优化? - MySQL - 知乎[方法论] MySQL大表优化方案[一些优化的细节操作] MySQL大表优化方案[一些优化的细节操作] 分布式数据库下 ...
- vue报错:[Vue warn]: Do not use built-in or reserved HTML elements as component id: header
报错的信息大致是不要将内置或保留的HTML元素用作组件ID 解决的办法是修改name符合规范或者直接删除组件内的name属性.
- class命名归类
常见class关键词: 布局类:header, footer, container, main, content, aside, page, section 包裹类:wrap, inner 区块类:r ...
- 解决微信小程序开发中wxss中不能用本地图片
微信小程序开发中wxss中不能用本地图片,我们可以用将我们的图片传到服务器上,然后直接引用在线地址.但是当我们没有服务器时,我们可以用"图床",这个具体可以百度.这里我们用第二种方 ...
- centos文件解压缩7z
1.7z 安装 yum install p7zip 压缩test文件夹生成test.7z 7za a -t7z -r test.7z test #a 代表添加文件/文件夹到压缩包 -t 是指定压缩类型 ...