首页 > 数据库 > 数据库开发技术 > 如何注册和发现服务?
在上一期文章中,我介绍了服务发布和引用的常见方式:RESTful API、XML 配置以及 IDL 文件。假设你已经使用其中一种方式发布了服务,并且在一台机器上部署了服务。那么,我要问一个问题:如果我想调用这个服务,如何知道你部署的这台机器的地址呢?
这个问题类似于我们想去吃肯德基时,可以在谷歌地图上搜索,然后谷歌地图会返回所有肯德基店面的地址,我们选择最近的一家去吃。谷歌地图在这里扮演了一个注册中心的角色,记录了所有肯德基店面的地址。
同样地,想知道某台服务器的地址,可以去一个类似“谷歌地图”的地方查找。在分布式系统中,这个概念叫做注册中心。其原理与地图相似,就是将部署服务的机器地址记录到注册中心,服务消费者在需要时查询注册中心,输入服务名获取地址并发起调用。
在微服务架构下,主要有三种角色:服务提供者(RPC Server)、服务消费者(RPC Client)和服务注册中心(Registry)。它们的交互关系如下:
RPC Server 提供服务,启动时根据 server.xml 中的配置向 Registry 注册服务,并定期发送心跳汇报存活状态。
RPC Client 启动时根据 client.xml 中的配置向 Registry 订阅服务,并将 Registry 返回的服务节点列表缓存在本地内存中,与 RPC Server 建立连接。
当 RPC Server 节点发生变更时,Registry 会同步变更,RPC Client 感知后刷新本地缓存的服务节点列表。
RPC Client 从本地缓存的服务节点列表中,基于负载均衡算法选择一台 RPC Server 发起调用。
注册中心的实现涉及以下几个问题:需要提供哪些接口,如何部署,如何存储服务信息,如何监控服务提供者节点的存活,服务提供者节点变化时如何通知服务消费者,以及如何控制注册中心的访问权限。
注册中心 API:
服务注册接口:服务提供者调用该接口完成服务注册。
服务反注册接口:服务提供者调用该接口完成服务注销。
心跳汇报接口:服务提供者调用该接口上报存活状态。
服务订阅接口:服务消费者调用该接口订阅服务,获取可用服务提供者节点列表。
服务变更查询接口:服务消费者调用该接口获取最新的可用服务节点列表。
服务查询接口:查询注册中心当前注册的服务信息。
服务修改接口:修改注册中心中的服务信息。
集群部署:
注册中心作为服务提供者和消费者之间的桥梁,至关重要。一般采用集群部署来保证高可用性,并通过分布式一致性协议确保不同节点的数据一致性。例如,ZooKeeper 集群包含多个节点,服务提供者和消费者可以与任意节点通信,因为它们的数据保持一致。ZooKeeper 通过以下方式工作:
启动时选举一个 leader,负责处理数据更新。
一个更新操作成功需大多数 Server 在内存中成功修改。
每个 Server 内存中存有一份数据,Client 可请求任意 Server。
目录存储:以 ZooKeeper 为例,注册中心存储服务信息采用层次化的目录结构:
每个目录在 ZooKeeper 中叫作 znode,有唯一路径标识。
znode 包含数据和子 znode,数据有多个版本。
服务健康状态检测: 注册中心支持服务注册和订阅功能,还需具备服务节点健康状态检测功能。例如,ZooKeeper 基于客户端与服务端的长连接和会话超时控制实现:
客户端与服务端建立连接后生成唯一 Session ID。
维持长连接,定期发送心跳消息,服务器重置 SESSION_TIMEOUT。
超过 SESSION_TIMEOUT 未收到心跳消息,则认为 Session 结束,删除服务节点信息。
服务状态变更通知: 注册中心探测到服务节点新加入或剔除时,必须通知所有订阅该服务的消费者,刷新本地缓存的服务节点信息。例如,ZooKeeper 通过 Watcher 机制实现:
消费者调用 getData 方法订阅服务,通过 Watcher 的 process 方法获取服务变更,调用 getData 获取变更后数据,刷新本地缓存。
白名单机制: 在微服务测试和部署时,通常包含生产和测试环境。为了防止测试环境的节点注册到生产环境,注册中心需提供保护机制,即白名单机制。只有在白名单内的 RPC Server 才能调用注册接口,避免测试环境节点误入生产环境。
注册中心是实现服务化的关键,连接服务提供者和消费者,实现了解耦。注册中心支持服务节点的动态扩展和缩减,通过健康状态检测保持最新服务节点信息,并通知订阅者。注册中心一般采用分布式集群部署保证高可用性,有时多 IDC 部署以实现异地多活,对数据一致性要求高。
请思考,采用注册中心实现服务发现与传统 DNS 有何不同?
首先,注册中心的服务注册和发现是自动化的,服务提供者和消费者通过 API 自动注册和订阅服务,提高了实时性和容错性。而传统 DNS 需要手工配置,自动化程度低,实时性较差。
其次,注册中心可以支持多种类型的服务,包括 HTTP 和 RPC 服务,适用范围更广,而传统 DNS 主要用于 HTTP 服务。
此外,注册中心具备自动化的健康检查功能,可以定期检测服务节点的状态,并剔除不可用节点,保证服务的高可用性。传统 DNS 则没有健康检查机制,无法主动检测服务节点的状态。
在负载均衡方面,注册中心可以实现客户端负载均衡,消费者根据本地缓存的服务节点列表选择服务节点,提升了请求的分发效率。而传统 DNS 通常只能解析到一个服务器 IP,负载均衡能力有限。
实时性方面,注册中心可以实时通知服务节点的变更,确保服务调用的准确性。传统 DNS 更新有延迟,客户端可能在 TTL 过期前一直使用旧的 IP 地址,导致变更无法及时生效。
最后,注册中心通过分布式一致性协议保证数据一致性,而传统 DNS 采用多级架构,数据一致性较差,尤其在全球分布式场景下,同步存在延迟。
综上所述,注册中心在自动化、服务类型支持、健康检查、负载均衡、实时性和数据一致性方面,都优于传统 DNS,是现代微服务架构中服务发现的更好选择。
原文作者:二进制跳动;如有侵权,请联系管理员删除。