gradle 指定springcloud 版本_springcloud小技能:服务注册发现如何隔离
用過(guò)dubbo的都知道,dubbo服務(wù)發(fā)布&訂閱有2個(gè)重要的參數(shù):version和group。即消費(fèi)者和生產(chǎn)者不但需要要接口名完全一致,還需要version和group也完全一致,才能成功的匹配到服務(wù):
- version主要作用是某個(gè)接口的實(shí)現(xiàn)出現(xiàn)不兼容升級(jí)的時(shí)候,用來(lái)過(guò)渡,例如老版本申明為version="1.0.0",新版本就可以申明為version="2.0.0";
- group主要作用就是某個(gè)接口有多個(gè)實(shí)現(xiàn)類,那么通過(guò)group區(qū)分,消費(fèi)者通過(guò)group參數(shù)決定調(diào)用哪個(gè)group的服務(wù);
此外這里還有一個(gè)作用,如下圖所示,為了讓本地消費(fèi)者只調(diào)用本地生產(chǎn)者提供的服務(wù),也可以通過(guò)version或者group隔離(dubbo的直連也可以實(shí)現(xiàn)):
dubbo
那么,在springcloud微服務(wù)架構(gòu)下開(kāi)發(fā),同樣會(huì)遇到這個(gè)問(wèn)題,又該怎么解決呢?如下圖所示,假設(shè)生產(chǎn)者2暴露的xxx-user服務(wù)是我們本地開(kāi)發(fā)環(huán)境的服務(wù),如何讓消費(fèi)者只調(diào)用生產(chǎn)者2提供的服務(wù),而不是在生產(chǎn)者1和生產(chǎn)者2之中選擇:
springcloud
源碼之中毫無(wú)秘密,我們先看服務(wù)發(fā)現(xiàn)的源碼,以consul作為注冊(cè)中心為例,源碼在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());}由這段源碼可知,從注冊(cè)中心獲取服務(wù)時(shí),除了最核心的服務(wù)ID(serviceId),還有其他一些參數(shù),例如tag。參數(shù)tag就是本文要介紹的實(shí)現(xiàn)服務(wù)注冊(cè)&發(fā)現(xiàn)隔離性,tag獲取源碼如下:
public?String?getQueryTagForService(String?serviceId){????String?tag?=?serverListQueryTags.get(serviceId);????return?tag?!=?null???tag?:?defaultQueryTag;}并且它優(yōu)先取ConsulDiscoveryProperties中的serverListQueryTags,如果這個(gè)集合為空,再嘗試取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,到這里我們就知道服務(wù)的消費(fèi)者可以通過(guò)如下兩個(gè)配置去發(fā)現(xiàn)特定tag的服務(wù):
- spring.cloud.consul.discovery.serverListQueryTags.xxx-user=afei,這個(gè)參數(shù)是指定某個(gè)特定服務(wù)(例如xxx-user)的某個(gè)tag(例如afei)服務(wù)提供者。
- spring.cloud.consul.discovery.defaultQueryTag=afei ,這個(gè)參數(shù)是指定所有服務(wù)的某個(gè)tag(例如afei)服務(wù)提供者。
服務(wù)生產(chǎn)者只需要指定如下參數(shù)即可,且通過(guò)ConsulDiscoveryProperties中的tags定義可知,還可以指定多個(gè)tag,中間以逗號(hào)隔開(kāi)即可(springboot的實(shí)現(xiàn)機(jī)制):
- 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<>();????......}
最后,圖解如下,雖然生產(chǎn)者1和生產(chǎn)者2的服務(wù)ID都是xxx-user,但是生產(chǎn)者2指定了tag為"afei",那么同樣指定了tag為afei消費(fèi)者只會(huì)發(fā)現(xiàn)生產(chǎn)者2暴露的服務(wù),而不會(huì)找到生產(chǎn)者1暴露的服務(wù):
springcloud tag原理圖
事實(shí)上springcloud的ConsulDiscoveryProperties.java中還定義了另外兩個(gè)屬性instanceZone和instanceGroup,對(duì)應(yīng)的springboot配置如下,也可以解決這個(gè)問(wèn)題
總結(jié)
以上是生活随笔為你收集整理的gradle 指定springcloud 版本_springcloud小技能:服务注册发现如何隔离的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: canvas rotate 累加旋转_高
- 下一篇: 电脑雕刻教程_湖南益阳3DMAX建模培训