微服务 注册中心_4.微服务架构的第二个组件:注册中心

在微服务架构下,主要有三种角色:

  • 服务提供者(RPC Server)
  • 服务消费者(RPC Client)
  • 服务注册中心(Registry)
b4afbcd1f43ad8555763a44482ed4f15.png

RPC Server:服务提供者,启动时根据服务发布文件server.xml中的配置信息向Registry注册自身服务,并定期向Registry发送心跳汇报存活状态。

RPC Client:服务消费者,启动时根据服务引用文件client.xml中的配置信息向Registry订阅服务,并缓存Registry返回的服务节点列表到本地内存中。

RPC Server节点变更:Registry会同步变更,RPC Client感知到服务节点变更后会更新本地内存中缓存的服务节点列表。

RPC Client调用:RPC Client根据本地缓存的服务节点列表,基于负载均衡算法选择一台RPC Server发起调用。

注册中心实现思路:

  • 注册中心需要提供哪些接口?
  • 注册中心如何部署?
  • 如何存储服务信息
  • 如何监控服务节点的存活状态?
  • 服务节点变更如何通知到消费者?
  • 注册中心的访问权限控制?

1.注册中心API

基本API:

  • 服务注册接口:服务提供者通过调用服务注册接口完成服务注册
  • 服务反注册接口:服务提供者通过调用服务反注册接口完成服务注销
  • 心跳汇报接口:服务提供者通过心跳汇报接口上报节点存活状态
  • 服务订阅接口:服务消费者通过调用服务订阅接口完成服务订阅,获取到可用的服务提供者节点列表
  • 服务变更查询接口:服务消费者通过调用服务变更查询接口,获取最新的服务节点列表

后台管理API:

  • 服务查询接口:查询注册中心当前注册了哪些接口
  • 服务修改接口:修改注册中心的某一服务的信息

2.集群部署

注册中心都是需要采用集群部署来保证注册中心的高可用性,并通过分布式一致性协议确保集群中节点之前的数据一致性。

以开源注册中心Zookeeper工作原理解释:

  • 每个server内存中存储了一份数据,client可以请求任意server
  • Zookeeper启动时将从实例中选取一个leader(Paxos协议)
  • leader负责处理数据更新等操作(ZAB协议)
  • 一个更新操作成功,当且仅当大多数server在内存中更新成功
1dfc9d1c76b42c307a593dfe1019312a.png

3.目录存储

开源注册中心Zookeeper存储服务信息采用的是层次化的目录结构:

  • 每个目录在Zookeeper中叫作znode,并且具有一个唯一的路径标识
  • znode可以包含数据和子znode
  • znode中的数据可以有多个版本,那么查询这个路径下的数据就需要带入版本信息

4.服务健康状态检测

开源注册中心Zookeeper的服务健康状态检测机制实现原理:通过客户端和服务端建立长链接以及会话的超时机制来实现服务健康状态检测。

主要步骤如下:

  • 客户端与服务端建立长链接后,同时生成会话,并生成一个全局的唯一Session ID。
  • 在客户端和服务端的长链接的SESSION_TIMEOUT周期内,客户端会定时向服务端发送心跳消息(ping消息)。
  • 如果服务器接收到客户端心跳消息,会后重置下次SESSION_TIMEOUT时间。
  • 如果服务器在这个SESSION_TIMEOUT时间内没有接收到客户端心跳消息,则服务端会认为这个session就已经结束,zookeeper就会认为这个服务节点不可用,将会从注册中心中删除该节点信息。

5.服务状态变更通知

一旦注册中心检测到有服务提供者节点新加入或者被剔除,就必须立刻通知所有订阅该服务的消费者,刷新本地缓存的服务节点信息,确保服务调用不会请求到不可用的节点。

开源注册中心Zookeeper的服务变更通知实现原理:是基于监听器Watcher机制,来实现服务状态变更通知给服务消费者。

主要步骤如下:

服务消费者在调用Zookeeper的getData方法订阅服务时,还可以通过监听器Watcher的process方法感知到服务的变更,再通过调用getData方法获取变更后的数据,重新刷新本地缓存的节点信息。

6.白名单机制

注册中心可以提供一个白名单机制,只有添加到注册中心白名单内的RPC Server,才能调用注册中心的注册接口,避免测试环境的节点注册到线上引起服务不可用。

这篇就总结到这里,如果喜欢我的文章,欢迎关注我的头条号,后续会有新的文章更新。

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

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

相关文章

2018怎么打开2019_2019 年,我还是没有摆脱 Micro USB

时间回到 2017 年春,那时候的我想买一块移动硬盘。当时乐视的超级手机已经发布一年多了,苹果也在前一年发布了新款 MacBook Pro,USB Type-C 这个新鲜的接口已经进入大众的视野。移动硬盘常用的 Micro USB 3.0 接口的质量良莠不齐,…

中添加复选框_Word/excel中在方框中打钩/叉的符号,简单方便快捷

方法1:插入特殊符号将光标定位于需要打钩的地方,选择【插入】——【符号】——【其他符号】——更改字体为【Windings2】方法2:使用快捷键从上面的截图中可以看到设置快捷键,所以在插入特殊符号的时候就可以输入数字2611后按住【A…

python伪造请求头x-forwarded-for的作用_Pyspider中给爬虫伪造随机请求头的实例

Pyspider 中采用了 tornado 库来做 http 请求,在请求过程中可以添加各种参数,例如请求链接超时时间,请求传输数据超时时间,请求头等等,但是根据pyspider的原始框架,给爬虫添加参数只能通过 crawl_config这个…

spark更改分区_用于小文件的spark重新分区数据

我对Spark非常新,我主要使用集群来实现并行化目的。我有一个100MB的文件,其中的每一行都通过一些算法进行处理,这是相当繁重和长时间的处理。用于小文件的spark重新分区数据我想使用10节点群集并行处理。我知道块大小超过100MB,我…

js获取字符串出现次数最多_js如何获取字符串中出现次数最多的字符

我是一个不太会表达的人,所以我尽可能的用代码来阐释我的理解和思考,废话不多说,我就直接放代码了:function getStingMax(str){if(typeof str ! "string"){alert("请传入string类型的数据")return}let countO…

2 数据源配置_如何在程序运行中动态切换数据源?架构师必读秘笈

说起动态数据源,大家应该也不陌生。例如在读写分离系统中,则要对请求中的读写操作进行分离,让读和写落在不同的数据库上;例如在多租户系统中,则要根据请求来源租户的不同,让其落在不同租户的数据库上&#…

数字滚动_告别单调!让PPT数字滚动起来。

大家好,我是三石。在PPT的制作过程中,数字是不可缺少的元素。如何设计制作,才能使简单的数字变得有活力。废话不多说看效果~其实制作方式很简单,跟着我的步骤你也能做出来。制作步骤:1、首先要制作出数字条可以通过Exc…

mysql字段是否存在_mysql判断列是否存在

本篇文章将通过存储过程来判断列(字段)是否存在。请看详情。推荐课程:MySQL教程。判断字段是否存在:DROP PROCEDURE IF EXISTS schema_change;DELIMITER //CREATE PROCEDURE schema_change() BEGINDECLARE CurrentDatabase VARCHAR(100);SELECT DATABASE…

mysql 日期间隔_mysql比较两个日期间隔

一、两个日期间隔天数,使用datediff()函数例:mysql> select datediff(now(),20160401);----------------------------| datediff(now(),20160401) |----------------------------| 4 |----------------------------1 row in…

ubuntu apache2 mysql_折腾 Ubuntu 系统续之安装PHP、Apache2和Mysql

一个狗血的开始接上回的折腾,话说昨天晚上狗屎运来临,在重装了一次的 Ubuntu 系统上,居然顺利的安装了 QQ、PHP7、Apache2、phpMyAdmin、chrome stable、Sublime Text3 并注册成功、git,还有其他桌面美化的东西,如 Doc…

mysql 5.7 数据库备份_MySQL5.7.20数据库备份与恢复

MySQL数据库备份与恢复####造成数据丢失的原因####程序错误人为操作错误运算错误磁盘故障灾难(如火灾、地震)和盗窃####物理与逻辑的角度####1、物理备份:冷备份:在数据关闭的状态下运行热备份:在数据库运行的状态时进行备份操作,…

mysql warning 日志_Mysql5.7.19安装后错误日志中有警告

警告1:secure_file_priv 配置项对数据导入导出的影响1、限制mysqld 不允许导入 | 导出mysqld --secure_file_privenullMySQL [ztjy]> select * from info_posts limit 10 into outfile /usr/local/src/info_posts_tmp.txt;ERROR 1290 (HY000): The MySQL server …

fscanf不读取_思考了一天,终于把matlab的fscanf中的sizeA搞清楚了

数值如12345等可以作为字符,所以以字符格式读取文件时,这些数字照样可以被读取 A fscanf(fileID,formatSpec) A fscanf(fileID,formatSpec,sizeA) 以上是fscanf的语法; sizeA起到的作用是限制,限制读取读取文件中数据的数量&…

linux开发板 pc 通讯_从51单片机到Linux 开发板运行hello world(教程4)

大家好,我是兔子。是一个嵌入式软硬件工程师。正在从单片机开发转岗Linux开发。这次教大家如何在Linux开发板上运行可执行文件。简单起见,不涉及到硬件。直接和教程2一样,能在PC虚拟机上运行hello world程序。当然开发板上也可以。1.Source I…

python decimal 转 float_python教程之二python数学运算

存储数据变量#两个变量交换值,通过第三个参数实现print(两个变量交换值,通过第三个参数实现); #第一种方法是通过第三个参数实现x5;#变量赋值y11; #变量赋值print(交换前,x,y);tempx;xy;ytemp;print(交换后,x,y);#两个变量交换值,更便捷的方法…

mysql 视图 动态sql_sql-server – 使用动态Sql创建视图

我正在尝试创建一个动态数据库创建脚本.有很多步骤,我们经常创建这个数据库,所以脚本看起来像这样.DECLARE databaseName nvarchar(100) DatabaseNameEXEC(/*A lot of database creation code built off of databaseName*/)除了我们在此数据库中创建的一个视图外,这一切都很好…

apache arm 交叉编译_移植apache2 ARM版 – 交叉编译apache2 | 学步园

下载apache2 http://apache.fayea.com/apache-mirror//httpd/httpd-2.4.6.tar.bz21. tar jxvf httpd-2.4.6.tar.bz22. cd httpd-2.4.63. ./configure --hostarm-linux --prefix/usr/local/arm/4.4.3 --with-apu/usr/local/arm/4.4.3/ --with-apr-util/usr/local/arm/4.4.3 --wi…

mysql订单表上亿怎么分表_[转]单表上亿的数据量如何分表

之前的几篇关于分表的,提到的分表策略不够详细,我在这篇中补充一些分表策略吧:按号段分:(1) user_id为区分,1~1000的对应table1,1001~2000的对应table2,以此类推&#xf…

mysql msdtc 不支持_IIS5.1安装后,不支持IIS的问题。(转)

(如果是ghost版本安装的xp或者win2003无法安装iis,那么你只需要下载本站从WINDOWS安装盘抽取的IIS安装文件,就可以安装IIS了,WINXPSP1 安装IIS 5, WINXP SP2 IIS5.1 ,WIN2003安装IIS6,特别提示下菜鸟同志&a…

python中对象包含几个部分_python中包含对象类型的两个列表的交集

如果顺序无关紧要,请使用set.intersection:A [(1.1,2.2),(3.3,4.4),(5.5,6.6)]B [(1.1,2.2),(7.7,8.8),(3.3,4.4)]print(set(A).intersection(B))set([(3.3, 4.4), (1.1, 2.2)])或者将B设为集合,并在a上迭代保持公共元素:^{pr2}…