Skip to content

ipipman/registry-man

Repository files navigation

从零开始,手写注册中心

引言

随着微服务架构的广泛应用,服务注册与发现作为其关键组件,对于实现服务间的自动发现、负载均衡以及故障恢复等能力至关重要。从零开始,逐步阐述构建一个高性能、高可用的注册中心的设计思路与核心功能实现。

总体设计

我们的注册中心设计遵循以下原则:

分布式架构:采用分布式集群部署,确保系统的高可用性及水平扩展能力。
一致性协议:分为AP和CP两种模式常见的两种主要模式为CP(Consistency and Partition Tolerance,一致性与分区容错性)和AP(Availability and Partition Tolerance,可用性与分区容错性, 不同模式有不同算法, CP一般采用Raft、ZooKeeper或Paxos等一致性算法实现集群内数据同步,保证数据强一致性。由于注册中心对数据强一致性要求并并不高,大部分采用AP相关算法保证服务高可用性,本次实现主要以AP为主。
服务注册:提供服务实例的注册接口,允许服务实例向注册中心报告自己的元数据(如IP、端口、权重、健康状态等)。
服务发现:提供服务消费者查询服务提供者列表的接口,支持按服务名、标签、版本等条件筛选。
心跳检测与实例剔除:通过接收服务实例定期发送的心跳消息来判断其存活状态,对长时间未发送心跳的服务实例进行自动剔除。
服务续约与过期处理:支持服务实例主动续约以延长注册有效期,过期后自动从注册表中移除。
元数据管理:支持服务实例动态更新元数据,并及时通知订阅者。
容错与隔离:对内部故障具备自我修复能力,同时对外部调用提供适当的隔离措施,如限流、熔断等。
监控与运维:提供丰富的监控指标、日志记录以及必要的运维工具,便于系统状态监控与问题排查。

核心功能实现

  1. 服务注册
    接口设计:定义register方法,接收服务实例提供的服务名、IP、端口、元数据等信息作为参数。
    数据存储:在注册表中为新注册的服务实例创建条目,保存其相关信息。考虑到性能与一致性要求,可选用分布式缓存(如Redis)、数据库(如MySQL)或专门的KV存储(如Etcd)。
    集群同步:通过一致性协议,确保服务注册信息在集群内的各节点间实时同步。
  2. 服务发现
    接口设计:定义discover方法,接收服务名、版本、标签等查询条件作为参数。
    数据检索:根据查询条件,在注册表中查找匹配的服务实例列表,按照一定策略(如轮询、权重)排序。
    缓存优化:为提高查询效率,可引入本地缓存,并设置合理的刷新策略,避免频繁查询底层存储。
  3. 心跳检测与实例剔除
    心跳机制:服务实例需定时向注册中心发送心跳消息,注册中心接收到心跳后更新对应实例的活跃时间戳。
    失效判断:设定心跳超时阈值,若某个服务实例超过阈值仍未发送心跳,则标记其为失效并从注册表中移除。
    集群同步:失效实例信息需通过一致性协议同步至集群其他节点。
  4. 服务续约与过期处理
    续约接口:服务实例可通过renew接口主动延长注册有效期。
    过期逻辑:注册表中维护每个服务实例的注册到期时间,定期扫描并移除已过期的服务实例。
  5. 元数据管理
    更新接口:提供updateMetadata方法,允许服务实例动态更新自身的元数据。
    事件通知:元数据变更事件应触发通知机制,通知订阅了该服务的所有消费者更新其本地缓存。

总结

从零构建一个注册中心涉及分布式系统设计、一致性协议、服务治理等多个技术领域。通过上述设计与实现,我们构建了一个具备服务注册、发现、心跳检测、续约与过期处理、元数据管理等功能的注册中心,为微服务体系提供了坚实的服务治理基础。后续还可进一步完善监控、容错、安全等方面的功能,提升整体系统的稳定性和可靠性。

注册中心提供的核心功能

image-20240427032900502

About

从零开始,手写一个注册中心框架

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages