Feign.Builder "target values must be absolute" error: how to call docker container with absolute url?
Feign.Builder "target values must be absolute" error: how to call docker container with absolute url?
我有几个微服务通过 OpenFeign
相互通信。每个都是一个项目的子模块(称之为 "parent"),有自己的 docker 容器。
好的。因此,当我想使用 feign.builder().target()
方法构建客户端时,出现了一个错误,声称 "target values must be absolute"。我查了下源码,意思是(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
在本地测试中,这不是问题,因为配置文件 local
有 http://localhost:8080
等等。但在端到端测试中,这无法绕过绝对检查。
那么,现在该怎么办?
我刚刚在服务名称前添加了http://
,这是固定的。
看起来在创建需要相互通信的容器时,docker 做了两件事:
- 创建一个由这些容器组成的网络,并为每个容器分配 IP。就我而言,IP 类似于
172.26.0.2
,而不是 localhost
或 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
可执行文件。
我有几个微服务通过 OpenFeign
相互通信。每个都是一个项目的子模块(称之为 "parent"),有自己的 docker 容器。
好的。因此,当我想使用 feign.builder().target()
方法构建客户端时,出现了一个错误,声称 "target values must be absolute"。我查了下源码,意思是(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
在本地测试中,这不是问题,因为配置文件 local
有 http://localhost:8080
等等。但在端到端测试中,这无法绕过绝对检查。
那么,现在该怎么办?
我刚刚在服务名称前添加了http://
,这是固定的。
看起来在创建需要相互通信的容器时,docker 做了两件事:
- 创建一个由这些容器组成的网络,并为每个容器分配 IP。就我而言,IP 类似于
172.26.0.2
,而不是localhost
或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
可执行文件。