5

我有几个相互通信的微服务OpenFeign。每个都是一个项目的子模块(称为“父”),具有自己的 docker 容器。

好的。因此,当我想使用feign.builder().target()方法构建客户端时,会出现一个错误,声称“目标值必须是绝对的”。我检查了源代码,它的意思是(feign.RequestTemplate.target(RequestTemplate.java:447)):

  public static boolean isAbsolute(String uri) {
    return uri != null && !uri.isEmpty() && uri.startsWith("http");
  }

问题来了:其他服务的url是这样的:

another-service:8080/check

在本地测试中,这不是问题,因为配置文件localhttp://localhost:8080等等。但是在端到端测试中,这不能绕过绝对检查。

那么,现在该怎么办?

4

1 回答 1

7

我刚刚http://在服务名称之前添加,这是固定的。

看起来在创建需要相互通信的容器时,docker 做了两件事:

  • 创建由这些容器组成的网络,并为每个容器分配 IP。就我而言,IP 是 like 172.26.0.2,而不是localhostor 192.168.xx.xx
  • 充当 DNS 服务器:它将 IP 映射到与.中的服务名称相同的域docker-compose.yml。就像,在docker-compose.yml我有service-A,在 docker 的网络中,我可以docker exec -it bash运行 shell 并curl http://service-A:8080访问它。

请注意,我使用的是内部端口,而不是“外部”端口。例如,如果服务 A 的端口配置如下:

ports:
  - "8083:8080"

在网络内部(curl来自其他容器)我们使用 8080,但从“外部”(来自主机,使用 Postman)我们使用 8083。

PS:

我曾经uname -a检查容器的 dist 是 Debian,然后我apt update && apt install curl安装curl可执行文件。

于 2019-09-18T13:08:34.387 回答