通过docker访问的Swagger UI不起作用

时间:2018-02-08 10:29:23

标签: docker docker-compose swagger api-gateway

我有两个微服务(交易和支付)将通过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端口上执行):

Executed locally

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

executed using docker

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

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

1 个答案:

答案 0 :(得分:1)

我终于找到了问题:当使用docker-compose执行时,每个微服务器使用服务名称与其他人通信,并且docker-compose能够将其转换为相应的IP(这是在第二个图像中的原因, “交易”链接显示 http://transactionservice/ ... ,因为在 docker-compose.yml 中我使用该网址作为资源网址。)

因此,当我在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执行的,即使是摇摆不定的请求。