首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有注册客户的Docker和Eureka与Spring Boot

没有注册客户的Docker和Eureka与Spring Boot
EN

Stack Overflow用户
提问于 2017-06-21 04:49:23
回答 5查看 12.8K关注 0票数 6

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

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

代码语言:javascript
复制
server:
  port: 8761
eureka:
  instance:
    prefer-ip-address: true
  client:
    registerWithEureka: false
    fetchRegistry: false
  server:
    waitTimeInMsWhenSyncEmpty: 0

我的Eureka客户端运行在端口9000上,具有以下应用程序属性:

代码语言:javascript
复制
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-复合文件的内容:

代码语言:javascript
复制
eureka-server:
  image: rosenthal/eureka-server
ports:
   - "8761:8761"
user-registration:
  image: rosenthal/user-registration
  ports:
   - "9000:9000"
  links:
   - eureka-server

运行应用程序时,首先启动eureka服务器,然后由客户端通过

代码语言:javascript
复制
mvn spring-boot:run 

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

当我通过docker-组合运行我的应用程序时,客户端无法使用以下输出注册:

代码语言:javascript
复制
 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进入了一个竞争状态,但是我的eureka客户端似乎有一个心跳,试图调用它配置的服务器。这意味着它无法找到我注册的Eureka服务器(并且正在运行,我可以在localhost:8671上导航到它)。

我在这里错过了什么?所有东西在本地运行都很好,由它自己的嵌入式tomcat容器启动。一旦我开始用码头写作,它就不想工作了。

编辑

我想我意识到了我的问题。因此,docker不运行在localhost上,而是在我启动docker时分配的公共IP上运行。导航到此ip +端口显示我为Eureka Server运行的服务。客户还没有注册。

因此,我对我的eureka客户端的application.yml文件进行了更改,以便:

代码语言:javascript
复制
serviceUrl:
  defaultZone: http://192.168.59.103:8761/eureka/

那个IP是我的停靠守护进程正在运行的IP。现在,它错过了第一次注册时,我做码头-撰写,但第二次心跳接住了我的客户。

如何确保客户端在服务器完全启动之前等待?我在我的文档中使用了正确的docker“link”字段,但是它没有像我希望的那样工作。此外,如何将defaultZone文件视为我的DOCKER_HOST IP?

最终结果

得到的对我起作用的对接-撰写文件是:

代码语言:javascript
复制
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
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-06-22 08:30:36

如果对您有用,在某种程度上这就是我如何为我的生产环境配置它(docker-组合文件版本2):

代码语言:javascript
复制
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端口。

票数 3
EN

Stack Overflow用户

发布于 2017-06-21 06:02:05

设置一个环境属性以覆盖eureka.client.serviceUrl.defaultZone,以匹配您的停靠器撰写文件中的服务名称。

代码语言:javascript
复制
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/

票数 9
EN

Stack Overflow用户

发布于 2021-05-28 02:39:21

更新:

看起来,对于较新版本的spring(在我的例子中是2.4.5),这个解决方案不起作用。不会自动拾取EUREKA_CLIENT_SERVICEURL_DEFAULTZONE属性。骆驼壳有一个永久性的问题,这造成了不一致。EUREKA_CLIENT_SERVICEURL_DEFAULTZONE未转换为eureka.client.serviceUrl.defaultZone。它被转换成eureka.client.serviceurl.defaultzone。有关更多细节,请查看此春季云-netflix Github发行版。他们现在不能更改参数,因为这会破坏向后兼容性。下面是对我起作用的代码

代码语言:javascript
复制
   discovery:
     container_name: discovery
     build: .
     ports:
       - "8761:8761"

   user-registration:
     container_name: user-registration
     build: .
     ports:
       - "8080:8080"
     environment:
       SPRING_APPLICATION_JSON: '{"eureka":{"client":{"serviceUrl":{"defaultZone":"http://discovery:8761/eureka"}}}}'

对于要通过环境变量设置的此属性,您必须使用SPRING_APPLICATION_JSON。很丑但很管用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44667063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档