国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

重寫Nacos服務(wù)發(fā)現(xiàn):多個(gè)服務(wù)器如何跨命名空間,訪問公共服務(wù)?

這篇具有很好參考價(jià)值的文章主要介紹了重寫Nacos服務(wù)發(fā)現(xiàn):多個(gè)服務(wù)器如何跨命名空間,訪問公共服務(wù)?。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、問題背景

在開發(fā)某個(gè)公共應(yīng)用時(shí),筆者發(fā)現(xiàn)該公共應(yīng)用的數(shù)據(jù)是所有測試環(huán)境(假設(shè)存在 dev/dev2/dev3)通用的。

這就意味著只需部署一個(gè)應(yīng)用,就能滿足所有測試環(huán)境的需求;也意味著所有測試環(huán)境都需要調(diào)用該公共應(yīng)用,而不同測試環(huán)境的應(yīng)用注冊在不同的 Nacos 命名空間。

二、兩種解決方案

如果所有測試環(huán)境都需要調(diào)用該公共應(yīng)用,有兩種可行的方案。第一種,將該公共服務(wù)同時(shí)注冊到不同的測試環(huán)境所對應(yīng)的命名空間中。

重寫Nacos服務(wù)發(fā)現(xiàn):多個(gè)服務(wù)器如何跨命名空間,訪問公共服務(wù)?

第二種,將公共應(yīng)用注冊到單獨(dú)的命名空間,不同的測試環(huán)境能夠跨命名空間訪問該應(yīng)用。

重寫Nacos服務(wù)發(fā)現(xiàn):多個(gè)服務(wù)器如何跨命名空間,訪問公共服務(wù)?

三、詳細(xì)的問題解決過程

先行交代筆者的版本號(hào)配置。Nacos 客戶端版本號(hào)為 NACOS 1.4.1;Java 項(xiàng)目的 Nacos 版本號(hào)如下。

重寫Nacos服務(wù)發(fā)現(xiàn):多個(gè)服務(wù)器如何跨命名空間,訪問公共服務(wù)?

最初想法是將該公共應(yīng)用同時(shí)注冊到多個(gè)命名空間下。

01 注冊多個(gè)命名空間

從該博客中,我們看到其他程序員朋友也遇到了類似的公共服務(wù)的需求。在本篇文章中,筆者將進(jìn)一步分享實(shí)現(xiàn)思路以及示例代碼。

重寫Nacos服務(wù)發(fā)現(xiàn):多個(gè)服務(wù)器如何跨命名空間,訪問公共服務(wù)?

說明:以下代碼內(nèi)容來自用戶 chuntaojun 的分享。

shareNamespace={namespaceId[:group]},{namespaceId[:group]} 
復(fù)制代碼
@RunWith(SpringRunner.class)
@SpringBootTest(classes?=?NamingApp.class,?properties?=?{"server.servlet.context-path=/nacos"},
????webEnvironment?=?SpringBootTest.WebEnvironment.RANDOM_PORT)
public?class?SelectServiceInShareNamespace_ITCase?{

????private?NamingService?naming1;
????private?NamingService?naming2;
????@LocalServerPort
????private?int?port;
????@Before
????public?void?init()?throws?Exception{
????????NamingBase.prepareServer(port);
????????if?(naming1?==?null)?{
????????????Properties?properties?=?new?Properties();
????????????properties.setProperty(PropertyKeyConst.SERVER_ADDR,?"127.0.0.1"+":"+port);
????????????properties.setProperty(PropertyKeyConst.SHARE_NAMESPACE,?"57425802-3058-4507-9a73-3229b9f00a36");
????????????naming1?=?NamingFactory.createNamingService(properties);

????????????Properties?properties2?=?new?Properties();
????????????properties2.setProperty(PropertyKeyConst.SERVER_ADDR,?"127.0.0.1"+":"+port);
????????????properties2.setProperty(PropertyKeyConst.NAMESPACE,?"57425802-3058-4507-9a73-3229b9f00a36");
????????????naming2?=?NamingFactory.createNamingService(properties2);
????????}
????????while?(true)?{
????????????if?(!"UP".equals(naming1.getServerStatus()))?{
????????????????Thread.sleep(1000L);
????????????????continue;
????????????}
????????????break;
????????}
????}

????@Test
????public?void?testSelectInstanceInShareNamespaceNoGroup()?throws?NacosException,?InterruptedException?{
????????String?service1?=?randomDomainName();
????????String?service2?=?randomDomainName();
????????naming1.registerInstance(service1,?"127.0.0.1",?90);
????????naming2.registerInstance(service2,?"127.0.0.2",?90);

????????Thread.sleep(1000);

????????List<Instance>?instances?=?naming1.getAllInstances(service2);
????????Assert.assertEquals(1,?instances.size());
????????Assert.assertEquals(service2,?NamingUtils.getServiceName(instances.get(0).getServiceName()));
????}

????@Test
????public?void?testSelectInstanceInShareNamespaceWithGroup()?throws?NacosException,?InterruptedException?{
????????String?service1?=?randomDomainName();
????????String?service2?=?randomDomainName();
????????naming2.registerInstance(service1,?groupName,?"127.0.0.1",?90);
????????naming3.registerInstance(service2,?"127.0.0.2",?90);

????????Thread.sleep(1000);

????????List<Instance>?instances?=?naming3.getAllInstances(service1);
????????Assert.assertEquals(1,?instances.size());
????????Assert.assertEquals(service1,?NamingUtils.getServiceName(instances.get(0).getServiceName()));
????????Assert.assertEquals(groupName,?NamingUtils.getServiceName(NamingUtils.getGroupName(instances.get(0).getServiceName())));
????}

}
復(fù)制代碼

進(jìn)一步考慮后發(fā)現(xiàn)該解決方案可能不太契合當(dāng)前遇到的問題。公司目前的開發(fā)測試環(huán)境有很多個(gè),并且不確定以后會(huì)不會(huì)繼續(xù)增加。

如果每增加一個(gè)環(huán)境,都需要修改一次公共服務(wù)的配置,并且重啟一次公共服務(wù),著實(shí)太麻煩了。倒不如反其道而行,讓其他的服務(wù)器實(shí)現(xiàn)跨命名空間訪問公共服務(wù)。

02 跨命名空間訪問

針對實(shí)際問題查找資料時(shí),我們找到了類似的參考分享《重寫 Nacos 服務(wù)發(fā)現(xiàn)邏輯動(dòng)態(tài)修改遠(yuǎn)程服務(wù)IP地址》。

跟著博客思路看代碼,筆者了解到服務(wù)發(fā)現(xiàn)的主要相關(guān)類是 NacosNamingService, NacosDiscoveryProperties, NacosDiscoveryAutoConfiguration。

然后,筆者將博客的示例代碼復(fù)制過來,試著進(jìn)行如下調(diào)試:

@Slf4j
@Configuration
@ConditionalOnNacosDiscoveryEnabled
@ConditionalOnProperty(
????????name?=?{"spring.profiles.active"},
????????havingValue?=?"dev"
)
@AutoConfigureBefore({NacosDiscoveryClientAutoConfiguration.class})
public?class?DevEnvironmentNacosDiscoveryClient?{

????@Bean
????@ConditionalOnMissingBean
????public?NacosDiscoveryProperties?nacosProperties()?{
????????return?new?DevEnvironmentNacosDiscoveryProperties();
????}

????static?class?DevEnvironmentNacosDiscoveryProperties?extends?NacosDiscoveryProperties?{

????????private?NamingService?namingService;

????????@Override
????????public?NamingService?namingServiceInstance()?{
????????????if?(null?!=?this.namingService)?{
????????????????return?this.namingService;
????????????}?else?{
????????????????Properties?properties?=?new?Properties();
????????????????properties.put("serverAddr",?super.getServerAddr());
????????????????properties.put("namespace",?super.getNamespace());
????????????????properties.put("com.alibaba.nacos.naming.log.filename",?super.getLogName());
????????????????if?(super.getEndpoint().contains(":"))?{
????????????????????int?index?=?super.getEndpoint().indexOf(":");
????????????????????properties.put("endpoint",?super.getEndpoint().substring(0,?index));
????????????????????properties.put("endpointPort",?super.getEndpoint().substring(index?+?1));
????????????????}?else?{
????????????????????properties.put("endpoint",?super.getEndpoint());
????????????????}

????????????????properties.put("accessKey",?super.getAccessKey());
????????????????properties.put("secretKey",?super.getSecretKey());
????????????????properties.put("clusterName",?super.getClusterName());
????????????????properties.put("namingLoadCacheAtStart",?super.getNamingLoadCacheAtStart());

????????????????try?{
????????????????????this.namingService?=?new?DevEnvironmentNacosNamingService(properties);
????????????????}?catch?(Exception?var3)?{
????????????????????log.error("create?naming?service?error!properties={},e=,",?this,?var3);
????????????????????return?null;
????????????????}

????????????????return?this.namingService;
????????????}
????????}

????}

????static?class?DevEnvironmentNacosNamingService?extends?NacosNamingService?{

????????public?DevEnvironmentNacosNamingService(Properties?properties)?{
????????????super(properties);
????????}

????????@Override
????????public?List<Instance>?selectInstances(String?serviceName,?List<String>?clusters,?boolean?healthy)?throws?NacosException?{
????????????List<Instance>?instances?=?super.selectInstances(serviceName,?clusters,?healthy);
????????????instances.stream().forEach(instance?->?instance.setIp("10.101.232.24"));
????????????return?instances;
????????}
????}

}
復(fù)制代碼

調(diào)試后發(fā)現(xiàn)博客提供的代碼并不能滿足筆者的需求,還得進(jìn)一步深入探索。

但幸運(yùn)的是,調(diào)試過程發(fā)現(xiàn) Nacos 服務(wù)發(fā)現(xiàn)的關(guān)鍵類是 com.alibaba.cloud.nacos.discovery.NacosServiceDiscovery,其中的關(guān)鍵方法是 getInstances()getServices(),即「返回指定服務(wù) ID 的所有服務(wù)實(shí)例」和「獲取所有服務(wù)的名稱」。

也就是說,對 getInstances() 方法進(jìn)行重寫肯定能實(shí)現(xiàn)本次目標(biāo)——跨命名空間訪問公共服務(wù)。

/**
?*?Return?all?instances?for?the?given?service.
?*?@param?serviceId?id?of?service
?*?@return?list?of?instances
?*?@throws?NacosException?nacosException
?*/
public?List<ServiceInstance>?getInstances(String?serviceId)?throws?NacosException?{
????????String?group?=?discoveryProperties.getGroup();
????????List<Instance>?instances?=?discoveryProperties.namingServiceInstance()
????????????????????????.selectInstances(serviceId,?group,?true);
????????return?hostToServiceInstanceList(instances,?serviceId);
}

/**
?*?Return?the?names?of?all?services.
?*?@return?list?of?service?names
?*?@throws?NacosException?nacosException
?*/
public?List<String>?getServices()?throws?NacosException?{
????????String?group?=?discoveryProperties.getGroup();
????????ListView<String>?services?=?discoveryProperties.namingServiceInstance()
????????????????????????.getServicesOfServer(1,?Integer.MAX_VALUE,?group);
????????return?services.getData();
}
復(fù)制代碼

03 最終解決思路及代碼示例

具體的解決方案思路大致如下:

  1. 生成一個(gè)共享配置類NacosShareProperties,用來配置共享公共服務(wù)的 namespacegroup

  2. 重寫配置類 NacosDiscoveryProperties (新:NacosDiscoveryPropertiesV2),將新增的共享配置類作為屬性放進(jìn)該配置類,后續(xù)會(huì)用到;

  3. 重寫服務(wù)發(fā)現(xiàn)類 NacosServiceDiscovery (新:NacosServiceDiscoveryV2),這是最關(guān)鍵的邏輯;

  4. 重寫自動(dòng)配置類 NacosDiscoveryAutoConfiguration,將自定義相關(guān)類比 Nacos 原生類更早的注入容器。

最終代碼中用到了一些工具類,可以自行補(bǔ)充完整。

/**
?*?<pre>
?*??@description:?共享nacos屬性
?*??@author:?rookie0peng
?*??@date:?2022/8/29?15:22
?*??</pre>
?*/
@Configuration
@ConfigurationProperties(prefix?=?"nacos.share")
public?class?NacosShareProperties?{

????private?final?Map<String,?Set<String>>?NAMESPACE_TO_GROUP_NAME_MAP?=?new?ConcurrentHashMap<>();

????/**
?????*?共享nacos實(shí)體列表
?????*/
????private?List<NacosShareEntity>?entities;

????public?List<NacosShareEntity>?getEntities()?{
????????return?entities;
????}

????public?void?setEntities(List<NacosShareEntity>?entities)?{
????????this.entities?=?entities;
????}

????public?Map<String,?Set<String>>?getNamespaceGroupMap()?{
????????safeStream(entities).filter(entity?->?nonNull(entity)?&&?nonNull(entity.getNamespace()))
????????????????.forEach(entity?->?{
????????????????????Set<String>?groupNames?=?NAMESPACE_TO_GROUP_NAME_MAP.computeIfAbsent(entity.getNamespace(),?k?->?new?HashSet<>());
????????????????????if?(nonNull(entity.getGroupNames()))
????????????????????????groupNames.addAll(entity.getGroupNames());
????????????????});
????????return?new?HashMap<>(NAMESPACE_TO_GROUP_NAME_MAP);
????}

????@Override
????public?String?toString()?{
????????return?"NacosShareProperties{"?+
????????????????"entities="?+?entities?+
????????????????'}';
????}

????/**
?????*?共享nacos實(shí)體
?????*/
????public?static?final?class?NacosShareEntity?{

????????/**
?????????*?命名空間
?????????*/
????????private?String?namespace;

????????/**
?????????*?分組
?????????*/
????????private?List<String>?groupNames;

????????public?String?getNamespace()?{
????????????return?namespace;
????????}

????????public?void?setNamespace(String?namespace)?{
????????????this.namespace?=?namespace;
????????}

????????public?List<String>?getGroupNames()?{
????????????return?groupNames;
????????}

????????public?void?setGroupNames(List<String>?groupNames)?{
????????????this.groupNames?=?groupNames;
????????}

????????@Override
????????public?String?toString()?{
????????????return?"NacosShareEntity{"?+
????????????????????"namespace='"?+?namespace?+?'''?+
????????????????????",?groupNames="?+?groupNames?+
????????????????????'}';
????????}
????}
}
復(fù)制代碼
/**
?*?@description:?naocs服務(wù)發(fā)現(xiàn)屬性重寫
?*?@author:?rookie0peng
?*?@date:?2022/8/30?1:19
?*/
public?class?NacosDiscoveryPropertiesV2?extends?NacosDiscoveryProperties?{

????private?static?final?Logger?log?=?LoggerFactory.getLogger(NacosDiscoveryPropertiesV2.class);

????private?final?NacosShareProperties?nacosShareProperties;

????private?static?final?Map<String,?NamingService>?NAMESPACE_TO_NAMING_SERVICE_MAP?=?new?ConcurrentHashMap<>();

????public?NacosDiscoveryPropertiesV2(NacosShareProperties?nacosShareProperties)?{
????????super();
????????this.nacosShareProperties?=?nacosShareProperties;
????}

????public?Map<String,?NamingService>?shareNamingServiceInstances()?{
????????if?(!NAMESPACE_TO_NAMING_SERVICE_MAP.isEmpty())?{
????????????return?new?HashMap<>(NAMESPACE_TO_NAMING_SERVICE_MAP);
????????}
????????List<NacosShareProperties.NacosShareEntity>?entities?=?Optional.ofNullable(nacosShareProperties)
????????????????.map(NacosShareProperties::getEntities).orElse(Collections.emptyList());
????????entities.stream().filter(entity?->?nonNull(entity)?&&?nonNull(entity.getNamespace()))
????????????????.filter(PredicateUtil.distinctByKey(NacosShareProperties.NacosShareEntity::getNamespace))
????????????????.forEach(entity?->?{
????????????????????try?{
????????????????????????NamingService?namingService?=?NacosFactory.createNamingService(getNacosProperties(entity.getNamespace()));
????????????????????????if?(namingService?!=?null)?{
????????????????????????????NAMESPACE_TO_NAMING_SERVICE_MAP.put(entity.getNamespace(),?namingService);
????????????????????????}
????????????????????}?catch?(Exception?e)?{
????????????????????????log.error("create?naming?service?error!?properties={},?e=",?this,?e);
????????????????????}
????????????????});
????????return?new?HashMap<>(NAMESPACE_TO_NAMING_SERVICE_MAP);
????}

????private?Properties?getNacosProperties(String?namespace)?{
????????Properties?properties?=?new?Properties();
????????properties.put(SERVER_ADDR,?getServerAddr());
????????properties.put(USERNAME,?Objects.toString(getUsername(),?""));
????????properties.put(PASSWORD,?Objects.toString(getPassword(),?""));
????????properties.put(NAMESPACE,?namespace);
????????properties.put(UtilAndComs.NACOS_NAMING_LOG_NAME,?getLogName());
????????String?endpoint?=?getEndpoint();
????????if?(endpoint.contains(":"))?{
????????????int?index?=?endpoint.indexOf(":");
????????????properties.put(ENDPOINT,?endpoint.substring(0,?index));
????????????properties.put(ENDPOINT_PORT,?endpoint.substring(index?+?1));
????????}
????????else?{
????????????properties.put(ENDPOINT,?endpoint);
????????}

????????properties.put(ACCESS_KEY,?getAccessKey());
????????properties.put(SECRET_KEY,?getSecretKey());
????????properties.put(CLUSTER_NAME,?getClusterName());
????????properties.put(NAMING_LOAD_CACHE_AT_START,?getNamingLoadCacheAtStart());

//????????enrichNacosDiscoveryProperties(properties);
????????return?properties;
????}
}
復(fù)制代碼
/**
?*?@description:?naocs服務(wù)發(fā)現(xiàn)重寫
?*?@author:?rookie0peng
?*?@date:?2022/8/30?1:10
?*/
public?class?NacosServiceDiscoveryV2?extends?NacosServiceDiscovery?{

????private?final?NacosDiscoveryPropertiesV2?discoveryProperties;

????private?final?NacosShareProperties?nacosShareProperties;

????private?final?NacosServiceManager?nacosServiceManager;

????public?NacosServiceDiscoveryV2(NacosDiscoveryPropertiesV2?discoveryProperties,?NacosShareProperties?nacosShareProperties,?NacosServiceManager?nacosServiceManager)?{
????????super(discoveryProperties,?nacosServiceManager);
????????this.discoveryProperties?=?discoveryProperties;
????????this.nacosShareProperties?=?nacosShareProperties;
????????this.nacosServiceManager?=?nacosServiceManager;
????}

????/**
?????*?Return?all?instances?for?the?given?service.
?????*?@param?serviceId?id?of?service
?????*?@return?list?of?instances
?????*?@throws?NacosException?nacosException
?????*/
????public?List<ServiceInstance>?getInstances(String?serviceId)?throws?NacosException?{
????????String?group?=?discoveryProperties.getGroup();
????????List<Instance>?instances?=?discoveryProperties.namingServiceInstance()
????????????????.selectInstances(serviceId,?group,?true);
????????if?(isEmpty(instances))?{
????????????Map<String,?Set<String>>?namespaceGroupMap?=?nacosShareProperties.getNamespaceGroupMap();
????????????Map<String,?NamingService>?namespace2NamingServiceMap?=?discoveryProperties.shareNamingServiceInstances();
????????????for?(Map.Entry<String,?NamingService>?entry?:?namespace2NamingServiceMap.entrySet())?{
????????????????String?namespace;
????????????????NamingService?namingService;
????????????????if?(isNull(namespace?=?entry.getKey())?||?isNull(namingService?=?entry.getValue()))
????????????????????continue;
????????????????Set<String>?groupNames?=?namespaceGroupMap.get(namespace);
????????????????List<Instance>?shareInstances;
????????????????if?(isEmpty(groupNames))?{
????????????????????shareInstances?=?namingService.selectInstances(serviceId,?group,?true);
????????????????????if?(nonEmpty(shareInstances))
????????????????????????break;
????????????????}?else?{
????????????????????shareInstances?=?new?ArrayList<>();
????????????????????for?(String?groupName?:?groupNames)?{
????????????????????????List<Instance>?subShareInstances?=?namingService.selectInstances(serviceId,?groupName,?true);
????????????????????????if?(nonEmpty(subShareInstances))?{
????????????????????????????shareInstances.addAll(subShareInstances);
????????????????????????}
????????????????????}
????????????????}
????????????????if?(nonEmpty(shareInstances))?{
????????????????????instances?=?shareInstances;
????????????????????break;
????????????????}
????????????}
????????}
????????return?hostToServiceInstanceList(instances,?serviceId);
????}

????/**
?????*?Return?the?names?of?all?services.
?????*?@return?list?of?service?names
?????*?@throws?NacosException?nacosException
?????*/
????public?List<String>?getServices()?throws?NacosException?{
????????String?group?=?discoveryProperties.getGroup();
????????ListView<String>?services?=?discoveryProperties.namingServiceInstance()
????????????????.getServicesOfServer(1,?Integer.MAX_VALUE,?group);
????????return?services.getData();
????}

????public?static?List<ServiceInstance>?hostToServiceInstanceList(
????????????List<Instance>?instances,?String?serviceId)?{
????????List<ServiceInstance>?result?=?new?ArrayList<>(instances.size());
????????for?(Instance?instance?:?instances)?{
????????????ServiceInstance?serviceInstance?=?hostToServiceInstance(instance,?serviceId);
????????????if?(serviceInstance?!=?null)?{
????????????????result.add(serviceInstance);
????????????}
????????}
????????return?result;
????}

????public?static?ServiceInstance?hostToServiceInstance(Instance?instance,
????????????????????????????????????????????????????????String?serviceId)?{
????????if?(instance?==?null?||?!instance.isEnabled()?||?!instance.isHealthy())?{
????????????return?null;
????????}
????????NacosServiceInstance?nacosServiceInstance?=?new?NacosServiceInstance();
????????nacosServiceInstance.setHost(instance.getIp());
????????nacosServiceInstance.setPort(instance.getPort());
????????nacosServiceInstance.setServiceId(serviceId);

????????Map<String,?String>?metadata?=?new?HashMap<>();
????????metadata.put("nacos.instanceId",?instance.getInstanceId());
????????metadata.put("nacos.weight",?instance.getWeight()?+?"");
????????metadata.put("nacos.healthy",?instance.isHealthy()?+?"");
????????metadata.put("nacos.cluster",?instance.getClusterName()?+?"");
????????metadata.putAll(instance.getMetadata());
????????nacosServiceInstance.setMetadata(metadata);

????????if?(metadata.containsKey("secure"))?{
????????????boolean?secure?=?Boolean.parseBoolean(metadata.get("secure"));
????????????nacosServiceInstance.setSecure(secure);
????????}
????????return?nacosServiceInstance;
????}

????private?NamingService?namingService()?{
????????return?nacosServiceManager
????????????????.getNamingService(discoveryProperties.getNacosProperties());
????}
}
復(fù)制代碼
/**
?*?@description:?重寫nacos服務(wù)發(fā)現(xiàn)的自動(dòng)配置
?*?@author:?rookie0peng
?*?@date:?2022/8/30?1:08
?*/
@Configuration(proxyBeanMethods?=?false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnNacosDiscoveryEnabled
@AutoConfigureBefore({NacosDiscoveryAutoConfiguration.class})
public?class?NacosDiscoveryAutoConfigurationV2?{

????@Bean
????@ConditionalOnMissingBean
????public?NacosDiscoveryPropertiesV2?nacosProperties(NacosShareProperties?nacosShareProperties)?{
????????return?new?NacosDiscoveryPropertiesV2(nacosShareProperties);
????}

????@Bean
????@ConditionalOnMissingBean
????public?NacosServiceDiscovery?nacosServiceDiscovery(
????????????NacosDiscoveryPropertiesV2?discoveryPropertiesV2,?NacosShareProperties?nacosShareProperties,?NacosServiceManager?nacosServiceManager
????)?{
????????return?new?NacosServiceDiscoveryV2(discoveryPropertiesV2,?nacosShareProperties,?nacosServiceManager);
????}
}
復(fù)制代碼

本以為問題到這就結(jié)束了,但最后自測時(shí)發(fā)現(xiàn)程序根本不走 Nacos 的服務(wù)發(fā)現(xiàn)邏輯,而是執(zhí)行 Ribbon 的負(fù)載均衡邏輯com.netflix.loadbalancer.AbstractLoadBalancerRule。

不過實(shí)現(xiàn)類是 com.alibaba.cloud.nacos.ribbon.NacosRule,繼續(xù)基于 NacosRule 重寫負(fù)載均衡。

/**
?*?@description:?共享nacos命名空間規(guī)則
?*?@author:?rookie0peng
?*?@date:?2022/8/31?2:04
?*/
public?class?ShareNacosNamespaceRule?extends?AbstractLoadBalancerRule?{

????private?static?final?Logger?LOGGER?=?LoggerFactory.getLogger(ShareNacosNamespaceRule.class);

????@Autowired
????private?NacosDiscoveryPropertiesV2?nacosDiscoveryPropertiesV2;
????@Autowired
????private?NacosShareProperties?nacosShareProperties;

????/**
?????*?重寫choose方法
?????*
?????*?@param?key
?????*?@return
?????*/
????@SneakyThrows
????@Override
????public?Server?choose(Object?key)?{
????????try?{
????????????String?clusterName?=?this.nacosDiscoveryPropertiesV2.getClusterName();
????????????DynamicServerListLoadBalancer?loadBalancer?=?(DynamicServerListLoadBalancer)?getLoadBalancer();
????????????String?name?=?loadBalancer.getName();

????????????NamingService?namingService?=?nacosDiscoveryPropertiesV2
????????????????????.namingServiceInstance();
????????????List<Instance>?instances?=?namingService.selectInstances(name,?true);
????????????if?(CollectionUtils.isEmpty(instances))?{
????????????????LOGGER.warn("no?instance?in?service?{},?then?to?get?share?service's?instance",?name);
????????????????List<Instance>?shareNamingService?=?this.getShareNamingService(name);
????????????????if?(nonEmpty(shareNamingService))
????????????????????instances?=?shareNamingService;
????????????????else
????????????????????return?null;
????????????}
????????????List<Instance>?instancesToChoose?=?instances;
????????????if?(org.apache.commons.lang3.StringUtils.isNotBlank(clusterName))?{
????????????????List<Instance>?sameClusterInstances?=?instances.stream()
????????????????????????.filter(instance?->?Objects.equals(clusterName,
????????????????????????????????instance.getClusterName()))
????????????????????????.collect(Collectors.toList());
????????????????if?(!CollectionUtils.isEmpty(sameClusterInstances))?{
????????????????????instancesToChoose?=?sameClusterInstances;
????????????????}
????????????????else?{
????????????????????LOGGER.warn(
????????????????????????????"A?cross-cluster?call?occurs,name?=?{},?clusterName?=?{},?instance?=?{}",
????????????????????????????name,?clusterName,?instances);
????????????????}
????????????}

????????????Instance?instance?=?ExtendBalancer.getHostByRandomWeight2(instancesToChoose);

????????????return?new?NacosServer(instance);
????????}
????????catch?(Exception?e)?{
????????????LOGGER.warn("NacosRule?error",?e);
????????????return?null;
????????}
????}


????@Override
????public?void?initWithNiwsConfig(IClientConfig?iClientConfig)?{

????}

????private?List<Instance>?getShareNamingService(String?serviceId)?throws?NacosException?{
????????List<Instance>?instances?=?Collections.emptyList();
????????Map<String,?Set<String>>?namespaceGroupMap?=?nacosShareProperties.getNamespaceGroupMap();
????????Map<String,?NamingService>?namespace2NamingServiceMap?=?nacosDiscoveryPropertiesV2.shareNamingServiceInstances();
????????for?(Map.Entry<String,?NamingService>?entry?:?namespace2NamingServiceMap.entrySet())?{
????????????String?namespace;
????????????NamingService?namingService;
????????????if?(isNull(namespace?=?entry.getKey())?||?isNull(namingService?=?entry.getValue()))
????????????????continue;
????????????Set<String>?groupNames?=?namespaceGroupMap.get(namespace);
????????????List<Instance>?shareInstances;
????????????if?(isEmpty(groupNames))?{
????????????????shareInstances?=?namingService.selectInstances(serviceId,?true);
????????????????if?(nonEmpty(shareInstances))
????????????????????break;
????????????}?else?{
????????????????shareInstances?=?new?ArrayList<>();
????????????????for?(String?groupName?:?groupNames)?{
????????????????????List<Instance>?subShareInstances?=?namingService.selectInstances(serviceId,?groupName,?true);
????????????????????if?(nonEmpty(subShareInstances))?{
????????????????????????shareInstances.addAll(subShareInstances);
????????????????????}
????????????????}
????????????}
????????????if?(nonEmpty(shareInstances))?{
????????????????instances?=?shareInstances;
????????????????break;
????????????}
????????}
????????return?instances;
????}
}
復(fù)制代碼

至此問題得以解決。

Nacos 上配置好共享 namespacegroup 后,就能夠進(jìn)行跨命名空間訪問了。

# nacos共享命名空間配置 示例
nacos.share.entities[0].namespace=e6ed2017-3ed6-4d9b-824a-db626424fc7b
nacos.share.entities[0].groupNames[0]=DEFAULT_GROUP
# 指定服務(wù)使用共享的負(fù)載均衡規(guī)則,service-id是注冊到nacos上的服務(wù)id,ShareNacosNamespaceRule需要寫全限定名
service-id.ribbon.NFLoadBalancerRuleClassName=***.***.***.ShareNacosNamespaceRule
復(fù)制代碼

注意:如果 Java 項(xiàng)目的 nacos discovery 版本用的是 2021.1,則不需要重寫 Ribbon 的負(fù)載均衡類,因?yàn)樵摪姹镜?Nacos 不依賴 Ribbon。

2.2.1.RELEASE 版本nacos discovery 依賴 Ribbon.

重寫Nacos服務(wù)發(fā)現(xiàn):多個(gè)服務(wù)器如何跨命名空間,訪問公共服務(wù)?

2021.1 版本nacos discovery 不依賴 Ribbon。

重寫Nacos服務(wù)發(fā)現(xiàn):多個(gè)服務(wù)器如何跨命名空間,訪問公共服務(wù)?

四、總結(jié)

為了達(dá)到共享命名空間的預(yù)期,構(gòu)思、查找資料、實(shí)現(xiàn)邏輯、調(diào)試,前后一共花費(fèi) 4 天左右。

但該功能仍然存在共享服務(wù)緩存等可優(yōu)化空間,留待后續(xù)實(shí)現(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-453463.html

到了這里,關(guān)于重寫Nacos服務(wù)發(fā)現(xiàn):多個(gè)服務(wù)器如何跨命名空間,訪問公共服務(wù)?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 如何在多個(gè)服務(wù)器上安裝WordPress分布式部署

    如何在多個(gè)服務(wù)器上安裝WordPress分布式部署

    許多網(wǎng)絡(luò)主機(jī)現(xiàn)在保證其服務(wù)的正常運(yùn)行時(shí)間為 99.9%,但這仍然每年最多有 8.7 小時(shí)的停機(jī)時(shí)間。 許多公司不能夠承擔(dān)這種風(fēng)險(xiǎn)。例如。在超級(jí)碗比賽中失敗的體育新聞網(wǎng)站可能會(huì)失去忠實(shí)的追隨者。 我們通過設(shè)置維護(hù)高可用性 WordPress分布式部署配置來幫助 WordPress 網(wǎng)站主防

    2024年02月05日
    瀏覽(23)
  • 如何在windows電腦安裝多個(gè)tomcat服務(wù)器和亂碼問題

    如何在windows電腦安裝多個(gè)tomcat服務(wù)器和亂碼問題

    tomcat網(wǎng)址 這里下載tomcat10為例子 分別命名為 8081、 8082、 8083 docs、examples、host-manager、manager文件夾 刪除 ROOT文件夾內(nèi)文件并創(chuàng)建index.html并在里面放置內(nèi)容 也可以刪除 上邊的 index.jsp文件 重新創(chuàng)建下邊這個(gè)文件 并在文件夾內(nèi)輸入 8081 start 在tomcat文件夾conf文件下 找到server.xml文

    2024年02月12日
    瀏覽(26)
  • iis配置網(wǎng)站服務(wù)器配置端口,如何實(shí)現(xiàn)IIS多個(gè)網(wǎng)頁同一個(gè)端口?

    在Internet Information Services (IIS) 中配置多個(gè)網(wǎng)站共用同一個(gè)端口是可能的,但需要進(jìn)行一些特定的配置。以下是實(shí)現(xiàn)這一目標(biāo)的一般步驟: 創(chuàng)建多個(gè)網(wǎng)站: 首先,您需要在 IIS 中創(chuàng)建多個(gè)不同的網(wǎng)站。每個(gè)網(wǎng)站應(yīng)該有自己的根目錄和內(nèi)容。 綁定共享端口: 在每個(gè)網(wǎng)站的配置中

    2024年02月13日
    瀏覽(125)
  • linux 15day apache apache服務(wù)安裝 httpd服務(wù)器 安裝虛擬主機(jī)系統(tǒng) 一個(gè)主機(jī) 多個(gè)域名如何綁定

    linux 15day apache apache服務(wù)安裝 httpd服務(wù)器 安裝虛擬主機(jī)系統(tǒng) 一個(gè)主機(jī) 多個(gè)域名如何綁定

    1.apache目錄介紹 1.準(zhǔn)備測試頁面 2.訪問控制測試 可以直接編輯apache主配置文件 修改默認(rèn)網(wǎng)站發(fā)布目錄 配置域名解析: 測試訪問 基于端口 訪問:www.soso666.com 訪問: test.soso666.com:81 可以配置域名解析,也可以不用配域名解析

    2024年02月04日
    瀏覽(28)
  • 一、重寫muduo網(wǎng)絡(luò)庫之服務(wù)器編程及測試

    一、重寫muduo網(wǎng)絡(luò)庫之服務(wù)器編程及測試

    目錄 一、基于muduo網(wǎng)絡(luò)庫開發(fā)服務(wù)器程序的基本步驟 1、組合TcpServer對象 2、創(chuàng)建EventLoop事件循環(huán)對象的指針 3、明確TCPServer構(gòu)造函數(shù)需要的參數(shù),輸出ChatServer的構(gòu)造函數(shù) 4、在當(dāng)前服務(wù)器類的構(gòu)造函數(shù)當(dāng)中,注冊處理連接的回調(diào)函數(shù)和處理讀寫事件的回調(diào)函數(shù) 5、設(shè)置合適的

    2024年02月04日
    瀏覽(15)
  • Go重寫Redis中間件 - GO實(shí)現(xiàn)TCP服務(wù)器

    首先新建一個(gè)項(xiàng)目go-redis,將config和lib包放到項(xiàng)目中,config.go用來解析配置,比如端口、功能、DB數(shù);lib包有兩個(gè)文件夾,分別是logger和sync,其中l(wèi)ogger.go是一個(gè)日志框架,sync包中的bool.go包裝了atomic操作,因?yàn)閍tomic原生沒有bool類型,所以將uint32類型改造成bool型的atomic,wait.g

    2024年02月15日
    瀏覽(23)
  • 重寫Sylar基于協(xié)程的服務(wù)器(7、TcpServer & HttpServer的設(shè)計(jì)與實(shí)現(xiàn))

    重寫Sylar基于協(xié)程的服務(wù)器(7、TcpServer & HttpServer的設(shè)計(jì)與實(shí)現(xiàn))

    重寫Sylar基于協(xié)程的服務(wù)器系列: 重寫Sylar基于協(xié)程的服務(wù)器(0、搭建開發(fā)環(huán)境以及項(xiàng)目框架 || 下載編譯簡化版Sylar) 重寫Sylar基于協(xié)程的服務(wù)器(1、日志模塊的架構(gòu)) 重寫Sylar基于協(xié)程的服務(wù)器(2、配置模塊的設(shè)計(jì)) 重寫Sylar基于協(xié)程的服務(wù)器(3、協(xié)程模塊的設(shè)計(jì)) 重寫

    2024年02月21日
    瀏覽(25)
  • unity學(xué)習(xí)(16)——服務(wù)器組裝(3)命名空間問題

    unity學(xué)習(xí)(16)——服務(wù)器組裝(3)命名空間問題

    using GameServer.logic; using GameServer.NetModel; 代碼中這兩句存在命名空間的引用問題,c#和c++不一樣,用的的using和命名空間,之前的慣性思維都是include和文件路徑。 錯(cuò)誤:直接把逆向文件夾粘到項(xiàng)目文件夾中,這樣做vs的資源管理器根本沒反應(yīng): 正確:在資源管理器中點(diǎn)擊GameSe

    2024年02月21日
    瀏覽(23)
  • Nacos(一):簡介 如何安裝 服務(wù)注冊與發(fā)現(xiàn) 集群 權(quán)重 與Eureka區(qū)別

    Nacos(一):簡介 如何安裝 服務(wù)注冊與發(fā)現(xiàn) 集群 權(quán)重 與Eureka區(qū)別

    當(dāng)服務(wù)調(diào)用越來越多,服務(wù)的地址需要管理起來,并實(shí)現(xiàn)動(dòng)態(tài)調(diào)用而不是硬編碼在接口中。此時(shí)需要一個(gè)注冊中心來幫助我們管理服務(wù)。 ? ?流程如下: 商品微服務(wù)注冊IP和端口到注冊中心 訂單微服務(wù)先從注冊中心獲取到商品微服務(wù)的IP和端口 訂單微服務(wù)中使用獲取到的IP和

    2024年02月13日
    瀏覽(18)
  • 好意外,發(fā)現(xiàn)永久免費(fèi)使用的云服務(wù)器

    好意外,發(fā)現(xiàn)永久免費(fèi)使用的云服務(wù)器

    ? ? 先用Python寫個(gè)Web程序 在命令行運(yùn)行這個(gè)程序 ? ?保證這個(gè)80端口是打開的. ?點(diǎn)擊打開訪問地址,已經(jīng)是可以加載出網(wǎng)頁了 ?當(dāng)我們關(guān)閉IDE時(shí),這個(gè)鏈接,還是可以正常訪問的 ?

    2024年01月22日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包