使用Netflix Eureka注册多个本地微服务实例

开发Spring Boot + Spring Cloud微服务时,我们通常会在本地运行它们,同时运行Spring Cloud Config Server和Spring Cloud Netflix Eureka的本地实例。为我们的微服务开发提供必要的脚手架,并更密切地复制我们的测试和生产环境。

很多时候,我们只是运行一个正在开发的微服务的单个实例,我们几乎不费力地工作:只要通过内部属性(通常在项目的application.properties/.yml配置文件中)为服务提供所需的端口号(如server.port=8080),或将应用程序指向我们的本地Spring Cloud Config Server。但是当您想要运行所述微服务的多个实例并将其注册到Eureka以便它们可以访问微服务时会发生什么?

首先,Spring Cloud Netflix Eureka的一些背景知识:

Eureka是一个服务注册中心,为全局关键分布式系统提供服务注册和发现功能。服务注册表为微服务提供了一种观察和看到的方式,消费微服务可以轻松找到“支持服务”,其他微服务提供消费服务使用的功能。当一个微服务失败/脱机/无法访问时,另一个微快速启动以在不同的位置替换它。服务注册表使微服务实例可以轻松地找到彼此,无论他们在哪个时间点。

在我们的开发机器上本地运行,当一个微服务实例联系Eureka希望自己注册时,Eureka将应用程序的IP地址与它正在侦听的端口号相结合,为该微服务实例创建一个唯一的标识符/定位器。手动更改我们的微服务实例将运行的指定端口(如果启动多个实例)是繁琐的。相反,我们可以通过设置server.port=0其属性来简单地将0指定为我们的微服务的目标端口; 这样做会导致 Spring Boot为我们运行的每个实例分配一个随机可用的端口号

但是有一个问题!我们的微服务实例尝试在此端口分配之前向Eureka注册其存在,从而导致使用本地IP地址和端口号零(0)进行注册,该微服务的每个后续实例也是如此。这有效地限制了我们运行我们希望向本地Eureka实例注册的任何本地微服务的单个实例。幸运的是,有一个简单的解决方法:动态地为每个实例分配一个唯一的instance-id供Eureka使用。

这是一个Github项目
,我演示如何使用咖啡服务(还有什么?)和Spring Cloud的最新快照(目前是Finchley.BUILD-SNAPSHOT)来实现这一目标。我已将以下值添加到从Config Server提供给每个coffee-service实例的属性文件中:

server:  
  port: ${PORT:0}

eureka:  
  instance:
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}

注意:我通常更喜欢将YAML文件用于属性,但也可以将它们(在.properties文件中)表示为直接属性赋值,如下所示:

server.port=${PORT:0}

eureka.instance.instance-id=${spring.application.name}:${spring.application.instance_id:${random.value}}  

第一行分配给server.port变量PORT的值(如果存在); 如果没有,则为0.这会提示Spring Boot分配一个随机的未使用端口。

第二行将当前spring.application.instance_id(如果存在)追加到spring.application.name冒号(:)分隔。如果spring.application.instance_id不存在,则它会附加一个随机值,以便为此实例创建唯一的Eureka实例标识符。

要在IntelliJ IDEA 启动coffee-service 两个实例,我们必须从编辑窗口右上角的下拉菜单中选择“编辑配置…”.在“运行/调试配置”窗口中,我们必须取消选中“仅单实例”复选框,这将在每次运行应用程序时创建一个新的微服务实例,而不是停止现有实例并重新启动它。

现在当我们运行我们的多个实例时coffee-service,我们会看到这些条目出现在我们的Eureka服务日志中.

总结

在本地运行微服务的多个实例 – 并使用Eureka注册它们以实现可发现性 – 只需几个小的配置设置就可以了。使用当前的Spring Cloud快照构建(例如,在这些示例中为Finchley.BUILD-SNAPSHOT)并将设置server.port为0,并将微服务eureka.instance.instance-id设置为唯一的生成字符串:或者动态分配;或者在实例初始化时分配。Spring Cloud Netflix Eureka处理剩下的事情。:)

原文 

https://www.jdon.com/50871

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 使用Netflix Eureka注册多个本地微服务实例

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址