理解nacos

注册模块

客户端源码

在我们导入的依赖的jar包中spring.factories中可以看到EnableAutoConfiguration中为我们引入了NacosDiscoverAutoConfiguration,  这个配置类会为我们注入NacosAutoServiceRegistration,这是一个实现了ApplicationListner,那么在spring的启动时候调用多播器进行广播的时候就会调用到监听器对应的方法,即onApplicationEvent,这里面会调用bind,这里面就会为我们去启动一个定时任务去发送心跳请求,同时也会发送注册请求/instance

服务端源码

那么我们在服务端里面找到对应的/instance访问路径对应的controller

  服务端主要维护了一个双层map来维护注册表,最外层的MAP以NamesSpace为key,

以Map为value,里层的map是以group:ServiceName为key,以Service为vlaue,

而Service里面又有保存了持久节点Cluster的Set和临时节点Cluster的set

当注册请求进来会将请求塞入BlockingQueue里面,另外启动一个线程去消费queue里面的注册请求,这里使用Copyonwrite进行注册,就是通过另外新建一个map,将原本的map中的数据取出并加上新增的数据合并完写入新建的map,最后再将map更新回原来的map中,并且另外塞进一个专门用于同步其他集群机器的队列,由消费线程向其他节点发送同步请求

如果是CP模式,则根据raft协议进行选举leader,一开始启动的时候 各个节点向其他节点发送投票请求,当其中一个节点率先拿到集群一半以上的票数时就会选举为leader

当有写请求进来的时候,如果是发送给follower,则会转发给leader,由leader完成后,向其他节点发送同步请求,这里用到countdownlaunch计数,当响应节点加上自己超过集群的一半时,则向客户端返回提交成功 。

这里涉及到

cap理论:

C一致性,就是修改请求向其中一个节点提交成功后,第二个请求进来无论请求哪个节点都能拿到修改后的数据,其实就是数据同步的及时性

A可用性,就是无论集群无论在任何时候都能做出及时的响应,C和A 是无法共同确保的,因为如果你想要一致性,那么就需要集群间的同步数据,而同步数据期间是集群是无法对外提供服务的,也就不可用了,而如果要求可用性,那么在集群同步的期间,就已经允许其他的请求进来,就有可能查询到还没同步到的最新的数据,也就不能满足一致性了

P分区容错性 ,就是即使因为网络分区导致的集群间节点无法相连,也不会导致整个集群挂掉,而是采取重新选举leader,继续保持对外服务的能力

脑裂.当集群中同时出现两个以上leader的时候,也就是当分区了,一个集群被分成两个,两个小集群各自选举各自的leader,当网络连通后,整个集群就会有两个leader,就会产生数据混乱的局面

我们通过选择leader时必须获得整个集群半数以上票数来避免脑裂,因为这样子就可以确保无论怎么分区,都只有一个分区可以选举出leader

大规模集群的注册中心策略,分片

奇数个节点的原因

1.避免脑裂后无法选出新节点,偶数个节点如果对半分,就会造成两个分区都无法选出leader,因为他们都没办法拿到这个集群的一半加1的票数

2.性能相同的情况下,奇数节点更节约资源,5个和6个都只能最多挂掉两个,那还不如只部署5台

BASE理论

BA基本可用,三个挂掉两个,还是可用的

S软状态,在数据还没完全同步完前的状态,当三个挂掉两个,当这两个节点重启后重新跟leader进行连接同步数据的这一段期间就成为软状态

E最终一致性.最终都会所有同步

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值