这片博文来源于我在公司部门内的分享,我隐去了和公司项目相关的部分,重新整理,从几个方面谈一下Nacos的设计(作为注册中心,基于此时的develop分支)
客户端与集群的交互
首先需要声明的是Nacos Cluster虽然内部使用了Raft协议但是对于Nacos客户端,Cluster实例是无状态的。客户端配置集群地址有两种方式:
1.通过配置serverAddr列表,客户端将访问集群时,随机从列表中选择一个实例访问:
NamingService configService = NacosFactory.createNamingService("10.22.0.137:30253,10.22.0.137:30254,10.22.0.137:30255");
当然,一般情况下我们并不会直接配置Nacos实例的IP,可用用域名,以便能动态发现。
2.通过Properties配置endpoint,定时访问,感知集群变化,并随机从接口返回的列表中选择一个实例访问,客户端会与Endpoint创建LONG PULL。
Properties properties = new Properties();
properties.put(PropertyKeyConst.ENDPOINT,"10.18.90.16");
properties.put(PropertyKeyConst.ENDPOINT_PORT,"8850");
NamingService configService = NacosFactory.createNamingService(properties);
数据同步
实例信息同步
实例信息的由一个叫 Distro (com.alibaba.nacos.naming.consistency.ephemeral.distro.DistroConsistencyServiceImpl)的一致性协议维护,有如下几个特点:
- 最终一致性,由实例间通过http同