网关集成多个微服务swgger文档

本文档介绍如何在Spring Boot微服务架构中集成多个Swagger文档,实现统一的API管理。通过示例代码和步骤解析,帮助开发者高效地整合不同微服务的Swagger接口,提供一站式API文档查看体验。
<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>
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;

    @Autowired
    public MySwaggerResourceProvider(RouteLocator routeLocator) {
        this.routeLocator = routeLocator;
    }

    @Override
    public List<SwaggerResource> get() {
        List<SwaggerResource> resources = new ArrayList<>();
        List<String> 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<String> 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;
    }
}

 

Spring Cloud Gateway 中统一访问多个微服务Swagger 文档,可以通过聚合各个服务的 OpenAPI 文档,并通过网关路由进行统一展示。该方式使得所有微服务的 API 文档能够集中管理,用户通过一个统一的入口即可查看所有服务的文档内容。 ### 配置网关聚合 Swagger 文档Spring Cloud Gateway 中,可以利用 `springdoc` 提供的 `swagger-ui` 支持,通过配置 `springdoc.swagger-ui.urls` 属性,将各个微服务的 `/v3/api-docs` 路径映射到网关的不同路径下。这样,Swagger UI 会自动识别这些路径并显示对应的文档列表。 例如,在网关的 `application.yml` 中配置如下内容: ```yaml spring: cloud: gateway: routes: - id: user-service uri: lb://user-service predicates: - Path=/user/** filters: - RewritePath=/user/(?<segment>.*), /$\{segment} - id: order-service uri: lb://order-service predicates: - Path=/order/** filters: - RewritePath=/order/(?<segment>.*), /$\{segment} springdoc: swagger-ui: urls: - name: User Service url: /v3/api-docs/user - name: Order Service url: /v3/api-docs/order ``` 上述配置中,每个微服务文档路径被映射到网关的特定路径下(如 `/v3/api-docs/user` 和 `/v3/api-docs/order`),并通过 `springdoc.swagger-ui.urls` 属性进行注册,使得 Swagger UI 能够识别这些文档路径并展示对应的服务名称[^1]。 ### 微服务端配置 在每个微服务中,需要确保正确引入了 `springdoc-openapi-starter-webmvc-ui` 依赖,并且没有对 `/v3/api-docs` 路径进行重写或限制访问。例如,在 `pom.xml` 中引入: ```xml <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>1.6.14</version> </dependency> ``` 同时,确保微服务的接口扫描配置正确,以便生成完整的 API 文档。例如,可以通过自定义配置类指定扫描的包路径: ```java @Configuration public class SwaggerConfig { @Bean public OpenAPI customOpenAPI() { return new OpenAPI() .info(new Info().title("User Service API").version("1.0")); } } ``` 此配置确保生成的 OpenAPI 文档包含服务的基本信息,便于在网关Swagger UI 中正确显示[^2]。 ### 访问统一的 Swagger UI 界面 完成上述配置后,可以通过访问网关Swagger UI 页面查看所有微服务文档。默认情况下,访问地址为: ``` http://localhost:8080/swagger-ui/index.html ``` 在该页面中,用户可以看到多个服务的文档列表,并选择对应的服务进行查看和测试。这种方式不仅提升了文档的可维护性,还增强了微服务架构下的统一性与可访问性。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值