Nacos源码系列—订阅机制的前因后果(上)

编程入门 行业动态 更新时间:2024-10-10 04:26:37

Nacos源码系列—订阅机制的<a href=https://www.elefans.com/category/jswz/34/1746382.html style=前因后果(上)"/>

Nacos源码系列—订阅机制的前因后果(上)

前因

我们在了解Nacos订阅机制之前,首先来了解一下前因——Nacos客户端的“服务发现”,我们先通过下面一张图来直观的看一下,有人可能就说这也叫直观,明明很曲折,小农想说的是,这样才能让你们印象更加深刻(手动狗头)。

读者内心:我信你个鬼。

对于Naocs客户端“服务发现” 主要是有NamingService获取服务列表、组装参数,调用服务接口等等,上图中只是一个大致的流程,在其中还有获取服务列表中的通信流程协议(Grpc/http),订阅流程以及后果(故障转移流程),下面我们就来详细讲解一下,客户端服务发现的基本流程。

首先我们先从一个入口类Client项目下的NamingTest开始看起

 

@Ignore
public class NamingTest {@Testpublic void testServiceList() throws Exception {Properties properties = new Properties();//服务IPproperties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");//用户名properties.put(PropertyKeyConst.USERNAME, "nacos");//密码properties.put(PropertyKeyConst.PASSWORD, "nacos");Instance instance = new Instance();//实例IPinstance.setIp("1.1.1.1");//实例端口instance.setPort(800);//配置权重instance.setWeight(2);Map<String, String> map = new HashMap<String, String>();map.put("netType", "external");map.put("version", "2.0");instance.setMetadata(map);//关键代码 创建自己的实例NamingService namingService = NacosFactory.createNamingService(properties);namingService.registerInstance("nacos.test.1", instance);ThreadUtils.sleep(5000L);List<Instance> list = namingService.getAllInstances("nacos.test.1");System.out.println(list);ThreadUtils.sleep(30000L);        }
}

在前几篇章节中,我们讲解了registerInstance()方法,今天我们需要来看一下getAllInstances()方法的具体逻辑,这个就是我们需要观察的入口

@Override
public List<Instance>  getAllInstances(String serviceName, String groupName, List<String> clusters,boolean subscribe) throws NacosException {ServiceInfo serviceInfo;String clusterString = StringUtils.join(clusters, ",");if (subscribe) {serviceInfo = serviceInfoHolder.getServiceInfo(serviceName, groupName, clusterString);if (null == serviceInfo || !clientProxy.isSubscribed(serviceName, groupName, clusterString)) {serviceInfo = clientProxy.subscribe(serviceName, groupName, clusterString);}} else {serviceInfo = clientProxy.queryInstancesOfService(serviceName, groupName, clusterString, 0, false);}List<Instance> list;if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) {return new ArrayList<Instance>();}return list;
}

在上面具体方法中,会经过几轮重载方法的调用,在重载方法调用的过程中已经设置了默认值,例如(默认分组(DEFAULT_GROUP),集群列表(空)、是否订阅(是)等等)

/**** @param serviceName 服务名称* @param groupName   分组名称(DEFAULT_GROUP)* @param clusters    集群数量(默认为空)* @param subscribe   是否订阅服务(是)* @return* @throws NacosException*/
@Override
public List<Instance>  getAllInstances(String serviceName, String groupName, List<String> clusters,boolean subscribe) throws NacosException {ServiceInfo serviceInfo;String clusterString = StringUtils.join(clusters, ",");//是否为订阅模式if (subscribe) {//从客户端缓存中获取服务信息serviceInfo = serviceInfoHolder.getServiceInfo(serviceName, groupName, clusterString);if (null == serviceInfo || !clientProxy.isSubscribed(serviceName, groupName, clusterString)) {//如果缓存中服务信息不存在,进行订阅serviceInfo = clientProxy.subscribe(serviceName, groupName, clusterString);}} else {//未订阅,从服务器获取serviceInfo = clientProxy.queryInstancesOfService(serviceName, groupName, clusterString, 0, false);}//获取实例列表List<Instance> list;if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) {return new ArrayList<Instance>();}return list;
}

Nacos源码系列—订阅机制的前因后果(上)

2022-05-19 19:39·

更多推荐

Nacos源码系列—订阅机制的前因后果(上)

本文发布于:2024-02-06 04:22:05,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1746390.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:前因后果   源码   机制   系列   Nacos

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!