【问题标题】:Java & Docker app can not hit external APIJava & Docker 应用程序无法访问外部 API
【发布时间】:2021-12-28 11:32:36
【问题描述】:

我从使用 Spring boot 和 feign 构建的 Java 应用程序连接到外部 API 时遇到问题。 应用程序部署到 docker 容器中的 VM。 到目前为止,我正在尝试访问外部服务端点以检索一些数据。

我已经从 VM 命令行和从 docker 容器内部也从命令行使用 curl 执行了相同的命令,但是当我尝试从 java 代码中点击它时,我只是收到超时。

关于可能发生的事情的任何想法,显然主机文件和代理是正确的,因为我可以通过 curl 访问端点,所以我想我在代码本身或 java 设置中遗漏了一些东西。

@GetMapping(value = "${url}", headers = {
            "X-API-Key=${apiKey}",
            "Authorization=${authorization}",
            "Accept=application/json",
            "Content-Type=application/json; charset=utf-8"
    })
    CheckResponse checkEmail(@RequestParam("email") String email) throws FeignClientException;

来自 docker 和 VM 的 curl 请求。

curl --location --request GET 'https://${url}/emailcheck-e?email=test@email.com' --header 'X-API-Key: ${apiKey}' --header 'Content-Type: application/json; charset=utf-8' --header 'Accept: application/json' --header 'Authorization: ${Authorization}'

【问题讨论】:

  • 不确定这是否是根本原因,但在curl-命令中您使用--header 'Authorization: ${Authorization}',而在@GetMapping 中您使用"Authorization=${authorization}"
  • 另外,我看不到路径的emailcheck-e-部分在@GetMapping 中定义的位置。
  • “=”是为 feign 映射标题的方式。 emailcheck 部分在 java 代码中被编码为 URl 的一部分。当我进行更改以隐藏真实 URL 时,我犯了一个错误并使用具有不同范围的相同 ${url},在真实代码中,“https://${url}/emailcheck-e”与java代码中的“value = ${url}”。
  • 带有标题的点旨在区分大小写(${Authorization} vs. ${authorization}
  • 抱歉,我没有这样理解。无论如何,我在修改调用隐藏数据时添加了这种大小写差异。它们都填充了相同的授权信息。

标签: java spring-boot docker feign


【解决方案1】:

我认为问题可能出在从 vm 到外部 API 的连接上。当您启动 DockerContainer 时,您可以使用 -p 参数指定从 vm 映射到本地机器的端口。有关详细信息,您可能需要查看文档:https://docs.docker.com/engine/reference/commandline/port/

【讨论】:

  • 我们目前正在映射 8081 -> 8080 我不知道我们是否缺少一个,但如果是这样的话。它不应该也无法使用 curl 从 docker 容器到达端点吗?它应该走同样的路线......
【解决方案2】:

我们设法通过将代理服务器配置添加到 feign 配置来修复它。 显然,即使将代理设置为适用于 VM 和 docker 容器,java 代码也明确需要它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2018-05-15
    相关资源
    最近更新 更多