本文主要是介绍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源码系列—订阅机制的前因后果(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!