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…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
