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

🚀 优质资源分享 🚀

学习路线指引(点击解锁) 知识定位 人群定位
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

点赞再看,养成习惯,微信搜索【牧小农】关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友。
项目源码地址:公众号回复 nacos,即可免费获取源码

前因

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

读者内心:我信你个鬼。

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

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

@Ignore
public class NamingTest {
    
    @Test
    public void testServiceList() throws Exception {
        
        Properties properties = new Properties();
        //服务IP
        properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
        //用户名
        properties.put(PropertyKeyConst.USERNAME, "nacos");
        //密码
        properties.put(PropertyKeyConst.PASSWORD, "nacos");
        
        Instance instance = new Instance();
        //实例IP
        instance.setIp("1.1.1.1");
        //实例端口
        instance.setPort(800);
        //配置权重
        instance.setWeight(2);
        Map map = new HashMap();
 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 list = namingService.getAllInstances("nacos.test.1");
 System.out.println(list);
 ThreadUtils.sleep(30000L); 
 }
}

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

@Override
public List getAllInstances(String serviceName, String groupName, List 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 list;
 if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) {
 return new ArrayList();
 }
 return list;
}

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

/**
 *
 * @param serviceName 服务名称
 * @param groupName 分组名称(DEFAULT\_GROUP)
 * @param clusters 集群数量(默认为空)
 * @param 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

[虚幻私塾】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值