微服务架构之注册中心

news2024/10/7 10:15:14

假设你发布了一个服务,并且已经在一台机器上部署了服务,那如果我想调用这个服务,我该如何知道你部署的这台机器的地址呢?

这个问题就跟我想去吃肯德基一样,我可以去谷歌地图上搜索肯德基,然后谷歌地图会返回所有的肯德基店面的地址,于是我选择距离最近的一家去吃。这里面谷歌地图就扮演了一个类似注册中心的角色,收录了所有肯德基店面的地址。

同理,我想知道这台服务器的地址,那是不是可以去一个类似“谷歌地图”的地方去查呢?是的,在分布式系统里,就有一个类似的概念,不过它的名字可不是叫什么地图,而是叫注册中心。但原理和地图其实差不多,就是将部署服务的机器地址记录到注册中心,服务消费者在有需求的时候,只需要查询注册中心,输入提供的服务名,就可以得到地址,从而发起调用。

下面我详细讲解下注册中心的原理和实现方式。

注册中心原理

在微服务架构下,主要有三种角色:服务提供者(RPC Server)、服务消费者(RPC Client)和服务注册中心(Registry),三者的交互关系请看下面这张图,我来简单解释一下。

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

  • RPC Client调用服务,在启动时,根据服务引用文件client.xml中配置的信息,向Registry订阅服务,把Registry返回的服务节点列表缓存在本地内存中,并与RPC Sever建立连接。

  • 当RPC Server节点发生变更时,Registry会同步变更,RPC Client感知后会刷新本地内存中缓存的服务节点列表。

  • RPC Client从本地缓存的服务节点列表中,基于负载均衡算法选择一台RPC Sever发起调用。

alt

注册中心实现方式

注册中心的实现主要涉及几个问题:注册中心需要提供哪些接口,该如何部署;如何存储服务信息;如何监控服务提供者节点的存活;如果服务提供者节点有变化如何通知服务消费者,以及如何控制注册中心的访问权限。

1. 注册中心API

根据注册中心原理的描述,注册中心必须提供以下最基本的API,例如:

  • 服务注册接口:服务提供者通过调用服务注册接口来完成服务注册。

  • 服务反注册接口:服务提供者通过调用服务反注册接口来完成服务注销。

  • 心跳汇报接口:服务提供者通过调用心跳汇报接口完成节点存活状态上报。

  • 服务订阅接口:服务消费者通过调用服务订阅接口完成服务订阅,获取可用的服务提供者节点列表。

  • 服务变更查询接口:服务消费者通过调用服务变更查询接口,获取最新的可用服务节点列表。

除此之外,为了便于管理,注册中心还必须提供一些后台管理的API,例如:

  • 服务查询接口:查询注册中心当前注册了哪些服务信息。

  • 服务修改接口:修改注册中心中某一服务的信息。

2. 集群部署

注册中心作为服务提供者和服务消费者之间沟通的桥梁,它的重要性不言而喻。所以注册中心一般都是采用集群部署来保证高可用性,并通过分布式一致性协议来确保集群中不同节点之间的数据保持一致。

以开源注册中心ZooKeeper为例,ZooKeeper集群中包含多个节点,服务提供者和服务消费者可以同任意一个节点通信,因为它们的数据一定是相同的,这是为什么呢?这就要从ZooKeeper的工作原理说起:

  • 每个Server在内存中存储了一份数据,Client的读请求可以请求任意一个Server。

  • ZooKeeper启动时,将从实例中选举一个leader(Paxos协议)。

  • Leader负责处理数据更新等操作(ZAB协议)。

  • 一个更新操作成功,当且仅当大多数Server在内存中成功修改 。

通过上面这种方式,ZooKeeper保证了高可用性以及数据一致性。

alt

3. 目录存储

还是以ZooKeeper为例,注册中心存储服务信息一般采用层次化的目录结构:

  • 每个目录在ZooKeeper中叫作znode,并且其有一个唯一的路径标识。

  • znode可以包含数据和子znode。

  • znode中的数据可以有多个版本,比如某一个znode下存有多个数据版本,那么查询这个路径下的数据需带上版本信息。

alt

4. 服务健康状态检测

注册中心除了要支持最基本的服务注册和服务订阅功能以外,还必须具备对服务提供者节点的健康状态检测功能,这样才能保证注册中心里保存的服务节点都是可用的。

还是以ZooKeeper为例,它是基于ZooKeeper客户端和服务端的长连接和会话超时控制机制,来实现服务健康状态检测的。

在ZooKeeper中,客户端和服务端建立连接后,会话也随之建立,并生成一个全局唯一的Session ID。服务端和客户端维持的是一个长连接,在SESSION_TIMEOUT周期内,服务端会检测与客户端的链路是否正常,具体方式是通过客户端定时向服务端发送心跳消息(ping消息),服务器重置下次SESSION_TIMEOUT时间。如果超过SESSION_TIMEOUT后服务端都没有收到客户端的心跳消息,则服务端认为这个Session就已经结束了,ZooKeeper就会认为这个服务节点已经不可用,将会从注册中心中删除其信息。

5. 服务状态变更通知

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

继续以ZooKeeper为例,基于ZooKeeper的Watcher机制,来实现服务状态变更通知给服务消费者的。服务消费者在调用ZooKeeper的getData方法订阅服务时,还可以通过监听器Watcher的process方法获取服务的变更,然后调用getData方法来获取变更后的数据,刷新本地缓存的服务节点信息。

6. 白名单机制

在实际的微服务测试和部署时,通常包含多套环境,比如生产环境一套、测试环境一套。开发在进行业务自测、测试在进行回归测试时,一般都是用测试环境,部署的RPC Server节点注册到测试的注册中心集群。但经常会出现开发或者测试在部署时,错误的把测试环境下的服务节点注册到了线上注册中心集群,这样的话线上流量就会调用到测试环境下的RPC Server节点,可能会造成意想不到的后果。

为了防止这种情况发生,注册中心需要提供一个保护机制,你可以把注册中心想象成一个带有门禁的房间,只有拥有门禁卡的RPC Server才能进入。在实际应用中,注册中心可以提供一个白名单机制,只有添加到注册中心白名单内的RPC Server,才能够调用注册中心的注册接口,这样的话可以避免测试环境中的节点意外跑到线上环境中去。

总结

注册中心可以说是实现服务化的关键,因为服务化之后,服务提供者和服务消费者不在同一个进程中运行,实现了解耦,这就需要一个纽带去连接服务提供者和服务消费者,而注册中心就正好承担了这一角色。此外,服务提供者可以任意伸缩即增加节点或者减少节点,通过服务健康状态检测,注册中心可以保持最新的服务节点信息,并将变化通知给订阅服务的服务消费者。

注册中心一般采用分布式集群部署,来保证高可用性,并且为了实现异地多活,有的注册中心还采用多IDC部署,这就对数据一致性产生了很高的要求,这些都是注册中心在实现时必须要解决的问题。

本文由 mdnice 多平台发布

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

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

相关文章

移动端开发

1. 视口 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, in…

chatgpt赋能python:Python坐标画图:从入门到精通

Python坐标画图&#xff1a;从入门到精通 在现代科技的时代&#xff0c;数据分析与可视化已经成为了各行各业不可或缺的环节。Python作为一个功能强大的脚本语言&#xff0c;被广泛应用于数据处理、科学计算和机器学习等领域。在本文中&#xff0c;我们将会介绍Python坐标画图…

chatgpt赋能python:Python局部变量的作用范围与全局变量的关系

Python局部变量的作用范围与全局变量的关系 在Python中&#xff0c;变量的作用范围非常重要&#xff0c;因为变量的作用范围决定了它们在程序中的可见度。在这篇文章中&#xff0c;我们将讨论Python中局部变量的作用范围与全局变量的关系&#xff0c;以及如何通过改变局部变量…

chatgpt赋能python:Python字符串反向-简单易学的方法

Python 字符串反向 - 简单易学的方法 介绍 Python 字符串是用于存储和操纵文本的一种数据类型。字符串是不可变的&#xff0c;这意味着一旦创建&#xff0c;就不能修改内容。 很多时候我们需要对字符串进行操作&#xff0c;比如反向。反转字符串是一个常见的操作&#xff0c…

chatgpt赋能python:Python小波分析介绍

Python小波分析介绍 小波分析是一种数学方法&#xff0c;适用于对非平稳信号&#xff08;非周期性信号&#xff09;进行分析和处理。Python作为一种强大的编程语言&#xff0c;提供了丰富的小波分析工具包&#xff0c;让人们更容易地应用小波分析。 小波分析的原理 小波分析…

chatgpt赋能python:Python小波变换——数据分析和信号处理方向的常见工具

Python小波变换——数据分析和信号处理方向的常见工具 介绍 Python是一种流行的编程语言&#xff0c;它具有简单易学和强大的内置库&#xff0c;能够轻松地完成各种任务。小波变换是一种用于数据分析和信号处理的常见工具&#xff0c;它可以捕获并描述信号和数据中的不同特性…

设计模式之订阅发布模式

一、简介 订阅发布模式&#xff08;Publish-Subscribe Pattern&#xff09;是一种行之有效的解耦框架与业务逻辑的方式&#xff0c;也是一种常见的观察者设计模式&#xff0c;它被广泛应用于事件驱动架构中。 在这个模式中&#xff0c;发布者&#xff08;或者说是主题&#x…

chatgpt赋能python:Python小波分解:一种更高效的数据处理方法

Python小波分解&#xff1a;一种更高效的数据处理方法 介绍 在现代科技时代&#xff0c;数据处理在各个领域都扮演着至关重要的角色。比如信号、图像、音频和视频等数据的处理&#xff0c;这些领域需要能够处理数据&#xff0c;核心是要可以提取出它们的特征。这正是小波变换…

【Python】正则表达式操作

知识目录 一、写在前面✨二、检查字符串首字符三、字符匹配四、总结撒花&#x1f60a; 一、写在前面✨ 大家好&#xff01;我是初心&#xff0c;希望我们一路走来能坚守初心&#xff01; 今天跟大家分享的文章是 Python函数式编程第二弹&#xff0c;再次以两个简单的例子带大…

Python之网络编程

一、操作系统基础 操作系统&#xff1a;&#xff08;Operating System&#xff0c;简称OS&#xff09;是管理和控制计算机硬件与软件资源的计算机程序&#xff0c;是直接运行在“裸机”上的最基本的系统软件&#xff0c;任何其他软件都必须在操作系统的支持下才能运行。 注&a…

一图看懂 typing_extensions 模块:允许在旧版Python上启用、实验新的类型系统特性,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 typing_extensions 模块&#xff1a;允许在旧版Python上启用、实验新的类型系统特性&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;摘要&#x1f9c…

软件产品授权体系搭建

流程图 流程说明 1. 需要提供一个授权服务端、授权小程序客户端 2. 支持在线授权、离线授权、移动介质授权 3. 适应所有语言开发的产品体系

C++学习笔记(四): 类和对象

一个类定义了一个类型&#xff0c;以及与其关联的一组操作。类机制是C最重要的特性之一。实际上&#xff0c;C最初的一个设计焦点就是能定义使用上像内置类型一样自然的类类型&#xff08;class type&#xff09;。 #include <iostream>using namespace std;class Box {p…

chatgpt赋能python:Python坐标轴范围:如何设置?

Python 坐标轴范围&#xff1a;如何设置&#xff1f; 在 Python 中&#xff0c;通过 matplotlib 库绘图时&#xff0c;默认情况下该库会自动设置坐标轴范围。但是&#xff0c;在一些特殊情况下&#xff0c;我们可能需要手动设置坐标轴范围&#xff0c;以更好的呈现数据。那么&…

总结880

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;1800基础部分&#xff0c;背诵15篇短文&#xff0c;核心主词&#xff09; 周目标&#xff1a;1800高等数学部分并完成错题记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#xff09; 复习微分方…

014、检查点

检查点 检查点触发机制为什么需要检查点检查点工作流程检查点记录位置Database Recovery检查点调整checkpoint_completion_target检查点触发机制 在PostgreSQL中,检查点(后台)进程执行检查点;当发生下列情况之一时,其进程将启动: 检查点间隔时间由checkpoint_timeout设置…

chatgpt赋能python:Python倒序排序:如何通过Python实现快速高效地倒序排序?

Python倒序排序&#xff1a;如何通过Python实现快速高效地倒序排序&#xff1f; 在Python编程中&#xff0c;很可能遇到需要对列表、字典或其他数据结构进行排序的任务。排序可以按照从小到大或从大到小的顺序进行&#xff0c;本文将介绍如何使用Python进行倒序排序。倒序排序…

chatgpt赋能python:Python编译:Python程序变成机器可执行文件的过程

Python编译&#xff1a;Python程序变成机器可执行文件的过程 对于大多数Python编程人员来说&#xff0c;编译Python程序可能不是必须的&#xff0c;因为Python是一种解释型语言&#xff0c;我们可以直接运行源代码。但是&#xff0c;有时候&#xff0c;我们需要将Python程序编…

推箱子大冒险(SDL/C)

前言 欢迎来到小K的SDL专栏第三小节&#xff0c;本节将为大家带来小项目~C语言SDL版坤坤推箱子详细讲解&#xff0c;这里也为大家上传了源码和图片资源&#xff0c;需要的自取看完以后&#xff0c;希望对你有所帮助 ✨效果如下 文章目录 前言一、推箱子思路讲解二、加SDL绘图代…

chatgpt赋能python:Python字符串颠倒:如何用Python实现字符串颠倒操作

Python字符串颠倒&#xff1a;如何用Python实现字符串颠倒操作 在Python中&#xff0c;字符串颠倒是一种常见的操作。我们可以使用Python内置的方法和函数来轻松地完成字符串颠倒操作。在本篇文章中&#xff0c;我们将深入探讨Python字符串颠倒操作的实现方法。 什么是字符串…