当前位置: 首页 > 知识库问答 >
问题:

spring boot的Docker和Eureka未能注册客户

滕弘新
2023-03-14

我有一个使用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客户机似乎有心跳试图向配置它的服务器调用home。这意味着它无法找到我注册的Eureka服务器(并且正在运行,我可以在localhost:8671上导航到它)。

我错过了什么?在本地运行时,所有的一切都运行得很好,spring启动时使用它自己的嵌入式tomcat容器。当我开始使用docker-compose时,它就不想工作了。

我相信我意识到了我的问题。所以docker不在localhost上运行,而是在我启动docker时分配给它的公共IP上运行。导航到此ip+端口显示为Eureka服务器运行的我的服务。客户仍然没有注册。

因此,我将eureka客户端的application.yml文件修改为:

serviceUrl:
  defaultZone: http://192.168.59.103:8761/eureka/

该IP是我的docker后台进程运行的IP。现在,当我做docker-compose时,它错过了第一次注册,但是第二次心跳会接起我的客户机。

如何确保客户端一直等到服务器完全启动?我在我的docket compose文件中使用了适当的docker“links”字段,但它并没有像我希望的那样工作。另外,我如何看到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

共有2个答案

申屠飞
2023-03-14

设置环境属性以重写eureka.client.Serviceurl.DefaultZone以匹配docker组合文件中的服务名称。

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中的属性。

注意:正如注释中所提到的,您不需要compose文件中的links部分。我移除了它。请参阅https://docs.docker.com/compose/networking/了解有关信息。

韩明德
2023-03-14

如果对您有用的话,这是我在生产环境(docker-compose file version 2)中配置它的方式:

version: '2'
services:
  eureka-server:
    image: rosenthal/eureka-server
    expose:
    - "8761"
  user-registration:
    image: rosenthal/user-registration
    container_name: user-registration
    ports:
    - "9000:8080"
    environment:
      server.port: 8080
      eureka.client.enabled: 'true'
      eureka.host: eureka-server
      eureka.instance.preferIpAddress: 'true'

在文档中,expose就是这样做的:

公开端口而不将其发布到主机--它们仅可被链接的服务访问。只能指定内部端口。

由于所有的东西都在同一个网络中,容器之间没有链接就可以互相看到。

附注

请记住,通过此配置,端口9000将在主机上公开访问,并映射到用户注册容器的8080端口。

 类似资料:
  • pom.xml 主应用程序类 Application.Properties eureka客户端设置 pom.xml Application.Properties 我在eureka-server仪表板(http://localhost:8761)中没有看到向Eureka server注册的micro-service-currency-exchange-service 为什么eureka客户端没有注册

  • 我们正在尝试在Docker容器上部署NetflixEureka服务器,Docker容器是一个Spring Boot应用程序。我们将其部署为Docker服务,Docker集群用于容器编排。当我们直接创建容器并运行应用程序时,一切都很好。Eureka服务器使用正确的IP地址注册所有客户端应用程序。但是当我们创建并部署为docker服务时,它会使用错误的IP地址注册应用程序。 我们已经根据 spring

  • 我对docker,Spring框架的一切都很陌生…它们成功地在localhost环境中运行,现在我想把它们推送到docker中,但是总是给我错误,我在那里卡住了大约一周。有人能帮我弄清楚吗!!! 现在我有 eureka 服务器和云配置服务器服务,这是我的代码: 尤里卡服务器应用程序.yml 和 Dockerfile: 现在我有云配置服务器应用程序.yml:在这个文件中,我试图在github上备份它

  • 我刚刚关注了下面这篇文章,https://spring.io/blog/2015/07/14/microservices-with-spring,但是我无法在尤里卡注册我的微服务。 customer-service.yml build . gradle for customer-service CustomerService.java 注册-server.yml

  • 该应用程序在Eureka注册后以“未知”的状态启动,并且从未更改为“启动”。如果这些标志中的任何一个被设置为false,那么应用程序启动时注册为“up”。 当两个标志都启用/true时,我看到了以下一系列日志记录: 我如何让应用程序注册为启用了这两个标志/真? bootstrap.yml

  • 本规范不排除使用未注册的客户端。然而,使用这样的客户端超出了本规范的范围,并需要额外的安全性分析并审查其互操作性影响。