从0到1手写注册中心Registry之集群选主

一、领域对象

  1. Cluster:描述集群信息
  • port描述当前服务端口;
  • host描述当前服务主机;
  • myself描述当前服务本身;
  • servers描述当前服务集群列表
  • registryConfigProperties配置信息;
  • executor定时任务,负责更新服务信息和选主;
  • timeout定时任务执行时间间隔。

图片

  1. Server:描述服务实例
  • url:服务地址
  • status:服务状态
  • leader:服务实例是否为主节点
  • version:服务最新版本号

图片

二、集群选主

  1. 初始化
  • 获取当前服务实例地址信息
  • 构建当前服务实例对象
  • 获取所有服务列表
  • 开启定时任务:更新集群服务信息;选主。

图片

所有服务列表有属性文件里进行配置,分别创建当前服务对象和其他服务对象。区别是当前服务实例状态为true,其他为false。

图片

  1. 更新集群服务信息

初始化的时候只是描述了服务简单信息,实际信息需要事实获取并更新。

通过http调用获取到其他服务实际的信息,包括真实转态、是否主节点、版号。

图片3. 选主

从所有服务列表中筛选出状态为true,是主节点的服务。

  • 如果是空列表,就进行选主;
  • 如果有多个服务,也需要选主
  • 如果只有一个这样的节点,就不需要选主,说明当前集群只有一个主,符合预期。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选主算法有:

  • 各种节点自己选,算法保证大家选的是同一个
  • 外部有一个分布式锁,谁拿到锁,谁是主
  • 分布式一致性算法,比如paxos,raft,,很复杂

当前实现采用第一种,通过选择出最小的hash为主节点,这种算法可以保证大家选择的都是一样的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选主成功后,设置为主节点即可。

三、测试

  1. 三个节点

通过端口8484、8485、8486分别启动三个服务,模拟集群。

观察8484的日志:先更新三个服务信息,都是成功的。然后选择出8484为主节点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

观察8485的日志:先更新三个服务信息,都是成功的。然后选择出8484为主节点。

图片

观察8486的日志:先更新三个服务信息,都是成功的。然后选择出8484为主节点。

图片

  1. 两个节点

停掉8484,只保留8485和8486两个服务。

观察8485的日志:更新服务状态8484是失败的,8485和8486是成功的。选择是8485为主节点。

图片

观察8486的日志:更新服务状态8484是失败的,8485和8486是成功的。选择是8485为主节点。

图片

源码地址:

https://github.com/midnight2104/midnight-registry/tree/v2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/661059.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux部署java1.8(java17)

两种方式: 方式一 1.输入查找命令: yum -y list java*2.输入安装命令: yum install -y java-1.8.0-openjdk.x86_643.测试是否已经安装: java -version方式二: 点击链接进入官网:https://www.oracle.com/…

Go 语言(三)【面向对象编程】

1、OOP 首先,Go 语言并不是面向对象的语言,只是可以通过一些方法来模拟面向对象。 1.1、封装 Go 语言是通过结构体(struct)来实现封装的。 1.2、继承 继承主要由下面这三种方式实现: 1.2.1、嵌套匿名字段 //Add…

24五一杯ABC题详细建模思路+可执行代码+成品论文+图表(免费参考资料)

比赛题目的完整版思路可执行代码数据参考论文都会在第一时间更新上传的,大家可以参考我往期的资料,所有的资料数据以及到最后更新的参考论文都是一次付费后续免费的。注意:(建议先下单占坑,因为随着后续我们更新资料数…

TCP重传,滑动窗口,流量控制,拥塞控制

TCP重传,滑动窗口,流量控制,拥塞控制 TCP重传机制: 超时重传快速重传SACKD-SACK 通过序列号与确认应答判断是否要重传 超时重传: 超过指定时间没有收到确认应答报文,就会重发该数据 触发超时重传的情况…

【嵌入式笔试题】进程线程笔试题

非常经典的笔试题。 1.进程&线程(16道) 1.1异步IO和同步IO区别? 答案:如果是同步IO,当一个IO操作执行时,应用程序必须等待,直到此IO执行完。 相反,异步IO操作在后台运行,IO操作和应用程序可以同时运行,提高系统性能,提 高IO流量。 解读:在同步文件IO中,线…

c#数据库: 10.调用存储过程查询信息,并显示在窗体上

查询女生信息,并将信息显示在窗体上: 原数据表//右键数据库名,新建查询 ------------- 新建查询窗口,添加新建存储过程Procedure_GetGirls1和查询代码如下 : CREATE PROCEDURE dbo.Procedure_GetGirls1 /*存储过程名称*/ AS SELECT * f…

Taro引入echarts【兼容多端小程序(飞书/微信/支付宝小程序)】

近期接到公司新需求,开发飞书小程序,并且原型中含有大量的图表,本想使用飞书内置图表组件 —— chart-space,但官方表示已经停止维护了,无奈之下,只能另寻他路,于是乎,图表之王&…

vue 脚手架 创建vue3项目

创建项目 命令:vue create vue-element-plus 选择配置模式:手动选择模式 (上下键回车) 选择配置(上下键空格回车) 选择代码规范、规则检查和格式化方式: 选择语法检查方式 lint on save (保存就检查) 代码文件中有代码不符合 l…

TiDB系列之:部署TiDB集群常见报错解决方法

TiDB系列之:部署TiDB集群常见报错解决方法 一、部署TiDB集群二、unsupported filesystem ext3三、soft limit of nofile四、THP is enabled五、numactl not usable六、net.ipv4.tcp_syncookies 1七、service irqbalance not found,八、登陆TiDB数据库 一、部署TiDB…

aardio - 用 customPlus 轻松制作九宫格效果

import win.ui; /*DSG{{*/ var mainForm win.form(text"数独";right599;bottom599;maxfalse) mainForm.add( plus{cls"plus";left8;top8;right553;bottom559;notify1;z1}; ) /*}}*///定义模板 itemModel {} for(x1;3;1){for(y1;3;1){ /*每个项目的9宫格*…

【AIGC调研系列】InternVL开源多模态模型与GPT-4V的性能对比

InternVL和GPT-4V都是多模态模型,但它们在性能、参数量以及应用领域上有所不同。 InternVL是一个开源的多模态模型,其参数量为60亿,覆盖了图像/视频分类、检索等关键任务,并在32个视觉-语言基准测试中展现了卓越性能[2]。InternV…

Vue通过下拉框选择字典值,并将对应的label以及value值提交到后端

产品品种从字典中获取 产品性质也是从字典中获取 字典当中的保存 dict_type表 dict_data表 在表单提交的方法中 1.因为做的产品性质是多选,它会以数组的方式提交,所以需要先将Json格式转变为String JSON.stringify(this.form.nature) 2.提交表单&…