spring cloud中的实例命名规则

springboot实例的默认命名
SpringCloud体系里的,服务实体向eureka注册时,注册名默认是“IP名:应用名:应用端口名”,即 spring.cloud.client.ipAddress: s p r i n g . c l o u d . c l i e n t . i p A d d r e s s : {spring.application.name}:{spring.application.instance_id: {spring.application.instance_id: {server.port}}。

有些文章说默认的instance-id注册名是用机器主机名代替ip名,至少我在SpringCloud版本Dalston和Edgware下,无论eureka.instance.prefer-ip-address为true或者false,注册到eureka界面的都是以ip开头的,更高版本还没试过。

那么如果我们想自定义服务在eureka上的实例名怎么弄呢?这个需求在服务多实例部署下很自然,因为多个实例下,可能不同的实例运行的是不同的版本,如果在eureka界面能看到每个实例运行的版本号,就更加方便问题的排查。尤其在开发和测试环境下,有些实例A运行的版本可能没有另外一些实例B运行版本的功能,但是ribbon又做了负载均衡,将对应这些功能的请求转发到A,就会造成错误的响应。如果eureka界面显示了版本号,那么我们就能先行定位问题的来源是不是版本的问题。

给实例加上版本号
说了那么多,那么怎么给eureka界面上实例的显示名字加上版本号呢,或者说自定义格式。有如下步骤:

(1)要配置的属性为eureka.instance.instance-id。或者eureka.instance.instanceId也可以。好像目前SpringCloud对属性的中划线和驼峰型写法区分并不是很严。

(2)eureka.instance.instance-id必须写在application.properties或application.yml中。不能写在bootstrap.properties和bootstrap.yml中。可以去了解下springboot加载默认配置文件的顺序,bootstrap是在application之前的。写在bootstrap里的话,自定义的instance-id并不会在eureka界面生效,原理没研究过。

(3)取值如下,这里以写在application.properties为例:

eureka.instance.instance-id= spring.cloud.client.ipAddress: s p r i n g . c l o u d . c l i e n t . i p A d d r e s s : {spring.application.name}: server.port:@project.version@project.versionmavenspringbootparentmaven s e r v e r . p o r t : @ p r o j e c t . v e r s i o n @ 这 里 注 意 p r o j e c t . v e r s i o n 是 引 用 m a v e n 里 面 的 属 性 , 因 为 s p r i n g b o o t 的 p a r e n t 包 将 m a v e n 中 默 认 的 {*}修改成了@*@,所以引用maven属性要用@@,而其他的比如server.port本来就是springboot的属性,直接${}。另一种方法可以参考博文http://blog.csdn.net/gj5266400/article/details/74914486 修改springboot对maven属性的引用符,统一为${}。

修改完后再次启动实例,eureka界面注册服务名已经加上了版本号

    原文作者:Spring Cloud
    原文地址: https://blog.csdn.net/m0_37556444/article/details/82659068
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞