【问题标题】:Swagger UI accessed through docker does not work通过 docker 访问的 Swagger UI 不起作用
【发布时间】:2018-07-18 21:23:28
【问题描述】:

我有两个将通过 ApiGateway 访问的微服务(交易和支付),每个微服务都位于一个 docker 容器内。此外,我已经实现了自己的 SwaggerResourcesProvider,以便从一个点访问两个 Swagger:ApiGateway Swagger,正如您在这个问题中看到的那样:Single Swagger

为了在每个微服务中启用CORS,所有微服务(包括ApiGateway)都有如下代码:

@Bean
public CorsFilter corsFilter() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

如果我使用IDE执行每个微服务,我可以毫无问题地从ApiGateway访问微服务的Swagger,如您所见(ApiGateway在8070端口上执行):

但是,当我使用 docker-compose 执行它们并尝试通过 ApiGateway 访问任何微服务的 Swagger(将内部端口映射到 8070)时,我收到以下错误:

奇怪的是,如果我使用 bash 进入 ApiGateway docker 内部,并执行 curl transactionservice/api/v2/api-docs 然后我会收到相应的 json,所以 docker 的ApiGateway 正在访问其余 docker 的 Swagger,但无法从我的 Web 浏览器访问。

问题:为什么 Swagger 在使用 docker 执行时无法访问其他 Swagger?

【问题讨论】:

  • 你应该提供 docker-compose.yml

标签: docker docker-compose swagger api-gateway


【解决方案1】:

我终于发现了问题:使用docker-compose执行时,每个微服务都使用服务名称与其他微服务通信,docker-compose能够将其转换为相应的IP(这就是在第二个图像中的原因, Transactions 链接显示 http://transactionservice/...,因为在 docker-compose.yml 我使用该 URL 作为资源 URL)。

所以,当我在 ApiGateway 中访问 swagger 时,它会将该 URL 作为资源返回。但是,该 html 是在我的机器中执行的,而不是在 docker 中,所以当它尝试访问 http://transactionservice/api/v2/api-docs 时,我的机器对事务服务一无所知。

解决方案是在 ApiGateway 中使用以下配置进行重定向:

  zuul.routes.transaction.path: /transaction/**
  zuul.routes.transaction.url: http://transactionservice/api/transaction
  zuul.routes.transaction-swagger.path: /swagger/transaction/**
  zuul.routes.transaction-swagger.url: http://transactionservice/api
  zuul.routes.payment.path: /payment/**
  zuul.routes.payment.url: http://paymentservice/api/payment
  zuul.routes.payment-swagger.path: /swagger/payment/**
  zuul.routes.payment-swagger.url: http://paymentservice/api

  swagger.resources[0].name: transactions
  swagger.resources[0].url: /swagger/transaction/v2/api-docs
  swagger.resources[0].version: 2.0
  swagger.resources[1].name: payments
  swagger.resources[1].url: /swagger/payment/v2/api-docs
  swagger.resources[1].version: 2.0

这样,所有的请求都使用 ApiGateway 执行,即使是 swagger 的请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多