gradle 指定springcloud 版本_springcloud小技能:服务注册发现如何隔离
用過dubbo的都知道,dubbo服務發布&訂閱有2個重要的參數:version和group。即消費者和生產者不但需要要接口名完全一致,還需要version和group也完全一致,才能成功的匹配到服務:
- version主要作用是某個接口的實現出現不兼容升級的時候,用來過渡,例如老版本申明為version="1.0.0",新版本就可以申明為version="2.0.0";
- group主要作用就是某個接口有多個實現類,那么通過group區分,消費者通過group參數決定調用哪個group的服務;
此外這里還有一個作用,如下圖所示,為了讓本地消費者只調用本地生產者提供的服務,也可以通過version或者group隔離(dubbo的直連也可以實現):
dubbo
那么,在springcloud微服務架構下開發,同樣會遇到這個問題,又該怎么解決呢?如下圖所示,假設生產者2暴露的xxx-user服務是我們本地開發環境的服務,如何讓消費者只調用生產者2提供的服務,而不是在生產者1和生產者2之中選擇:
springcloud
源碼之中毫無秘密,我們先看服務發現的源碼,以consul作為注冊中心為例,源碼在ConsulServerList.java中:
private?List?getServers()?{????if?(this.client?==?null)?{????????return?Collections.emptyList();????}????String?tag?=?getTag();?//?null?is?ok????Response>?response?=?this.client.getHealthServices(????????????this.serviceId,?tag,?this.properties.isQueryPassing(),????????????createQueryParamsForClientRequest(),?this.properties.getAclToken());????if?(response.getValue()?==?null?||?response.getValue().isEmpty())?{????????return?Collections.emptyList();????}????return?transformResponse(response.getValue());}由這段源碼可知,從注冊中心獲取服務時,除了最核心的服務ID(serviceId),還有其他一些參數,例如tag。參數tag就是本文要介紹的實現服務注冊&發現隔離性,tag獲取源碼如下:
public?String?getQueryTagForService(String?serviceId){????String?tag?=?serverListQueryTags.get(serviceId);????return?tag?!=?null???tag?:?defaultQueryTag;}并且它優先取ConsulDiscoveryProperties中的serverListQueryTags,如果這個集合為空,再嘗試取defaultQueryTag:
@ConfigurationProperties("spring.cloud.consul.discovery")@Datapublic?class?ConsulDiscoveryProperties?{????/**?????*?Map?of?serviceId's?->?tag?to?query?for?in?server?list.?????*?This?allows?filtering?services?by?a?single?tag.?????*/????private?Map?serverListQueryTags?=?new?HashMap<>();????/**?Tag?to?query?for?in?service?list?if?one?is?not?listed?in?serverListQueryTags.?*/????private?String?defaultQueryTag;????......}OK,到這里我們就知道服務的消費者可以通過如下兩個配置去發現特定tag的服務:
- spring.cloud.consul.discovery.serverListQueryTags.xxx-user=afei,這個參數是指定某個特定服務(例如xxx-user)的某個tag(例如afei)服務提供者。
- spring.cloud.consul.discovery.defaultQueryTag=afei ,這個參數是指定所有服務的某個tag(例如afei)服務提供者。
服務生產者只需要指定如下參數即可,且通過ConsulDiscoveryProperties中的tags定義可知,還可以指定多個tag,中間以逗號隔開即可(springboot的實現機制):
- spring.cloud.consul.discovery.tags=afei
- spring.cloud.consul.discovery.tags=afei,hulk
@ConfigurationProperties("spring.cloud.consul.discovery")@Datapublic?class?ConsulDiscoveryProperties?{????/**?Tags?to?use?when?registering?service?*/????private?List?tags?=?new?ArrayList<>();????......}
最后,圖解如下,雖然生產者1和生產者2的服務ID都是xxx-user,但是生產者2指定了tag為"afei",那么同樣指定了tag為afei消費者只會發現生產者2暴露的服務,而不會找到生產者1暴露的服務:
springcloud tag原理圖
事實上springcloud的ConsulDiscoveryProperties.java中還定義了另外兩個屬性instanceZone和instanceGroup,對應的springboot配置如下,也可以解決這個問題
總結
以上是生活随笔為你收集整理的gradle 指定springcloud 版本_springcloud小技能:服务注册发现如何隔离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: canvas rotate 累加旋转_高
- 下一篇: 电脑雕刻教程_湖南益阳3DMAX建模培训