通过docker访问Swagger UI无法正常工作

4
我有两个微服务(交易和支付),将通过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,因此ApiGateway的docker正在访问其他docker的Swagger,但无法从我的Web浏览器访问。

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


你应该提供docker-compose.yml文件。 - Mazel Tov
1个回答

2
我终于找到问题所在:使用docker-compose运行时,每个微服务都使用服务名称进行通信,docker-compose能够将其转换为相应的IP地址(这就是第二张图片中“Transactions”链接显示 http://transactionservice/... 的原因,因为在 docker-compose.yml 中我使用了该URL作为资源URL)。
因此,当我访问ApiGateway中的Swagger时,它会将该URL作为资源返回。但是,该html是在我的机器上执行的,而不是在docker内部执行,因此当它尝试访问http://transactionservice/api/v2/api-docs时,我的机器对transactionservice一无所知。
解决方案是在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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接