更新
this repo中的自述文件已更新,以在接受的答案中演示解决方案。
我正在使用基于this guide的Spring Boot Eureka服务注册和发现的简单示例。
如果我启动一个客户端实例,它会正确注册,并且可以通过DiscoveryClient
看到自己。如果我使用不同的名称启动第二个实例,它也会起作用。
但是,如果我启动两个具有相同名称的实例,则仪表板仅显示1个正在运行的实例,而DiscoveryClient
仅显示第二个实例。
当我杀死第二个实例时,第一个实例再次通过仪表板和发现客户端可见。
以下是我正在采取的步骤和我所看到的步骤的更多细节:
Eureka Server
启动服务器
cd eureka-server
mvn spring-boot:run
上的Eureka信息中心
请注意,尚未注册“实例”
Eureka客户
启动客户端
cd eureka-client
mvn spring-boot:run
访问客户
/whoami
端点将显示客户端对其应用程序名称和端口
{
"springApplicationName":"eureka-client",
"serverPort":"8080"
}
/instances
端点最多需要一分钟才能更新,但最终应显示已在Eureka Discovery客户端注册的eureka-client
的所有实例。
[
{
"host":"hostname",
"port":8080,
"serviceId":"EUREKA-CLIENT",
"uri":"http://hostname:8080",
"secure":false
}
]
您现在也可以再次访问Eureka dashoboard,并在那里看到它。
使用其他名称
启动其他客户端通过执行以下操作,您可以看到另一个客户将被注册:
cd eureka-client
mvn spring-boot:run -Dspring.application.name=foo -Dserver.port=8081
/whoami
端点将显示名称foo
和端口8081
。
在一分钟左右的时间内,/instances
端点也会显示有关此foo
个实例的信息。
在Eureka仪表板上,现在将注册两个客户端。
使用相同的名称
启动另一个客户端现在尝试仅通过覆盖端口参数来启动另一个eureka-client
实例:
cd eureka-client
mvn spring-boot:run -Dserver.port=8082
/whoami
的{{1}}端点显示了我们的期望。
在一分钟左右,http://localhost:8082
端点现在也显示在端口8082上运行的实例,但由于某种原因,它不会显示在端口8080上运行的实例。
如果我们检查/instances
上的/instances
端点,我们现在也只看到在8082上运行的实例(尽管很明显,8080上的那个正在运行,因为那是我们要求的。
Eureka仪表板仅显示1个http://localhost:8080
正在运行的实例。
这里发生了什么?
让我们尝试杀死在8082上运行的实例,看看会发生什么。
当我们在8080上查询eureka-client
时,它仍然只显示8082上的实例。
但是一分钟之后,它消失了,我们再次看到8080上的实例。
问题是,为什么我们在/instances
运行时都看不到这两个实例?
答案 0 :(得分:7)
对于本地部署,请尝试在eureka-client.properties 中配置{namespace} .instanceId属性(或者在基于Spring Cloud的情况下,使用eureka.instance.metadataMap.instanceId获取正确的yaml文件) 。它深深植根于Eureka服务器计算应用程序列表的方式,并比较PeerAwareInstanceRegistryImpl的InstanceInfo - 当没有更具体的数据(例如:实例元数据可用)时,它们尝试从主机名中获取id ..
我不建议将其用于AWS部署,因为使用instanceId会导致您无法确定哪台计算机托管特定服务 - 另一方面我怀疑您将在一台计算机上托管两个相同的服务,正确?
答案 1 :(得分:5)
通过在Eureka配置文件中设置唯一的euraka.instance.hostname,以便在管理门户中显示所有实例。
主机名用作在com.netflix.discovery.shared.Application中存储InstanceInfo的密钥(因为没有设置UniqueIdentifier)。所以你必须使用独特的主机名。在这种情况下测试功能区时,您会发现负载不会平衡。
以下是application.yml的例子:
server:
port: ${PORT:0}
info:
component: example.server
logging:
level:
com.netflix.discovery: 'OFF'
org.springframework.cloud: 'DEBUG'
eureka:
instance:
leaseRenewalIntervalInSeconds: 1
leaseExpirationDurationInSeconds: 1
metadataMap:
instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}}
instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}}
以前在Eureka发现了一个错误,您可以在https://github.com/codecentric/spring-boot-admin/issues/134
中查看更多信息