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

Posted

技术标签:

【中文标题】Eureka 客户端无法使用 docker 连接到服务器【英文标题】:Eureka client cannot connect to server with docker 【发布时间】:2019-08-06 20:04:27 【问题描述】:

当我通过Intellij启动zuul和eureka时,一切正常,zuul注册在eureka-server上。在尤里卡服务器中我看到了

2019-03-15 18:00:20.727  INFO 31713 --- [nio-8761-exec-2] c.n.e.registry.AbstractInstanceRegistry  : Registered instance ZUUL-SERVER/192.168.0.11:zuul-server:8762 with status UP (replication=false)
2019-03-15 18:00:21.309  INFO 31713 --- [nio-8761-exec-3] c.n.e.registry.AbstractInstanceRegistry  : Registered instance ZUUL-SERVER/192.168.0.11:zuul-server:8762 with status UP (replication=true)

但是当我尝试在 zuul 容器中使用 docker-compose up -d 使用 docker 启动这两个服务时,我遇到了异常:

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.DiscoveryClient.getAndStoreFullRegistry(DiscoveryClient.java:1051) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.DiscoveryClient.fetchRegistry(DiscoveryClient.java:965) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.DiscoveryClient.<init>(DiscoveryClient.java:414) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.DiscoveryClient.<init>(DiscoveryClient.java:269) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at org.springframework.cloud.netflix.eureka.CloudEurekaClient.<init>(CloudEurekaClient.java:63) ~[spring-cloud-netflix-eureka-client-2.1.0.M1.jar!/:2.1.0.M1]
    at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration.eurekaClient(EurekaClientAutoConfiguration.java:290) ~[spring-cloud-netflix-eureka-client-2.1.0.M1.jar!/:2.1.0.M1]
    at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration$$EnhancerBySpringCGLIB$$8fcb0d88.CGLIB$eurekaClient$2(<generated>) ~[spring-cloud-netflix-eureka-client-2.1.0.M1.jar!/:2.1.0.M1]

spring-boot-starter-parent 的版本是2.1.2.RELEASEspring-cloud 的eureka 和zuul 版本是Greenwich.M1

eureka-server 属性文件:

# Give a name to the eureka server
spring.application.name=eureka-server

# default port for eureka server
server.port=8761

# eureka by default will register itself as a client. So, we need to set it to false.
# What's a client server? See other microservices (image, gallery, auth, etc).
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

zuul-properties 文件包含这一行:

eureka.client.service-url.default-zone=http://eureka:8761/eureka/

docker-compose.yml 文件(相关服务)

version: "2"

services:
  eureka:
    container_name: eureka
    build:
      context: .
      dockerfile: eureka.Dockerfile
    image: eureka-service
    ports: 
      - "8761:8761"
    networks:
      - event-network

  zuul:
    container_name: zuul
    build:
      context: .
      dockerfile: zuul.Dockerfile
    image: zuul-service
    ports: 
      - "8762:8762"
    networks:
      - event-network

networks:
  event-network:
    driver: bridge

在这两个 Dockerfile 中,我只是将 jar 添加到容器并使用 java -jar 命令启动 jar。我用 @EnableEurekaClient 注释了 zuul 主类,用 @EnableEurekaServer 注释了 eureka 主类。我认为该异常与 zuul 无关,因为我的其他微服务也有同样的问题。其余的也无法连接到尤里卡。

当我在容器中或通过 intellij 启动 eureka 时,我可以访问 eureka 仪表板。我什至试图用this 代替我的图像,但我得到了同样的例外。我也试过docker exec "zuul" -it bash,在那个zuul容器里面我试过curl eureka:8761,我可以正常访问仪表板。

【问题讨论】:

【参考方案1】:

不确定 Eureka,但 nginx 代理服务器也有类似问题。 Nginx 无法识别 docker 的主机解析器,我使用的一种可能的解决方案是获取特定容器服务的静态 IP。

对于这种情况,可以为 Eureka 容器设置静态 IP 并在 Zuul 的配置文件中使用它。

当然,如果您有一个 Eureca 容器,这将起作用。对于很多容器来说,应该看看 zuul 如何读取和理解 docker 的主机解析器。

【讨论】:

以上是关于Eureka 客户端无法使用 docker 连接到服务器的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 JDBC 连接到 docker 中的本地 MySQL

我无法使用 DataGrip 数据库客户端从本地主机连接到 docker 中的 mysql

无法从 Docker 容器连接到外部 SQL Server

无法使用 django-channels 连接到 websocket,docker 上的 nginx 作为服务

Flyway 无法从 Docker-Container 连接到 MySQL

无法连接到在本地 Docker 容器中运行的 Go GRPC 服务器