3

我有两个将通过 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)时,我收到以下错误:

使用 docker 执行

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

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

4

1 回答 1

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 执行,即使是招摇的请求。

于 2018-02-12T15:21:18.833 回答