集中 api 网关中的 swaggers 返回“无法加载远程配置。”

问题描述 投票:0回答:1

我使用 Eureka 创建了一个发现服务器,添加了一个网关和 2 个 Web 服务。全部 我添加了 2 个网络服务和一个网关。我的服务正确注册到尤里卡。 我正在使用:

  • 春季启动3.2.1
  • 春云2023.0.0

我希望网关中提供所有 swagger 文档。

在网络服务上我添加了以下依赖项:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.3.0</version>
</dependency>

在每个上我还添加了 OpenApiDefinition 注释:

...
@OpenAPIDefinition(info =
    @Info(
            title = "User Management and authentication Webservice",
            description = "This web service allow register, log in and update user profile",
            version = "1.0",
            contact = @Contact(
                    name = "Technical Service",
                    url = "https://www.******/",
                    email = "****@****"
            ),
            termsOfService = "https://www.*****",
            license = @License(name =  "Apache 2.0", url = "http://www.apache.org/licenses/LICENSE-2.0")
))
public class UserWsApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserWsApplication.class, args);
    }
}

在用户网络服务上我添加了以下设置(摘录):

server.port=${PORT:0}
spring.application.name=users-ws
springdoc.show-actuator=false

第二个网络服务:

server.port=${PORT:0}
spring.application.name=licences-ws
springdoc.show-actuator=false

在网关上,我添加了以下依赖项

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webflux-api</artifactId>
    <version>2.3.0</version>
</dependency>

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
    <version>2.3.0</version>
</dependency>

我配置了路线

# remote openapi
spring.cloud.gateway.routes[0].id=openapi
spring.cloud.gateway.routes[0].uri = http://localhost:${server.port}
spring.cloud.gateway.routes[0].predicates[0]=Path=/v3/api-docs/**
spring.cloud.gateway.routes[0].filters[0]=RewritePath=/v3/api-docs/(?<segment>.*), /$\{segment}/v3/api-docs


# status public page
spring.cloud.gateway.routes[1].id=users-ws-status
spring.cloud.gateway.routes[1].uri = lb://users-ws
spring.cloud.gateway.routes[1].predicates[0]=Path=/users/status
spring.cloud.gateway.routes[1].predicates[1]=Method=GET
spring.cloud.gateway.routes[1].filters[0]=RemoveRequestHeader=Cookie
spring.cloud.gateway.routes[1].filters[1]=RewritePath=/users-ws/users/status, /users/status

# user registration routes do not need filter
spring.cloud.gateway.routes[2].id=users-ws
spring.cloud.gateway.routes[2].uri = lb://users-ws
spring.cloud.gateway.routes[2].predicates[0]=Path=/users
spring.cloud.gateway.routes[2].predicates[1]=Method=POST
spring.cloud.gateway.routes[2].filters[0]=RemoveRequestHeader=Cookie
spring.cloud.gateway.routes[2].filters[1]=RewritePath=/users-ws/(?<segment>.*), /$\{segment}

spring.cloud.gateway.routes[3].id = users-ws-login
spring.cloud.gateway.routes[3].uri = lb://users-ws
spring.cloud.gateway.routes[3].predicates[0]=Path=/users/login
spring.cloud.gateway.routes[3].predicates[1]=Method=POST
spring.cloud.gateway.routes[3].filters[0]=RemoveRequestHeader=Cookie
spring.cloud.gateway.routes[3].filters[1]=RewritePath=/users-ws/(?<segment>.*), /$\{segment}

# reset request
spring.cloud.gateway.routes[4].id = users-ws-auth-reset-request
spring.cloud.gateway.routes[4].uri = lb://users-ws
spring.cloud.gateway.routes[4].predicates[0]=Path=/users/password-reset-request
spring.cloud.gateway.routes[4].predicates[1]=Method=POST
spring.cloud.gateway.routes[4].filters[0]=RemoveRequestHeader=Cookie
spring.cloud.gateway.routes[4].filters[1]=RewritePath=/users-ws/(?<segment>.*), /$\{segment}

# reset password validation: we send get request with request param named token
spring.cloud.gateway.routes[5].id = users-ws-auth-reset-validation
spring.cloud.gateway.routes[5].uri = lb://users-ws
spring.cloud.gateway.routes[5].predicates[0]=Path=/users/password-reset
#spring.cloud.gateway.routes[5].predicates[1]=Query=token
spring.cloud.gateway.routes[5].predicates[1]=Method=POST
spring.cloud.gateway.routes[5].filters[0]=RemoveRequestHeader=Cookie
spring.cloud.gateway.routes[5].filters[1]=RewritePath=/users-ws/(?<segment>.*), /$\{segment}

# user management routes do  need filter
spring.cloud.gateway.routes[6].id=users-management-ws
spring.cloud.gateway.routes[6].uri=lb://users-ws
spring.cloud.gateway.routes[6].predicates[0]=Path=/users/**
spring.cloud.gateway.routes[6].predicates[1]=Method=GET,PUT,DELETE
spring.cloud.gateway.routes[6].predicates[2]=Header=Authorization, Bearer (.*)
spring.cloud.gateway.routes[6].filters[0]=RemoveRequestHeader=Cookie
spring.cloud.gateway.routes[6].filters[1]=AuthorizationHeaderFilter
spring.cloud.gateway.routes[6].filters[2]=RewritePath=/users-ws/(?<segment>.*), /$\{segment}

# configuring filter for actuator
spring.cloud.gateway.routes[7].id = users-ws-actuator
spring.cloud.gateway.routes[7].uri = lb://users-ws
spring.cloud.gateway.routes[7].predicates[0]=Path=/users-ws/actuator/**
spring.cloud.gateway.routes[7].predicates[1]=Method=GET
spring.cloud.gateway.routes[7].filters[0]=RemoveRequestHeader=Cookie
spring.cloud.gateway.routes[7].filters[1]=RewritePath=/users-ws/(?<segment>.*), /$\{segment}


# user registration routes do not need filter
spring.cloud.gateway.routes[8].id=licences-ws
spring.cloud.gateway.routes[8].uri = lb://licences-ws
spring.cloud.gateway.routes[8].predicates[0]=Path=/users/**
spring.cloud.gateway.routes[8].predicates[1]=Method=POST,GET
spring.cloud.gateway.routes[8].filters[0]=RemoveRequestHeader=Cookie
spring.cloud.gateway.routes[8].filters[1]=RewritePath=/licences-ws/(?<segment>.*), /$\{segment}

我还添加了以下打开 api 文档的设置

springdoc.swagger-ui.use-root-path=true
springdoc.api-docs.enabled=true
#springdoc.api-docs.path=/api-docs
springdoc.swagger-ui.enabled=true
springdoc.swagger-ui.path=/swagger-ui.html
springdoc.swagger-ui.config-url=/v3/api-docs/swagger-config

springdoc.swagger-ui.urls[0]=/v3/api-docs
springdoc.swagger-ui.urls[0].name=API Gateway Service
springdoc.swagger-ui.urls[0].display-name=API Gateway Service

#springdoc.swagger-ui.urls[0].primaryName=API Gateway Service
springdoc.swagger-ui.urls[1].name=users
springdoc.swagger-ui.urls[1]=/v3/api-docs/users-ws
springdoc.swagger-ui.urls[1].display-name=Users Service

springdoc.swagger-ui.urls[2].name=licences
springdoc.swagger-ui.urls[2]=/v3/api-docs/licences-ws
springdoc.swagger-ui.urls[2].display-name=Licences Service

server.forward-headers-strategy=framework

最后添加了以下配置bean

@Bean
public List<GroupedOpenApi> apis(RouteDefinitionLocator locator) {
    List<GroupedOpenApi> groups = new ArrayList<>();
    List<RouteDefinition> definitions = locator
            .getRouteDefinitions()
            .collectList()
            .block();

    assert definitions != null;
    definitions.forEach(definition ->
            System.out.println("id: " + definition.getId() + "  " +
                    definition.getUri().toString()));

    System.out.println("**************************");
    definitions.stream()
            .filter(routeDefinition -> routeDefinition.getId()
                    .matches(".*-ws"))
            .forEach(routeDefinition -> {
                String name = routeDefinition
                        .getId()
                        .replaceAll("-ws", "");
                System.out.println("Name >> "  + name);
                groups.add(GroupedOpenApi.builder()
                        .pathsToMatch("/" + name + "/**")
                        .group(name)
                        .build());
            });
    // we add services without ws in name
    return groups;
}

运行我的应用程序时:

  1. 当我使用用户Web服务时,我可以访问我的用户Web服务swagger:http://127.0.0.1:25682/swagger-ui/index.html
  2. 当我到达这里的集中式 swagger 文档时:http://localhost:8765/webjars/swagger-ui/index.html 我有一个“无法加载远程配置”

  1. 当我到达以下 URL (http://127.0.0.1:8765/users-ws/swagger-ui/index.html) 时,我“无法加载远程配置”
  2. 我注意到 http://localhost:8765/v3/api-docs/swagger-config 也返回 404 错误

我的问题是:

  1. 我怎样才能将我所有的招摇集中在 Spring Gateway 中?
  2. 为什么我的网关 URL 中有 webjar(没有 webjar,我有 404)

我的 openAPI 实现的一部分来自这里:https://github.com/piomin/sample-spring-microservices-new

spring-boot swagger spring-cloud
1个回答
0
投票

我几天前终于解决了。我只是在注册到 Eureka 的每个微服务上添加了带有服务器参数的 OpenApiDefinition 注释:

@OpenAPIDefinition(
    servers = { @Server(url = "/setups", description = "Default URL") },
    info = @Info(
            title = "...",
            version = "1.0.0",
            description = "..."))
© www.soinside.com 2019 - 2024. All rights reserved.