java - 带有 Spring Boot 的 Docker 和 Eureka 无法注册客户端

标签 java spring maven docker spring-boot

我有一个非常简单的使用 Spring Boot + Docker Compose + Eureka 的演示。

我的服务器在端口 8671 上运行,具有以下应用程序属性:

server:
  port: 8761
eureka:
  instance:
    prefer-ip-address: true
  client:
    registerWithEureka: false
    fetchRegistry: false
  server:
    waitTimeInMsWhenSyncEmpty: 0

我的 Eureka 客户端在端口 9000 上运行,具有以下应用程序属性:
server:
  port: 9000
spring:
  application:
    name: user-registration
eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true

当我在父 maven 项目中启动我的 docker.compose 文件时,这是我的 docker-compose 文件的内容:
eureka-server:
  image: rosenthal/eureka-server
ports:
   - "8761:8761"
user-registration:
  image: rosenthal/user-registration
  ports:
   - "9000:9000"
  links:
   - eureka-server

当我通过首先启动 Eureka 服务器来运行我的应用程序时,客户端通过
mvn spring-boot:run 

服务器成功注册了我的客户端(我称之为用户注册)。

当我通过 docker-compose 运行我的应用程序时,客户端无法使用以下输出注册:
 DiscoveryClient_USER-REGISTRATION/0fd640cbc3ba:user-registration:9000: 
 registering service...
 user-registration_1  | 2017-06-21 04:36:05.120 ERROR 1 --- [nfoReplicator-0]        
 c.n.d.s.t.d.RedirectingEurekaHttpClient  : Request execution error
 user-registration_1  | 
 user-registration_1  | com.sun.jersey.api.client.ClientHandlerException: 
 java.net.ConnectException: Connection refused (Connection refused)

我的第一个假设是,运行 docker-compose 在等待服务器启动时遇到了竞争条件,但我的 eureka 客户端似乎有一个心跳,试图调用它配置的服务器。这意味着它无法找到我注册的 Eureka 服务器(并且正在运行,我可以在 localhost:8671 上导航到它)。

我在这里想念什么?一切都在本地运行良好,spring-boot 使用它自己的嵌入式 tomcat 容器启动。一旦我开始使用 docker-compose,它就不想工作了。

编辑

我意识到我的问题,我相信。所以docker不在localhost上运行,它在我启动docker时分配的公共(public)IP上运行。导航到这个 ip + 端口会显示我为 Eureka Server 运行的服务。客户仍然没有注册。

所以,我对我的 Eureka 客户端的 application.yml 文件进行了更改:
serviceUrl:
  defaultZone: http://192.168.59.103:8761/eureka/

该 IP 是我的 docker 守护程序正在运行的 IP。现在,当我执行 docker-compose 时,它​​会错过第一次注册,但第二次心跳会接收到我的客户端。

如何确保客户端等到服务器完全启动?我在我的案卷撰写文件中使用了正确的 docker“链接”字段,但它没有像我希望的那样工作。此外,我如何才能看到 defaultZone 文件是我的 DOCKER_HOST IP?

最后结果

生成的 docker-compose 文件对我来说一切正常:
eureka-server:
  image: thorrism/eureka-server
  ports:
   - "8761:8761"
user-registration:
  image: thorrism/user-registration
  ports:
   - "9000:9000"
  links:
   - eureka-server
  environment:
    EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://eureka-server:8761/eureka

最佳答案

设置环境属性以覆盖 eureka.client.serviceUrl.defaultZone匹配 docker compose 文件中的服务名称。

eureka-server:
  image: rosenthal/eureka-server
  ports:
   - "8761:8761"
user-registration:
  image: rosenthal/user-registration
  ports:
   - "9000:9000"
  environment:
   - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://eureka-server:8761/eureka

这将覆盖打包的 application.properties 中的属性.

注意:如评论中所述,您不需要 links撰写文件中的部分。我删除是这样的。见 https://docs.docker.com/compose/networking/有关这方面的信息。

关于java - 带有 Spring Boot 的 Docker 和 Eureka 无法注册客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44667063/

相关文章:

Java使用流计算最大客户价格

java - 使用 Jackson 和 WebClient 将 json 数组反序列化为对象

eclipse - 为什么"file">“新建”中没有 Spring 项目?

java - 强制发布依赖性,但来自同一构建的模块除外

Java 序列化与继承?

java 套接字 : listen before accept?

Java - 需要两个线程来共享同一个类的简单聊天服务器

java - 从 Spring JDBC 模板执行 SQL 文件

java - 找不到媒体类型 = 文本/html 的 MessageBodyWriter 但适用于 JSON

java - OSGi ClassNotFoundException WSServletContextListener