java—从单个主机注册spring boot eureka客户端的多个示例

dz6r00yl  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(336)

更新
本回购协议中的自述文件已更新,以在公认的答案中演示解决方案。
我正在使用一个基于本指南的springboot eureka服务注册和发现的简单示例。
如果我启动一个客户机示例,它将正确注册,并且可以通过 DiscoveryClient . 如果我用另一个名称启动第二个示例,它也可以工作。
但是如果我用相同的名称启动两个示例, Jmeter 板只显示一个正在运行的示例,而 DiscoveryClient 只显示第二个示例。
当我杀死第二个示例时,通过 Jmeter 板和发现客户机可以再次看到第一个示例。
以下是关于我正在采取的步骤和我看到的情况的更多细节:
Eureka 服务器
启动服务器

cd eureka-server
mvn spring-boot:run

访问eureka Jmeter 板http://localhost:8761
请注意,尚未注册任何“示例”
Eureka 客户
启动客户机

cd eureka-client
mvn spring-boot:run

直接访问客户http://localhost:8080/
这个 /whoami 端点将显示客户端对其应用程序名称和端口的自我了解

{
  "springApplicationName":"eureka-client",
  "serverPort":"8080"
}

这个 /instances 端点将需要一分钟来更新,但最终应该显示 eureka-client 已在eureka discovery客户端注册的。

[   
    {
      "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 Jmeter 板上,现在将注册两个客户机。
启动另一个同名客户机
现在试着旋转另一个 eureka-client 仅通过覆盖端口参数:

cd eureka-client
mvn spring-boot:run -Dserver.port=8082

这个 /whoami 的终结点 http://localhost:8082 显示了我们的期望。
大约一分钟后 /instances endpoint现在也显示在端口8082上运行的示例,但是由于某些原因,它没有显示在端口8080上运行的示例。
如果我们检查一下 /instances 上的终结点 http://localhost:8080 我们现在也只看到在8082上运行的示例(尽管很明显,8080上的示例正在运行,因为这正是我们所要求的。
eureka Jmeter 板仅显示 eureka-client 跑步。
这是怎么回事?
让我们尝试终止8082上运行的示例,看看会发生什么。
当我们询问 /instances 在8080上,它仍然只显示8082上的示例。
但一分钟后,它消失了,我们又看到了8080上的示例。
问题是,为什么我们不能同时看到 eureka-client 当他们都跑的时候?

jexiocij

jexiocij1#

对于本地部署,请尝试在eureka-client.properties中配置{namespace}.instanceid属性(如果是基于spring云的安装,请在eureka.instance.metadatamap.instanceid中配置适当的yaml文件)。它深深植根于eureka服务器计算应用程序列表和比较peerawareinstanceregistryimpl的instanceinfo的方式—当没有更多具体数据(例如:示例元数据可用)时,他们会尝试从主机名获取id。。
不过,我不建议将其用于aws部署,因为混淆instanceid会给您带来麻烦,无法确定哪台计算机承载特定的服务-另一方面,我怀疑您是否会在一台计算机上承载两个相同的服务,对吗?

5rgfhyps

5rgfhyps2#

通过在eureka配置文件中设置唯一的euraka.instance.hostname,可以在管理门户中显示所有示例。
主机名用作在com.netflix.discovery.shared.application中存储instanceinfo的密钥(因为没有设置uniqueidentifier)。所以你必须使用唯一的主机名。在这种情况下测试ribbon时,您会发现负载不会平衡。
下面是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

相关问题