spring-gateway网关聚合swagger实现多个服务接口切换
前提条件
微服务已经集成了swagger,并且注册进了nacos。
gateway配置
package com.zmy.springcloud.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;import java.util.*;/*** 聚合各个服务的swagger接口*/
@Component
public class MySwaggerResourceProvider implements SwaggerResourcesProvider {/*** swagger2默认的url后缀*/private static final String SWAGGER2URL = "/v2/api-docs";/*** 网关路由*/private final RouteLocator routeLocator;/*** 网关应用名称*/@Value("${spring.application.name}")private String self;@Autowiredpublic MySwaggerResourceProvider(RouteLocator routeLocator) {this.routeLocator = routeLocator;}@Overridepublic List<SwaggerResource> get() {List<SwaggerResource> resources = new ArrayList<>();List<String> routeHosts = new ArrayList<>();// 获取所有可用的host:serviceIdrouteLocator.getRoutes().filter(route -> route.getUri().getHost() != null).filter(route -> !self.equals(route.getUri().getHost())).subscribe(route -> routeHosts.add(route.getUri().getHost()));// 记录已经添加过的serverSet<String> dealed = new HashSet<>();routeHosts.forEach(instance -> {// 拼接urlString url = "/" + instance.toLowerCase() + SWAGGER2URL;if (!dealed.contains(url)) {dealed.add(url);SwaggerResource swaggerResource = new SwaggerResource();swaggerResource.setUrl(url);swaggerResource.setName(instance);resources.add(swaggerResource);}});return resources;}
}
package com.zmy.springcloud.config.swagger.controller;import com.zmy.springcloud.config.MySwaggerResourceProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.swagger.web.*;import java.util.List;/*** swagger聚合接口,三个接口都是swagger-ui.html需要访问的接口*/
@RestController
@RequestMapping("/swagger-resources")
public class SwaggerResourceController {private MySwaggerResourceProvider swaggerResourceProvider;@Autowiredpublic SwaggerResourceController(MySwaggerResourceProvider swaggerResourceProvider) {this.swaggerResourceProvider = swaggerResourceProvider;}@RequestMapping(value = "/configuration/security")public ResponseEntity<SecurityConfiguration> securityConfiguration() {return new ResponseEntity<>(SecurityConfigurationBuilder.builder().build(), HttpStatus.OK);}@RequestMapping(value = "/configuration/ui")public ResponseEntity<UiConfiguration> uiConfiguration() {return new ResponseEntity<>(UiConfigurationBuilder.builder().build(), HttpStatus.OK);}@RequestMappingpublic ResponseEntity<List<SwaggerResource>> swaggerResources() {return new ResponseEntity<>(swaggerResourceProvider.get(), HttpStatus.OK);}
}
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--swagger生成API文档-->
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version><exclusions><exclusion><groupId>io.swagger</groupId><artifactId>swagger-models</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>io.swagger</groupId><artifactId>swagger-models</artifactId><version>1.5.22</version>
</dependency>
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version>
</dependency>
<!--nacos-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
server:port: 9527spring:application:name: cloud-gatewaycloud:gateway:routes:- id: seata-storage-serviceuri: lb://seata-storage-servicepredicates:- Path=/seata-storage-service/** # 断言,相匹配的进行路由filters:- StripPrefix=1- id: seata-account-serviceuri: lb://seata-account-servicepredicates:- Path=/seata-account-service/**filters:- StripPrefix=1discovery:locator:enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由nacos:discovery:server-addr: localhost:8848
- StripPrefix=1是必须配置的,跳过- Path的第一段路径。- http://localhost:2003/v2/api-docs 这个是正确的swagger数据请求地址。不加
- StripPrefix=1的话,swagger在请求数据时候会请求http://localhost:2003/seata-account-service/v2/api-docs,这样就会请求不到数据。
- http://localhost:2003/v2/api-docs 这个是正确的swagger数据请求地址。不加

如果不加- StripPrefix=1,也有其他的解决方案,可以在微服务提供者中配置服务上下文路径
server:servlet:context-path: /seata-order-service
注意网关的拦截器,不要将swagger请求拦截掉。
相关文章:
spring-gateway网关聚合swagger实现多个服务接口切换
前提条件 微服务已经集成了swagger,并且注册进了nacos。 gateway配置 package com.zmy.springcloud.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springfra…...
关于 Oracle Database Express Edition 的功能和安装
Oracle Database Express Edition,简称 Oracle Database XE。是一个免费的版本,主要用于培训和一些功能要求比较简单,又需要免费分发的场景。 看看官方的说明: Whether you are a developer, a DBA, a data scientist, an educat…...
领夹麦克风哪个品牌好,手机领夹麦克风哪个牌子好,选购推荐
无线麦克风凭借其无与伦比的便携性与灵活性,成为在演讲、表演以及会议等多种场合中不可或缺的有力帮手。它挣脱了线缆的束缚,使得声音的传播更加自由自在。其操作十分简便,只需简单配对就能投入使用,从而可以轻松地适应各类场景…...
什么是 Go 语言?
Go 语言(也称为 Golang)是由 Google 开发的一种开源编程语言。它最初由 Rob Pike、Ken Thompson 和 Robert Griesemer 等人于 2007 年设计,经过两年的研发,于 2009 年首次公开发布。Go 语言的设计目标是提高编程效率,特…...
AI 大模型重塑软件开发流程:定义、应用、优势与挑战
随着人工智能技术的飞速发展,AI 大模型正在深刻影响软件开发的各个环节。从代码自动生成到智能测试,AI 大模型不仅提高了开发效率,还带来了全新的开发模式和流程变化。本文将从 AI 大模型的定义、应用场景、优势以及挑战等方面,探…...
微服务即时通讯系统的实现(客户端)----(1)
目录 1. 项目整体介绍1.1 项目概况1.2 界面预览和功能介绍1.3 技术重点和服务器架构 2. 项目环境搭建2.1 安装Qt62.3 安装vcpkg2.3 安装protobuf2.4 构建项目2.5 配置CMake属性 3. 项目核心数据结构的实现3.1 创建data.h存放核心的类3.2 工具函数的实现3.3 创建编译开关 4. 界面…...
【freertos】FreeRTOS时间管理
FreeRTOS时间管理 一、睡眠延时函数1、vTaskDelay2、vTaskDelayUntil3、相对延时与绝对延时对比 二、自定义延时函数1、微秒延时2、毫秒延时 一、睡眠延时函数 1、vTaskDelay \quad 在UCOSIII 中延时函数OSTimeDly()可以设置为三种模式:相对模式、周期模式和绝对模式。在FreeR…...
台式电脑没有声音怎么办?台式电脑没有声音解决详解
台式电脑一般来说都是没有内置扬声器的,需要连接耳机或者是音响才可以播放音乐。那么如果遇到台式电脑没有声音的问题,我们也需要确认这些设备硬件有没问题,知道原因才可以进行处理。下面本文将为你介绍台式电脑没有声音的可能原因和解决方法…...
机器学习基础02
目录 1.特征工程 1.1特征工程概念 1.2特征工程的步骤 1.3特征工程-特征提取 1.3.1字典列表(json)特征提取 1.3.2文本特征提取 英文文本提取 中文文本提取 1.3.3TF-IDF文本特征词的稀有程度特征提取 2.无量纲化 2.1归一化 2.2标准化 2.3fit、fit_transform、transfo…...
element plus的表格内容自动滚动
<el-table:data"tableData"ref"tableRef"borderstyle"width: 100%"height"150"><el-table-column prop"date" label"名称" width"250" /><el-table-column prop"name" label&…...
哈佛商业评论 | 未来商业的技术趋势:百度李彦宏谈技术如何变革商业
在《哈佛商业评论》的HBR IdeaCast节目中,百度联合创始人、首席执行官兼董事长李彦宏分享了他对人工智能(AI)和其他技术趋势的见解。这期节目讨论了百度如何将生成式AI融入业务,以及这些技术如何重塑我们的生活和工作方式。让我们…...
Pytorch如何将嵌套的dict类型数据加载到GPU
在PyTorch中,您可以使用.to(device)方法将嵌套的字典中的所有支持的Tensor对象转移到GPU。以下是一个简单的例子 import torch# 假设您已经有了一个名为device的GPU设备对象 device torch.device("cuda:0" if torch.cuda.is_available() else "cp…...
Shell基础2
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团…...
7z 解压器手机版与解压专家:安卓解压工具对决
7z 解压器手机版和解压专家都是在安卓设备上广受欢迎的解压软件。7z 解压器手机版由深圳乡里云网络科技有限公司开发,大小为 32.8M,支持多种常见的压缩文件格式,如.zip、.rar、.7z 等。 它对安卓操作系统的特性和用户习惯进行了优化…...
C++清除所有输出【DEV-C++】所有编辑器通用 | 算法基础NO.1
各位小伙伴们,上一期的保留小数位数教学够用一辈子,有不错的点赞量,可我连一个粉丝铁粉都没有,你愿意做我的第一个铁粉吗?OK废话不多说,开始! 温故与知心 可能你也学过,且是工作者…...
【Android、IOS、Flutter、鸿蒙、ReactNative 】启动页
Android 设置启动页 自定义 splash.xml 通过themes.xml配置启动页背景图 IOS 设置启动页 LaunchScreen.storyboard 设置为启动页 storyboard页面绘制 Assets.xcassets 目录下导入图片 AppLogo Flutter 设置启动页 Flutter Android 设置启动页 自定义 launch_background.xm…...
SpringBoot 2.2.10 无法执行Test单元测试
很早之前的项目今天clone现在,想执行一个业务订单的检查,该检查的代码放在test单元测试中,启动也是好好的,当点击对应的方法执行Test的时候就报错 tip:已添加spring-boot-test-starter 所以本身就引入了junit5的库 No…...
聊天服务器(8)用户登录业务
目录 登录状态业务层代码数据模型层代码记录用户的连接信息以及线程安全问题客户端异常退出业务 登录状态 登录且状态变为online 业务层代码 #include "chatservice.hpp" #include "public.hpp" #include <string> #include <muduo/base/Loggi…...
stm32在linux环境下的开发与调试
环境安装 注:文末提供一键脚本 下载安装stm32cubeclt 下载地址为:https://www.st.com/en/development-tools/stm32cubeclt.html 选择 linux版本下载安装 安装好后默认在家目录st下 > $ ls ~/st/stm32cubeclt_1.16.0 …...
flinkOnYarn并配置prometheus+grafana监控告警
flinkOnYarn并配置prometheusgrafana监控告警 一、相关服务版本: flink版本:1.17.2 pushgateway版本:1.10.0 prometheus版本:3.0.0 grafana-v11.3.0参考了网上的多个文档以及学习某硅谷的视频,总结了一下文档&#x…...
VS2022社区版离线安装后,真的不用登录吗?我的30天实测与长期使用避坑指南
VS2022社区版离线安装后长期免登录实战指南:破解30天授权谜题 第一次在完全离线的开发环境中双击VS2022图标时,那种忐忑感记忆犹新——这个号称"免费"的开发工具,会不会突然弹出登录框锁死我的工作流?微软官方文档对离线…...
DICOM RT Structure深度解析——从文件结构到靶区可视化
1. DICOM RT Structure文件基础认知 第一次接触DICOM RT Structure文件时,我完全被那些密密麻麻的标签和序列搞晕了。这就像拿到一份没有目录的医学百科全书,所有内容都堆在一起。但经过几个项目的实战,我发现只要抓住三个核心序列࿰…...
如何快速实现分布式定时任务?Disque完整指南详解
如何快速实现分布式定时任务?Disque完整指南详解 【免费下载链接】disque Disque is a distributed message broker 项目地址: https://gitcode.com/gh_mirrors/di/disque 分布式定时任务在现代应用中至关重要,而Disque作为Redis作者antirez开发的…...
这次终于选对了!2026年性价比拉满的专业AI论文网站
2026年AI论文写作工具已从“基础辅助”升级为融合多模态处理与学术合规的智能写作系统,核心评价维度涵盖文献真实性、格式合规性、长文本逻辑、查重降重、AIGC合规与跨语言支持。本次测评覆盖6款主流工具,测试场景包含中文与英文论文、全流程与专项功能、…...
三步掌握HiGHS线性优化求解器:从入门到实战
三步掌握HiGHS线性优化求解器:从入门到实战 【免费下载链接】HiGHS Linear optimization software 项目地址: https://gitcode.com/GitHub_Trending/hi/HiGHS 在数据分析与决策优化领域,如何高效解决资源分配、生产计划等线性规划问题一直是核心挑…...
OpenClaw故障排查大全:GLM-4.7-Flash接口连接失败的7种解决方法
OpenClaw故障排查大全:GLM-4.7-Flash接口连接失败的7种解决方法 1. 问题背景与现象描述 上周在尝试将本地部署的GLM-4.7-Flash模型接入OpenClaw时,我遇到了令人抓狂的接口连接问题。明明模型服务已经正常启动,OpenClaw配置看起来也没问题&a…...
AI-Agent元年来了!2026年全面爆发,掌握Agent工程化思维,从0到1打造爆款智能体!
前言 如果说[2025年是AI-Agent元年],那么2026年无疑是AI-Agent全面爆发的一年。无论是近期引发全民热潮的“养虾”智能体[OpenClaw,还是渗透进各行各业、解决实际工作问题的智能助手,它们都属于AI-Agent的生动实践。从这些案例中不难看出&…...
别再手动汉化了!用Docker Compose持久化配置Greenbone GVM中文界面(附yml文件修改)
持久化配置Greenbone GVM中文界面的Docker Compose实战指南 对于安全工程师和运维人员来说,Greenbone Vulnerability Management(GVM)是进行漏洞扫描的利器。但每次重启容器后都需要重新配置中文界面,这无疑增加了维护成本。本文…...
保姆级教程:用300条数据微调SenseVoice语音模型(附数据格式详解)
300条数据高效微调SenseVoice语音模型的实战指南 去年在为一个医疗咨询项目定制语音识别系统时,我发现通用模型对专业医学术语的识别准确率不足60%。当时团队仅有400条标注数据,却通过SenseVoice的微调功能在3小时内将准确率提升至89%。本文将分享这种小…...
数据库扩展实战:如何用ShardingCore实现高性能分库分表
数据库扩展实战:如何用ShardingCore实现高性能分库分表 【免费下载链接】sharding-core high performance lightweight solution for efcore sharding table and sharding database support read-write-separation .一款ef-core下高性能、轻量级针对分表分库读写分离…...
