当前位置: 首页 > news >正文

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,这样就会请求不到数据。

在这里插入图片描述

如果不加- StripPrefix=1,也有其他的解决方案,可以在微服务提供者中配置服务上下文路径

server:servlet:context-path: /seata-order-service

注意网关的拦截器,不要将swagger请求拦截掉。


http://www.mrgr.cn/news/72349.html

相关文章:

  • LeetCode【0031】下一个排列
  • android bootchart安装使用指南
  • Android关机流程知多少?
  • Docker--Docker是什么和对Docker的了解
  • MySQL查询某个数据库中特定表的空间占用大小
  • Docker使用docker-compose一键部署nacos、Mysql、redis
  • 【学习】【HTML】HTML、XML、XHTML
  • 运行springBlade项目历程
  • 论云游戏的性能与性价比,ToDesk、青椒云、顺网云游戏等具体实操看这篇就够了
  • 上海亚商投顾:沪指放量调整 全市场近3800只个股下跌
  • 关于我、重生到500年前凭借C语言改变世界科技vlog.18——内存函数
  • Rocky linux8 安装php8.0
  • CesiumJS 案例 P27:创建椭圆、创建带边框的椭圆、创建圆、创建带边框的圆、创建椭圆环、创建圆环
  • WPF 中的视觉层和逻辑层有什么区别?
  • frp搭建内网穿透
  • PMC部门如何精准把控生产计划和生产进度?关键要点全解析
  • 【miniMax开放平台-注册安全分析报告-无验证方式导致安全隐患】
  • day31-二叉树的最大深度
  • Git服务部署教程
  • Linux中扫描网络的“nmap”工具使用方法
  • Conda安装软件错误(Pycharm)
  • 【更新中】《硬件架构的艺术》笔记(二):时钟与复位
  • 使用Flask部署自己的pytorch模型(猫品种分类模型)
  • 举例说明自然语言处理(NLP)技术。
  • 丹摩征文活动|CogVideoX-2b:从0到1,轻松完成安装与部署!
  • 功能性材料立式粉碎机、立式破碎机、立式超细磨、立式磨粉机