Spring Cloud Netflix 和 Docker Compose - 无法向 eureka 注册服务

Posted

技术标签:

【中文标题】Spring Cloud Netflix 和 Docker Compose - 无法向 eureka 注册服务【英文标题】:Spring Cloud Netflix and Docker Compose - cannot register services with eureka 【发布时间】:2018-01-01 22:59:46 【问题描述】:

我正在尝试使用 docker-compose 在本地(Ubuntu)运行 2 个简单服务:一个 eureka 服务器和配置服务器(它也是一个 eureka 客户端)。这两个都有简单的 dockerfiles 运行java -jar,公开它们的端口,并且单独工作正常。我还尝试添加eureka.client.service-url.defaultZone=http://company-service-discovery:8761/eureka 以查看它是否会自行注册,并且有效。

我的配置服务器无法成功注册到 eureka 服务器,我用谷歌搜索了它,但我没有看到任何帮助我解决了这个问题。

根据https://docs.docker.com/compose/networking/ 的 docker-compose 文档:

默认情况下,Compose 会为您的应用设置一个网络。服务的每个容器都加入默认网络,并且该网络上的其他容器都可以访问它们,并且它们可以通过与容器名称相同的主机名发现。

通过下面的例子web应该可以使用postgres://db:5432与数据库进行通信。

version: "3"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"

我使用相同的方法来配置我的服务,但是我的配置服务器在尝试注册时被拒绝连接:

docker-compose.yml

version: '3.3'
services:
  company-service-discovery:
    build: company-service-discovery/
    ports:
      - "8761:8761"
  company-config-server:
    build: company-config-server/
    ports:
      - "8888:8888"
    links:
      - company-service-discovery

配置服务器 bootstrap.yml

server:
  port: 8888

management:
  security:
    enabled: false

spring:
  application:
    name: company-config-server
  cloud:
    config:
      server:
        native:
          search-locations: classpath:/shared
  profiles:
    include: native

eureka:
  client:
    service-url:
      defaultZone: http://company-service-discovery:8761/eureka

eureka 服务器 bootstrap.yml

spring:
  application:
    name: company-service-discovery

server:
  port: 8761

management:
  security:
    enabled: false

异常

2017-07-26 14:25:05.738  WARN 1 --- [nfoReplicator-0] c.n.d.s.t.d.RetryableEurekaHttpClient    : Request execution failed with message: java.net.ConnectException: Connection refused (Connection refused)
2017-07-26 14:25:05.739  WARN 1 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_COMPANY-CONFIG-SERVER/365d20275ab0:company-config-server:8888 - registration failed Cannot execute request on any known server

问题

我的配置有什么问题吗?我怎样才能让它工作?

如果缺少任何信息,请告诉我,我很乐意提供任何信息。

【问题讨论】:

【参考方案1】:

也将defaultZone 配置添加到Eureka 服务器的属性中(并在您的配置服务器bootstrap.yml 中将service-url 更改为serviceUrl)。

eureka 服务器 bootstrap.yml

spring:
  application:
    name: company-service-discovery

eureka:
  client:
    serviceUrl:
      defaultZone: http://company-service-discovery:8761/eureka

server:
  port: 8761

management:
  security:
    enabled: false

【讨论】:

我为此奋斗了好几天,直到今天我用mvn clean install 重新创建了 jar 后最终重新创建了 docker 图像。我很愚蠢,在属性文件中从 localhost 更改为服务名称 URL 后忘记了这样做。在那之后一切都结束了。现在不知道该怎么处理这个问题。我应该使用解决方案编辑原始帖子吗?【参考方案2】:

非常感谢。这篇文章解决了我的问题 - 使用 docker 将尤里卡客户端连接到尤里卡服务器。经过2天的搜索它工作。我流泪了。

所以基本上 -

您应该在 eureka 客户端的 application.properties/.yml 中使用以下内容

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

在 docker-compose.yml 中,您的 eureka 服务名称应与 - url 主机名匹配,在我的情况下是 - eureka-server

【讨论】:

以上是关于Spring Cloud Netflix 和 Docker Compose - 无法向 eureka 注册服务的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Netflix(网飞)

随手记录关于spring-cloud-starter-eureka-server 和 spring-cloud-starter-netflix-eureka-server

Spring Cloud 入门教程:和RabbitMQ的整合 -- 消息总线Spring Cloud Netflix Bus

Netflix之后,如何用Spring Cloud 新组件构建微服务架构?

spring-cloud-starter-eureka-server 和 spring-cloud-starter-netflix-eureka-server的区别

Spring cloud netflix 和 HystrixObservable --> JsonMappingException