千家信息网

spring-gateway网关聚合swagger实现多个服务接口切换的方法

发表于:2025-11-19 作者:千家信息网编辑
千家信息网最后更新 2025年11月19日,本文小编为大家详细介绍"spring-gateway网关聚合swagger实现多个服务接口切换的方法",内容详细,步骤清晰,细节处理妥当,希望这篇"spring-gateway网关聚合swagger实
千家信息网最后更新 2025年11月19日spring-gateway网关聚合swagger实现多个服务接口切换的方法

本文小编为大家详细介绍"spring-gateway网关聚合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.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接口 */@Componentpublic 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;    @Autowired    public MySwaggerResourceProvider(RouteLocator routeLocator) {        this.routeLocator = routeLocator;    }    @Override    public List get() {        List resources = new ArrayList<>();        List routeHosts = new ArrayList<>();        // 获取所有可用的host:serviceId        routeLocator.getRoutes().filter(route -> route.getUri().getHost() != null)                .filter(route -> !self.equals(route.getUri().getHost()))                .subscribe(route -> routeHosts.add(route.getUri().getHost()));        // 记录已经添加过的server        Set dealed = new HashSet<>();        routeHosts.forEach(instance -> {            // 拼接url            String 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;    @Autowired    public SwaggerResourceController(MySwaggerResourceProvider swaggerResourceProvider) {        this.swaggerResourceProvider = swaggerResourceProvider;    }    @RequestMapping(value = "/configuration/security")    public ResponseEntity securityConfiguration() {        return new ResponseEntity<>(SecurityConfigurationBuilder.builder().build(), HttpStatus.OK);    }    @RequestMapping(value = "/configuration/ui")    public ResponseEntity uiConfiguration() {        return new ResponseEntity<>(UiConfigurationBuilder.builder().build(), HttpStatus.OK);    }    @RequestMapping    public ResponseEntity> swaggerResources() {        return new ResponseEntity<>(swaggerResourceProvider.get(), HttpStatus.OK);    }}
    org.springframework.cloud    spring-cloud-starter-gateway    io.springfox    springfox-swagger2    2.9.2                        io.swagger            swagger-models                io.swagger    swagger-models    1.5.22    io.springfox    springfox-swagger-ui    2.9.2    com.alibaba.cloud    spring-cloud-starter-alibaba-nacos-discovery
server:  port: 9527spring:  application:    name: cloud-gateway  cloud:    gateway:      routes:        - id: seata-storage-service          uri: lb://seata-storage-service          predicates:            - Path=/seata-storage-service/**         # 断言,相匹配的进行路由          filters:            - StripPrefix=1        - id: seata-account-service          uri: lb://seata-account-service            - Path=/seata-account-service/**      discovery:        locator:          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由    nacos:        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请求拦截掉。

读到这里,这篇"spring-gateway网关聚合swagger实现多个服务接口切换的方法"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

0