docker中的尤里卡客户端未与尤里卡服务器连接

Posted

技术标签:

【中文标题】docker中的尤里卡客户端未与尤里卡服务器连接【英文标题】:Eureka client in docker not connecting with Eureka server 【发布时间】:2018-05-12 08:29:06 【问题描述】:

我有一个 eureka 服务器。

server:
  port: 8761
eureka:
  client:
    registerWithEureka: false
    fetchRegistry: false

我有一个 eureka 客户端。

spring:
  application:
    name: mysearch
server:
  port: 8020
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka
  instance:
    preferIpAddress: true

我的 eureka 客户端在 docker 容器中运行。

FROM java:8
COPY ./mysearch.jar /var/tmp/app.jar
EXPOSE 8180
CMD ["java","-jar","/var/tmp/app.jar"]

我正在通过java -jar eureka-server.jar 启动尤里卡服务器 之后,我使用启动尤里卡客户端的 docker 实例 sudo docker build -t web .sudo docker run -p 8180:8020 -it web。 我可以从浏览器访问尤里卡客户端和服务器,但客户端没有与尤里卡服务器连接。我无法在尤里卡服务器仪表板中看到客户端。我收到以下错误和警告。

WARN 1 --- [tbeatExecutor-0] c.n.d.s.t.d.RetryableEurekaHttpClient    : Request execution failed with message: java.net.ConnectException: Connection refused (Connection refused)
ERROR 1 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_FLIGHTSEARCH/98b0d95fd668:flightsearch:8020 - was unable to send heartbeat!
INFO 1 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_FLIGHTSEARCH/98b0d95fd668:flightsearch:8020: registering service...
ERROR 1 --- [nfoReplicator-0] c.n.d.s.t.d.RedirectingEurekaHttpClient  : Request execution error
WARN 1 --- [nfoReplicator-0] c.n.d.s.t.d.RetryableEurekaHttpClient    : Request execution failed with message: java.net.ConnectException: Connection refused (Connection refused)
WARN 1 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_FLIGHTSEARCH/98b0d95fd668:flightsearch:8020 - registration failed Cannot execute request on any known server
WARN 1 --- [nfoReplicator-0] c.n.discovery.InstanceInfoReplicator     : There was a problem with the instance info replicator

我在 AWS EC2 Ubuntu 实例中执行此操作。 谁能告诉我我在这里做错了什么?

【问题讨论】:

【参考方案1】:
server:
  ports:
      - "8761:8761"
eureka:
  client:
    registerWithEureka: false
    fetchRegistry: false

通过上述更改,端口 8761 将在主机上公开并可以连接到服务器。 当您使用 localhost "http://localhost:8761/eureka" 进行连接时,它正在主机上搜索端口 8761。

在 Eureka 客户端配置中使用主机 ip 而不是 localhost,因为如果使用 localhost,它会在容器中搜索端口 8761

http://hostip:8761/eureka

【讨论】:

感谢您的回复。我试图将您的更改放在我的尤里卡服务器 yml 文件中。但是日食说“端口”是不正确的。如果我给端口:8761:8761 尤里卡服务器不接受它。服务器暴露在嵌入式 tomcat 的 8080 端口上。实际上,我对所有这些都是新手。可能是我没有正确理解你在说什么。你能告诉我我能输入的确切值吗? 对不起,我以为是 docker compose 文件,实际上是一个 eureka 配置文件,像之前一样使用端口:8761。但是在 docker 中使用hostip:8761/eureka 连接到服务器的客户端中,在它尝试与容器本身连接之前 您能否接受答案,以便对其他人有所帮助 更新的答案你接受它解决了你的问题,如果他们遇到类似的问题,其他人可以使用该解决方案 我怎样才能知道 hostip ?【参考方案2】:

确保你在Swarm模式下运行。(单节点也可以运行Swarm)

$ docker swarm init

创建了一个覆盖网络,以便服务可以相互 ping 通。

$ docker network create -d overlay mybridge

为 eurika 客户端设置 application.property 如下

eureka.client.service-url.defaultZone=http://discovery:8761/eureka

现在创建第一个发现服务(Eureka 发现服务器)

$ docker service create  -d --name discovery --network mybridge \
    --replicas 1 -p 8761:8761 server-discovery

打开您的浏览器并点击端口 8761 的任何节点

现在创建客户端服务:

$ docker service create  -d --name goodbyeapp --network mybridge \
    --replicas 1 -p 2222:2222 goodbye-service

这将注册到发现服务。

【讨论】:

【参考方案3】:

在容器世界中,每次重启eureka server时eureka server ip地址都会发生变化。因此,为 eureka 服务器 url 指定主机 ip 地址并不总是有效。

在 docker-compose.yml 中,我必须将 eureka 客户端服务链接到 eureka 服务器容器。在我链接服务之前,尤里卡客户端无法连接到服务器。

这已经在最近的另一个帖子中得到了回答:Applications not registering to eureka when using docker-compose

【讨论】:

以上是关于docker中的尤里卡客户端未与尤里卡服务器连接的主要内容,如果未能解决你的问题,请参考以下文章

无法将客户端注册到尤里卡服务器

Eureka 客户端无法使用 docker 连接到服务器

尤里卡服务给出请求执行错误?

如何创建注册到尤里卡服务注册表的多个尤里卡服务实例?

尤里卡中的自定​​义行

Swift 3 中的尤里卡