Feign.Builder“目标值必须是绝对的”错误:如何使用绝对URL调用Docker容器?

时间:2019-09-17 13:54:15

标签: docker openfeign

我有几个与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");
  }

问题来了:其他服务的网址如下:

another-service:8080/check

在本地测试中,这不是问题,因为配置文件local具有http://localhost:8080,依此类推。但是在端到端测试中,这不能绕过绝对检查。

那么,现在该怎么办?

1 个答案:

答案 0 :(得分:0)

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

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

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

请注意,我使用的是内部端口,而不是“外部”端口。例如,如果“ service-A”具有以下端口配置:

ports:
  - "8083:8080"

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

PS:

我使用uname -a检查容器的发行版是否为Debian,然后我apt update && apt install curl安装curl可执行文件。