springcloud gateway通过数据库获取路由信息

在 Spring Cloud Gateway 中结合 MyBatis 动态从数据库加载路由配置,可以实现灵活的路由管理。以下是详细实现步骤:


1. 数据库表设计

创建路由配置表 gateway_route

CREATE TABLE `gateway_route` (`id` varchar(50) NOT NULL COMMENT '路由唯一标识',`uri` varchar(200) NOT NULL COMMENT '目标服务地址(如 lb://user-service)',`predicates` text COMMENT '路由断言(JSON 数组格式)',`filters` text COMMENT '路由过滤器(JSON 数组格式)',`order` int(11) DEFAULT '0' COMMENT '路由优先级',`enabled` tinyint(1) DEFAULT '1' COMMENT '是否启用',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
路由配置字段说明
字段名含义
iduser_route路由的唯一标识符,用于区分不同路由规则
urihttp://127.0.0.1:8081目标服务地址,请求将被转发到此地址
predicates[{"name":"Path","args":{"pattern":"/test/**"}}]路由断言规则,匹配请求路径
filters[{"name":"StripPrefix","args":{"parts":"1"}}]路由过滤器,修改请求路径
order0路由优先级(数值越小优先级越高)
enabled1是否启用该路由(1-启用,0-禁用)

示例数据:

INSERT INTO `gateway_route` 
VALUES ('user_route', 'lb://user-service', '[{"name":"Path","args":{"pattern":"/api/users/**"}}]','[{"name":"StripPrefix","args":{"parts":"1"}}]',0, 1);
 

2. 添加依赖

在 pom.xml 中添加以下依赖:

<!-- Spring Cloud Gateway -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency><!-- MyBatis 整合 Spring Boot -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency><!-- MySQL 驱动 -->
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
</dependency><!-- JSON 处理工具 -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>

3. 实体类与 Mapper

实体类 GatewayRoute
public class GatewayRoute {private String id;private String uri;private String predicates;  // JSON 字符串,如 [{"name":"Path", "args":{"pattern":"/api/**"}}]private String filters;     // JSON 字符串,如 [{"name":"StripPrefix", "args":{"parts":"1"}}]private int order;private boolean enabled;// Getters & Setters
}
 
Mapper 接口
@Mapper
public interface RouteMapper {@Select("SELECT * FROM gateway_route WHERE enabled = 1")List<GatewayRoute> findAllEnabledRoutes();
}

4. 动态路由加载实现

自定义路由仓库
@Component
public class DbRouteDefinitionRepository implements RouteDefinitionLocator {private final RouteMapper routeMapper;private final ObjectMapper objectMapper;public DbRouteDefinitionRepository(RouteMapper routeMapper, ObjectMapper objectMapper) {this.routeMapper = routeMapper;this.objectMapper = objectMapper;}@Overridepublic Flux<RouteDefinition> getRouteDefinitions() {List<GatewayRoute> routes = routeMapper.findAllEnabledRoutes();return Flux.fromIterable(routes).map(this::convertToRouteDefinition);}private RouteDefinition convertToRouteDefinition(GatewayRoute route) {RouteDefinition definition = new RouteDefinition();definition.setId(route.getId());definition.setUri(URI.create(route.getUri()));definition.setOrder(route.getOrder());try {// 解析 PredicatesList<PredicateDefinition> predicates = objectMapper.readValue(route.getPredicates(),new TypeReference<List<PredicateDefinition>>() {});definition.setPredicates(predicates);// 解析 FiltersList<FilterDefinition> filters = objectMapper.readValue(route.getFilters(),new TypeReference<List<FilterDefinition>>() {});definition.setFilters(filters);} catch (JsonProcessingException e) {throw new RuntimeException("路由配置解析失败: " + route.getId(), e);}return definition;}
}

5. 配置 MyBatis 和数据源

application.yml 配置
spring:datasource:url: jdbc:mysql://localhost:3306/gateway_db?useSSL=false&characterEncoding=utf8username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver# MyBatis 配置
mybatis:type-aliases-package: com.example.gateway.entity  # 实体类包路径configuration:map-underscore-to-camel-case: true  # 自动驼峰命名转换
启动类添加 Mapper 扫描
@SpringBootApplication
@MapperScan("com.example.gateway.mapper")  // 指定 Mapper 接口所在包
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}

6. 动态路由刷新接口

添加一个触发路由刷新的接口:

@RestController
@RequestMapping("/gateway")
public class RouteRefreshController {private final ApplicationEventPublisher eventPublisher;public RouteRefreshController(ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher;}@PostMapping("/refresh")public String refreshRoutes() {eventPublisher.publishEvent(new RefreshRoutesEvent(this));return "路由刷新成功";}
}

7. 测试验证

  1. 启动应用:确保数据库连接正常且表数据存在。

  2. 触发路由刷新

    curl -X POST http://localhost:8080/gateway/refresh

  3. 验证路由转发

    curl http://localhost:8080/api/users/1

    请求应被转发到 user-service 服务。

INSERT INTO gateway.gateway_route (id,uri,predicates,filters,`order`,enabled) VALUES('user_route','http://127.0.0.1:8081','[{"name":"Path","args":{"pattern":"/test/**"}}]','[{"name":"StripPrefix","args":{"parts":"1"}}]',0,1);

我启动的是普通的springboot项目,端口是8081

@RestController
@RequestMapping("/test")
public class TestController {@GetMapping(value = "/echo/{string}")public String echo(@PathVariable String string) {return string;}
}


8. 动态更新流程

  1. 修改数据库路由数据:通过 SQL 或管理界面更新路由配置。

  2. 调用刷新接口

    curl -X POST http://localhost:8080/gateway/refresh
  3. 观察日志:检查新路由是否加载成功。


常见问题与解决

问题 1:MyBatis Mapper 未注入
  • 错误信息No qualifying bean of type 'com.example.gateway.mapper.RouteMapper'

  • 解决

    1. 确认 @MapperScan 注解指定了正确的包路径。

    2. 检查 Mapper 接口是否有 @Mapper 注解。

问题 2:JSON 解析失败
  • 错误信息路由配置解析失败

  • 解决

    1. 检查数据库中的 predicates 和 filters 字段是否符合 JSON 格式。

    2. 使用 JSON 校验工具验证字段内容。

问题 3:路由未生效
  • 排查步骤

    1. 确认数据库中的 enabled 字段为 1

    2. 检查 uri 格式是否正确(如 lb://service-name 需确保服务发现已启用)。


9. 扩展优化

添加缓存

减少数据库频繁查询:

@Component
public class CachedRouteDefinitionRepository implements RouteDefinitionLocator {private final RouteDefinitionLocator delegate;private final Cache<String, RouteDefinition> cache = Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).build();public CachedRouteDefinitionRepository(RouteDefinitionLocator delegate) {this.delegate = delegate;}@Overridepublic Flux<RouteDefinition> getRouteDefinitions() {return delegate.getRouteDefinitions().doOnNext(route -> cache.put(route.getId(), route));}public RouteDefinition getRoute(String id) {return cache.getIfPresent(id);}
}
集成服务发现

在 uri 中使用 lb:// 格式时,确保已启用服务发现:

spring:cloud:discovery:enabled: true

通过以上步骤,即可实现基于 MyBatis 的 Spring Cloud Gateway 动态路由管理,支持通过数据库灵活配置和实时更新路由规则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32290.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯嵌入式组第十二届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之&#xff0c;藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 LED模块1.3.3 LCD模块1.3.4 TIM模块1.3.5 UART模块1.3.5.1 uart数据解析 2.源码3.第十二届题目 前言&#xff1a;STM32G431RBT6实现嵌入式组第十二届题目解析源码&#…

Git 的基本概念和使用方式(附有思维导图)

一、Git 简介 Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 在 2005 年为帮助管理 Linux 内核开发版本而开发 。与集中式版本控制系统&#xff08;如 SVN&#xff09;不同&#xff0c;在分布式系统中&#xff0c;每个开发者的本地机器都拥有一个完整的 G…

【微服务】Nacos 配置动态刷新(简易版)(附配置)

文章目录 1、实现方法2、配置依赖 yaml3、验证效果 1、实现方法 环境&#xff1a;Nacos、Java、SpringBoot等 主要是在boostrap.yaml中的data-id属性下配置refresh:true来实现动态更新 2、配置依赖 yaml 具体的版本参考官方的说明&#xff1a;官方版本说明 <!--读取boo…

mac 被禁用docker ui后,如何使用lima虚拟机启动docker

本机macos 安装lima brew install lima创建配置 echo "\\ndynamic:\n big-sur:\n image: docker://docker:git\n linux:\n image: docker.io/limasoftware/ubuntu:20.04 \\n" > ~/.lima/default.yaml启动名叫default的虚拟机 limactl start default进…

WIFI无ip分配之解决方法(Solution to WiFi without IP allocation)

WIFI无ip分配之解决方法 在信息化无比发达的当下社会&#xff0c;电脑在日常生活中也发挥着巨大的作用&#xff0c;不管是电脑还是手机只有在网络环境中才能得到更好的运用。然而很多朋友在使用网络的时候都会遇到一些问题&#xff0c;最常见的就是无线网络连接上但是WiFi无IP…

bootloader相关部分

简单说明 程序烧录的方式主要有ICP,ISP,IAP 其中ICP就是常用的jlink等工具 ISP就是利用MCU自带的一些特殊引脚烧录&#xff0c;比如uart IAP就是利用用户写的bootloader代码烧录 bootloader主要分为三层&#xff0c;厂家出厂的bootrom ,用户自己写的bootloader&#xff0c;…

同盾v2 2025版 blackbox , wasm加解密,逆向协议算法生成,小盾安全

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; # 欢迎交流 wjxch1004

云平台一键部署【SGLang】适用于大型语言模型和视觉语言模型的快速服务框架

SGLang 是一个适用于大型语言模型和视觉语言模型的快速服务框架。它通过共同设计后端运行时和前端语言&#xff0c;使您与模型的交互更快、更可控。 优点&#xff1a; 1.吞吐量碾压级优势 2.结构化输出快如闪电 3.多 GPU 优化 SGLang模型已经在趋动云『社区项目』上线&am…

Matlab深度学习ResNet、迁移学习多标签图像分类及超分辨率处理Grad CAM可视化分析COCO、手写数字数据集...

全文链接&#xff1a;https://tecdat.cn/?p40982 在当今数字化时代&#xff0c;图像分类和图像超分辨率处理是计算机视觉领域的重要研究方向。深度学习技术的发展为解决这些问题提供了强大的工具。本文将详细介绍如何使用Matlab构建多标签图像分类模型和图像到图像的回归网络&…

驾培市场与低空经济无人机融合技术详解

随着科技的飞速发展和社会的不断进步&#xff0c;驾培市场正面临着前所未有的变革。传统汽车驾驶培训已不再是唯一的选择&#xff0c;无人机驾驶等新兴领域正逐渐成为驾培市场的重要组成部分。本报告旨在探讨驾培市场与低空经济的融合发展&#xff0c;特别是应用型人才培养与驾…

OpenHarmony-SELinux配置

前言&#xff1a; OpenHarmony 上某个进程向samgr注册SA服务&#xff0c;其他进程在与该进程进行IPC通信之前&#xff0c;需要获取该SA服务&#xff0c;SA提供方需要为该SA配置SELinux标签&#xff0c;否则该SA会被SELinux配置为u:object_r:default_service:s0标签&#xff0c…

信息安全访问控制、抗攻击技术、安全体系和评估(高软42)

系列文章目录 信息安全访问控制、抗攻击技术、安全体系和评估 文章目录 系列文章目录前言一、信息安全技术1.访问控制2.抗攻击技术 二、欺骗技术1.ARP欺骗2.DNS欺骗3.IP欺骗 三、抗攻击技术1.端口扫描2.强化TCP/IP堆栈 四、保证体系和评估1.保证体系2.安全风险管理 五、真题在…

使用Nodejs基于DeepSeek加chromadb实现RAG检索增强生成 本地知识库

定义 检索增强生成&#xff08;RAG&#xff09;的基本定义 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称RAG&#xff09;是一种结合了信息检索技术与语言生成模型的人工智能技术。RAG通过从外部知识库中检索相关信息&#xff0c;并将其作为提示&…

LeeCode题库第五十二题

52.N皇后 项目场景&#xff1a; n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;2…

48. 旋转图像(C++)

题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]…

Ragflow技术栈分析及二次开发指南

Ragflow是目前团队化部署大模型+RAG的优质方案,不过其仍不适合直接部署使用,本文将从实际使用的角度,对其进行二次开发。 1. Ragflow 存在问题 Ragflow 开源仓库地址:https://github.com/infiniflow/ragflow Ragflow 当前版本: v0.17.0 Ragflow 目前主要存在以下问题: …

【医院成本核算专题】8.大数据与医院成本核算的关联点:开启医疗成本管理新时代

医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、引言 在当今数字化飞速发展的时代,大数据已成为各行业变革与发展的关键驱动力。自 2011 年麦肯锡公司提出 “大数据时代” 以来,数据量呈爆发式增长。据 IDC 统计,2011 年全世界创建和复制的数据总量达…

QT:串口上位机

创建工程 布局UI界面 设置名称 设置数据 设置波特率 波特率默认9600 设置数据位 数据位默认8 设置停止位 设置校验位 调整串口设置、接收设置、发送设置为Group Box 修改配置 QT core gui serialport 代码详解 mianwindow.h 首先在mianwindow.h当中定义一个串口指…

C# Enumerable类 之 集合操作

总目录 前言 在 C# 中&#xff0c;System.Linq.Enumerable 类是 LINQ&#xff08;Language Integrated Query&#xff09;的核心组成部分&#xff0c;它提供了一系列静态方法&#xff0c;用于操作实现了 IEnumerable 接口的集合。通过这些方法&#xff0c;我们可以轻松地对集合…

网络安全 api 网络安全 ast技术

随着应用或者API被攻击利用已经越来越多&#xff0c;虽然来自开源组件的漏洞加剧了这一现象的发生&#xff0c;但是&#xff0c;其实主要还是在于应用程序或者API本身没有做好防范&#xff0c;根源在于源代码本身的质量没有严格把控。AST是指Application Security Testing&…