SpringCloud实战十三:Gateway之 Spring Cloud Gateway 动态路由
前面分别对 Spring Cloud Zuul 与 Spring Cloud Gateway 进行了简单的说明它门是API网关API网关负责服务请求路由、组合及协议转换客户端的所有请求都首先经过API网关然后由它将匹配的请求路由到合适的微服务是系统流量的入口在实际生产环境中为了保证高可靠和高可用尽量避免重启如果有新的服务要上线时可以通过动态路由配置功能上线。本篇拿 Spring Cloud Gateway 为例对网关的动态路由进行简单分析下一篇将分享动态路由的进阶实现1.gateway配置路由主要有两种方式1.用yml配置文件2.写在代码里。而无论是 yml还是代码配置启动网关后将无法修改路由配置如有新服务要上线则需要先把网关下线修改 yml 配置后再重启网关yml配置方式代码配置方式2.gateway网关启动时路由信息默认会加载内存中路由信息被封装到 RouteDefinition 对象中配置多个RouteDefinition组成gateway的路由系统仔细的同学可能看到RouteDefinition中的字段与上面代码配置方式比较对应RouteDefinition对象在 org.springframework.cloud.gateway.route包下其定义如下RouteDefinitionLocator是个接口在org.springframework.cloud.gateway.route包下如果想查看网关中所有的路由信息调用此接口方法是一个办法需要从先注入到容器后面还有另外一种查看方式是Spring Cloud Gateway 的Endpoint端点提供的方法3.Spring Cloud Gateway 提供了 Endpoint 端点暴露路由信息有获取所有路由、刷新路由、查看单个路由、删除路由等方法源码在 org.springframework.cloud.gateway.actuate.GatewayControllerEndpoint 中想访问端点中的方法需要添加 spring-boot-starter-actuator 注解并在配置文件中暴露所有端点# 暴露端点 management: endpoints: web: exposure: include: * endpoint: health: show-details: always4.动态路由代码实现前提需要启动 3个服务eureka、gateway、consumer-service1.eureka使用前面博客中的代码2.consumer-service是个web项目提供一个hello方法需注册到eureka上3.新建gateway添加引用org.springframework.cloud spring-cloud-starter-gateway org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-actuator4.添加基本配置和注册到eureka不要配置路由信息映射到consumer-service由后面的动态路由功能路由过去5.根据Spring Cloud Gateway的路由模型定义数据传输模型分别是路由模型、过滤器模型、断言模型//1.创建路由模型public class GatewayRouteDefinition {//路由的Idprivate String id;//路由断言集合配置private List predicates new ArrayList();//路由过滤器集合配置private List filters new ArrayList();//路由规则转发的目标uriprivate String uri;//路由执行的顺序private int order 0;//此处省略get和set方法}//2.创建过滤器模型public class GatewayFilterDefinition {//Filter Nameprivate String name;//对应的路由规则private MapString, String args new LinkedHashMap();//此处省略Get和Set方法}//3.路由断言模型public class GatewayPredicateDefinition {//断言对应的Nameprivate String name;//配置的断言规则private MapString, String args new LinkedHashMap();//此处省略Get和Set方法}6.编写动态路由实现类需实现ApplicationEventPublisherAware接口/**动态路由服务*/Servicepublic class DynamicRouteServiceImpl implements ApplicationEventPublisherAware{Autowiredprivate RouteDefinitionWriter routeDefinitionWriter;private ApplicationEventPublisher publisher;Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.publisher applicationEventPublisher;}//增加路由public String add(RouteDefinition definition) {routeDefinitionWriter.save(Mono.just(definition)).subscribe();this.publisher.publishEvent(new RefreshRoutesEvent(this));return “success”;}//更新路由public String update(RouteDefinition definition) {try {delete(definition.getId());} catch (Exception e) {return update fail,not find route routeId: definition.getId();}try {routeDefinitionWriter.save(Mono.just(definition)).subscribe();this.publisher.publishEvent(new RefreshRoutesEvent(this));return “success”;} catch (Exception e) {return “update route fail”;}}//删除路由public MonoResponseEntity delete(String id) {return this.routeDefinitionWriter.delete(Mono.just(id)).then(Mono.defer(() - {return Mono.just(ResponseEntity.ok().build());})).onErrorResume((t) - {return t instanceof NotFoundException;}, (t) - {return Mono.just(ResponseEntity.notFound().build());});}}7.编写 Rest接口通过这些接口实现动态路由功能注意SpringCloudGateway使用的是WebFlux不要引用WebMvcRestControllerRequestMapping(“/route”)public class RouteController {Autowired private DynamicRouteServiceImpl dynamicRouteService; //增加路由 PostMapping(/add) public String add(RequestBody GatewayRouteDefinition gwdefinition) { String flag fail; try { RouteDefinition definition assembleRouteDefinition(gwdefinition); flag this.dynamicRouteService.add(definition); } catch (Exception e) { e.printStackTrace(); } return flag; } //删除路由 DeleteMapping(/routes/{id}) public MonoResponseEntityObject delete(PathVariable String id) { try { return this.dynamicRouteService.delete(id); }catch (Exception e){ e.printStackTrace(); } return null; } //更新路由 PostMapping(/update) public String update(RequestBody GatewayRouteDefinition gwdefinition) { RouteDefinition definition assembleRouteDefinition(gwdefinition); return this.dynamicRouteService.update(definition); } //把传递进来的参数转换成路由对象 private RouteDefinition assembleRouteDefinition(GatewayRouteDefinition gwdefinition) { RouteDefinition definition new RouteDefinition(); definition.setId(gwdefinition.getId()); definition.setOrder(gwdefinition.getOrder()); //设置断言 ListPredicateDefinition pdListnew ArrayList(); ListGatewayPredicateDefinition gatewayPredicateDefinitionListgwdefinition.getPredicates(); for (GatewayPredicateDefinition gpDefinition: gatewayPredicateDefinitionList) { PredicateDefinition predicate new PredicateDefinition(); predicate.setArgs(gpDefinition.getArgs()); predicate.setName(gpDefinition.getName()); pdList.add(predicate); } definition.setPredicates(pdList); //设置过滤器 ListFilterDefinition filters new ArrayList(); ListGatewayFilterDefinition gatewayFilters gwdefinition.getFilters(); for(GatewayFilterDefinition filterDefinition : gatewayFilters){ FilterDefinition filter new FilterDefinition(); filter.setName(filterDefinition.getName()); filter.setArgs(filterDefinition.getArgs()); filters.add(filter); } definition.setFilters(filters); URI uri null; if(gwdefinition.getUri().startsWith(http)){ uri UriComponentsBuilder.fromHttpUrl(gwdefinition.getUri()).build().toUri(); }else{ // uri为 lb://consumer-service 时使用下面的方法 uri URI.create(gwdefinition.getUri()); } definition.setUri(uri); return definition; }}8.启动项目查看网关路由信息访问 localhost:9999/actuator/gateway/routes因没有配置路由信息因此返回结果为空数组9.通过Postman发一个 post 请求新增路由接口地址http://localhost:9999/route/update路由到 consumer-service 上然后通过网关访问查看是否转发请求了这里直接调用的update有就会覆盖没有则新增10.再访问 localhost:9999/actuator/gateway/routes 可以看到新的路由信息已经配置进去了这就是动态路由配置还可以调用删除、修改接口操作动态操作路由信息11.配置路由信息后访问consumer-service服务正常返回说明路由已经生效请求转发到consumer-service服务好了动态路由的简单实现了一般在生产环境不使用此方式因为网关都是多实例部署还可能随时增加实例需要已调用接口的方式一一调用网关所有的实例本篇博客参考了许进的文章地址http://springcloud.cn/view/407 还有他写的 《重新定义SpringCloud》比较不错代码已上传至码云源码项目使用的版本信息如下- SpringBoot 2.0.6.RELEASE - SpringCloud Finchley.SR2下篇将介绍动态路由的进阶实现实现方式创建一个路由信息维护的项目实现增删改查路由信息到mysql然后发布发布后将路由信息与版本信息保存到redis中对外提供 rest 接口网关开启定时任务定时拉取 rest 接口中最新版本的路由信息这样网关发布多个实例后都会单独的去拉取维护的路由信息参考了https://blog.csdn.net/tianyaleixiaowu/article/details/83412301

相关新闻

在任务管理器中结束“资源管理器”进程后电脑黑屏怎么办

在任务管理器中结束“资源管理器”进程后电脑黑屏怎么办

结束资源管理器(explorer.exe)进程会导致桌面、任务栏等图形界面消失,从而出现黑屏。‌解决方法是通过任务管理器或运行对话框重新启动explorer.exe进程‌即可恢复。‌标准恢复步骤 ‌ (1)调出任务管理器‌&…

2026/7/7 13:32:48 阅读更多 →
【Linux】进程控制 进程程序替换

【Linux】进程控制 进程程序替换

一、理解进程程序替换如果我们想要在一个进程里面执行另一个程序,那么就需要进行程序替换,也就是父进程创建一个子进程,然后通过程序替换的方式将想要执行的程序交给这个子进程去去执行。在这里插入图片描述用fok创建一个进程的子进程之后&am…

2026/7/8 2:48:14 阅读更多 →
SpringBoot+Vue 榆林特色旅游网站管理平台源码【适合毕设/课设/学习】Java+MySQL

SpringBoot+Vue 榆林特色旅游网站管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着互联网技术的快速发展,旅游业逐渐从传统模式向数字化、智能化转型。榆林作为陕西省重要的历史文化名城,拥有丰富的自然景观和人文资源,但旅游信息的分散化和服务效率的不足制约了当地旅游业的发展。为了提升游客体验和旅游管理效率&…

2026/5/17 10:29:44 阅读更多 →

最新新闻

2026年最新命理排盘软件推荐:命理软件怎么选?八字、AI提示词和多盘复盘要分清

2026年最新命理排盘软件推荐:命理软件怎么选?八字、AI提示词和多盘复盘要分清

很多人搜索“命理排盘软件推荐”或者“命理软件推荐”,其实需求并不完全一样。有的人只是想排一个八字盘,有的人想看紫微斗数,有的人想查六爻、合盘、择日、罗盘,也有人刚入门,看不懂十神、五行、大运流年,…

2026/7/8 2:51:33 阅读更多 →
Zvec:阿里巴巴开源的轻量级进程内向量数据库

Zvec:阿里巴巴开源的轻量级进程内向量数据库

Zvec:阿里巴巴开源的轻量级进程内向量数据库 核心观点 Zvec 是阿里巴巴开源的进程内(in-process)向量数据库,定位轻量、极速、零配置,可直接嵌入应用程序运行。经阿里集团内部生产环境验证,支持低延迟、可…

2026/7/8 2:47:33 阅读更多 →
ResNet-18/34/50/101/152 五款架构 CIFAR-10 训练实测:从 56 层到 1202 层的性能拐点分析

ResNet-18/34/50/101/152 五款架构 CIFAR-10 训练实测:从 56 层到 1202 层的性能拐点分析

ResNet-18/34/50/101/152 五款架构 CIFAR-10 训练实测:从 56 层到 1202 层的性能拐点分析深度残差网络(ResNet)自2015年问世以来,已成为计算机视觉领域的里程碑式工作。何恺明团队提出的残差学习框架,通过引入跨层连接…

2026/7/8 2:45:32 阅读更多 →
SQL 语句从基础到高级

SQL 语句从基础到高级

SQL(Structured Query Language,结构化查询语言)是关系型数据库的标准操作语言,适用于 MySQL、Oracle、SQL Server、PostgreSQL 等主流数据库。本文将由浅入深,从基础语法、核心操作、进阶查询到高级特性、实战优化&am…

2026/7/8 2:45:32 阅读更多 →
曝美团内部全面限用豆包大模型;OpenAI磋商将5%股份送给美国政府;任天堂回应“全员涨薪10%”传闻:这是2023年的事 | 极客头条

曝美团内部全面限用豆包大模型;OpenAI磋商将5%股份送给美国政府;任天堂回应“全员涨薪10%”传闻:这是2023年的事 | 极客头条

一分钟速览新闻点! 消息称美团内部全面限用豆包大模型,此前曾限用阿里云 Qwen 蔚来李斌毕业 30 年后回北大演讲:经历 6 次人生和事业大低谷 支付宝 AI 生活助理「阿宝」正式开启公测,全面取消邀请码限制 脉脉:1-5 月…

2026/7/8 2:43:32 阅读更多 →
使用claude code进行贪吃蛇游戏开发

使用claude code进行贪吃蛇游戏开发

初次使用claude code进行GUI游戏开发。(使用python语言)1.使用powershell打开指定目录2.输入claude命令打开3.输入自然语言描述需求4.根据效果和问题进行问题描述,要求大模型对代码进行修改。结果:

2026/7/8 2:43:32 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻