微服务未在所有 Eureka 实例上注册

Posted

技术标签:

【中文标题】微服务未在所有 Eureka 实例上注册【英文标题】:Microservices not registering on all Eureka Instances 【发布时间】:2020-04-16 18:35:28 【问题描述】:

Spring Boot 版本:2.1.6.RELEASE

Spring Cloud 版本:Greenwich.SR1

目的是在一个集群中建立两个Eureka Servers实例,并将所有微服务都注册到这两个实例上,以实现HA。目前我正在运行 Ubuntu 18.04 的本地机器上对此进行测试。

所以正如官方文档中提到的,我已经设置了 Eureka 实例的点对点感知。在启动两个 Eureka 服务器实例时,在 Instance-1(端口 8080)的仪表板上显示 Instance-2 名称的可用副本和在 Instance-2(端口 8081)的仪表板上显示 Instance-1 名称。到目前为止一切顺利。

我已将它们作为战争部署在外部 tomcat 服务器上,而不是作为 jar 运行。战争名称是“eureka-naming-server”。所以我的访问 URL 变为:http://localhost:8080/eureka-naming-server/eureka 和 http://localhost:8081/eureka-naming-server/eureka。

我已经使用 Apache 2 和 mod_jk 设置了负载平衡器。因此,我可以使用 Apache URL 作为http://localhost:80/eureka-naming-server/eureka 访问它们,而不是使用它们各自的 URL 访问它们,即 http://localhost:8080/eureka-naming-server/eureka、http://localhost:8081/eureka-naming-server/eureka,并且我可以看到负载平衡正常进行。

现在的问题是,一旦我在微服务中将 Eureka URL 指定为 http://localhost:80/eureka-naming-server/eureka,它只会在一个实例上注册,具体取决于负载均衡器重定向请求的 Eureka 实例。但是即使设置了点对点感知,微服务也没有在另一个 eureka 实例上注册。

在 Eureak 服务器中,我使用以下依赖项:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

Eureka-1 道具:

spring:
  application:
    name: eureka-naming-server
  jmx:
    default-domain: eureka-naming-server
eureka:
  client:
    service-url:
      defaultZone: http://eureka-server-2:8081/eureka-naming-server/eureka

    #register-with-eureka: false
    #fetch-registry: false
  instance:
    hostname: eureka-server-1

Eureka-2 道具:

spring:
  application:
    name: eureka-naming-server
  jmx:
    default-domain: eureka-naming-server
eureka:
  client:
    service-url:
      defaultZone: http://eureka-server-1:8080/eureka-naming-server/eureka

    #register-with-eureka: false
    #fetch-registry: false
  instance:
    hostname: eureka-server-2

在微服务中,我使用以下依赖项:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

微服务道具:

eureka:
  instance:
    metadata-map:
      configPath: /config
  client:
    service-url:
      defaultZone: http://localhost/eureka-naming-server/eureka

在机器的 /etc/hosts 文件中,我将其设置为:

127.0.0.1 eureka-server-1

127.0.0.1 eureka-server-2

注册它的 eureka 实例我可以在日志中看到以下内容:

WARN 13748 --- [nio-8009-exec-3] Registered instance CONFIG-SERVER/192.168.1.16:config-server:8888 with status UP (replication=false)

另一个未注册的 Eureka 实例,当它因为负载均衡器而收到心跳时,会在日志中显示:

WARN 13748 --- [nio-8009-exec-3] c.n.e.registry.AbstractInstanceRegistry  : DS: Registry: lease doesn't exist, registering resource: CONFIG-SERVER - 192.168.1.16:config-server:8888
2019-12-26 19:00:34.995  WARN 13748 --- [nio-8009-exec-3] c.n.eureka.resources.InstanceResource    : Not Found (Renew): CONFIG-SERVER - 192.168.1.16:config-server:8888

Eureka-1 仪表板

Eureka-2 仪表板

我已经尝试过here 和here 提到的建议。但似乎没有任何效果。

那么我会在这里遗漏什么?

【问题讨论】:

【参考方案1】:

问题:

spring:
  application:
    name: eureka-naming-server

您为应用程序输入了相同的名称,因此它显示为这样。

你需要把它改成,

Eureka-1 道具:

spring:
  application:
    name: eureka-naming-server-1

Eureka-2 道具:

spring:
  application:
    name: eureka-naming-server-2

【讨论】:

【参考方案2】:

检查你的 eureka 服务器的安全配置可能也是值得的。如果您确实启用了 Spring Boot 安全性,则需要确保在配置的 defaultZone 部分中包含相应的用户名/密码。

即在你的尤里卡服务器 1 配置中:eureka.client.serviceUrl.defaultZone=http://:@eureka-server-2:8761/eureka

(对于你的 eureka server 2 配置反之亦然)

我之所以提到这一点,是因为我在该配置值中遗漏了我自己的用户名/密码值,并且它没有在我的所有 eureka 实例上注册我的微服务。进行此更改后,它按我的预期工作。

【讨论】:

以上是关于微服务未在所有 Eureka 实例上注册的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud微服务的服务治理组件eureka

Eureka入门

浅谈微服务

浅谈微服务

微服务发现与注册之Eureka源码分析

向 Eureka 服务器注册 Spring Cloud 微服务