Skip to content

服务注册与发现

服务注册与发现是微服务架构的基础组件,解决了服务如何相互找到对方的问题。服务实例动态变化(扩容、缩容、故障),客户端需要动态获取服务实例地址。

服务注册

注册模式

服务自注册:服务启动时主动向注册中心注册,关闭时主动注销。问题是服务可能异常退出,无法注销。

第三方注册:通过部署环境(如 Kubernetes)自动注册服务,服务无需感知注册中心。问题是依赖部署环境。

注册信息

服务名:服务的唯一标识,如 user-service。

实例 ID:服务实例的唯一标识,如 user-service-192.168.1.100-8080。

网络地址:IP 和端口,如 192.168.1.100:8080。

健康状态:服务是否健康,健康检查通过则为健康。

元数据:服务的额外信息,如版本、环境、权重、标签。

健康检查

主动健康检查:注册中心定期向服务发送健康检查请求(如 HTTP /health),无响应则标记为不健康。

被动健康检查:服务定期发送心跳到注册中心,超时未收到心跳则标记为不健康。

注册中心的特性

高可用:注册中心故障不会导致服务调用失败。客户端缓存服务列表,注册中心短暂故障不影响调用。

一致性:服务注册信息需要在所有注册中心节点间一致。强一致性(ZooKeeper)或最终一致性(Eureka、Nacos)。

容量限制:注册中心需要支持大量服务实例。Eureka 支持万级实例,Nacos 支持十万级实例。

服务发现

客户端发现

客户端查询注册中心获取服务实例列表,客户端选择一个实例发起调用。

客户端发现的优势:客户端直接调用,无额外跳转。客户端可以自定义负载均衡策略。

客户端发现的问题:客户端需要集成发现 SDK,增加客户端复杂度。客户端需要处理服务列表缓存和刷新。

实现:Eureka(Netflix)、Consul(HashiCorp)、Nacos(阿里)。

服务端发现

客户端调用负载均衡器(LB),LB 查询注册中心获取服务实例列表,LB 选择一个实例转发请求。

服务端发现的优势:客户端无需感知服务发现,只需调用 LB。LB 可以集中管理负载均衡策略。

服务端发现的问题:多一跳网络调用,增加延迟。LB 可能成为瓶颈。

实现:Nginx + Consul Template、Kubernetes Service、AWS ALB。

服务实例选择

随机选择:从服务实例列表随机选择一个,简单但可能导致负载不均。

轮询选择:依次选择每个实例,负载均衡但无法处理实例性能差异。

权重选择:根据实例性能设置权重,性能高的实例分配更多请求。

最少连接:选择当前连接数最少的实例,适合长连接场景。

一致性哈希:根据请求特征选择实例,适合需要会话保持的场景。

主流注册中心

Eureka

Eureka 是 Netflix 开源的服务注册中心,由 Eureka Server 和 Eureka Client 组成。

Eureka Server:注册中心服务器,集群部署,节点间相互复制注册信息。

Eureka Client:服务客户端,嵌入在服务中,负责注册、发现、心跳。

Eureka 的特性:AP 模型(可用性优先)、自我保护模式(网络分区时保留注册信息)、多级缓存(提高性能)。

Eureka 的问题:一致性弱(节点间注册信息可能不一致)、客户端缓存(可能访问到已下线的实例)、维护状态(Netflix 2.0 已停止维护)。

Consul

Consul 是 HashiCorp 开源的服务网格工具,提供服务注册与发现、健康检查、KV 存储。

Consul 的架构:Consul Server(集群)、Consul Client(轻量级 Agent)、Consul Template(配置生成)。

Consul 的特性:CP 模型(一致性优先)、健康检查(HTTP、TCP、Script)、多数据中心支持、服务网格集成。

Consul 的问题:写性能受限于 Raft 同步、健康检查可能影响性能、学习曲线陡峭。

Nacos

Nacos 是阿里开源的动态服务发现、配置管理和服务管理平台。

Nacos 的架构:Nacos Server(集群)、Nacos Client(嵌入在服务中)、控制台(管理界面)。

Nacos 的特性:AP/CP 切换(可以切换一致性模型)、配置管理(动态配置、灰度发布)、健康检查(TCP、HTTP、MySQL)、Dubbo 生态集成。

Nacos 的优势:功能全面(服务发现 + 配置中心)、性能高(支持十万级实例)、生态完善(Spring Cloud Alibaba、Dubbo)。

Nacos 的问题:稳定性有待验证、社区不如 Eureka 和 Consul 活跃。

ZooKeeper

ZooKeeper 是 Apache 的分布式协调服务,提供服务注册与发现、配置管理、分布式锁。

ZooKeeper 的特性:CP 模型(强一致性)、临时节点(服务故障自动删除)、Watch 机制(服务变更通知)。

ZooKeeper 的问题:性能较差(写操作受限于 Raft 同步)、客户端复杂(需要处理连接断开、Session 过期)、不是为服务注册设计(通用协调服务)。

服务注册与发现的实践

注册中心集群:注册中心必须集群部署,避免单点故障。3 节点或 5 节点集群。

客户端缓存:客户端缓存服务列表,注册中心故障时仍可调用。定期刷新缓存。

健康检查:配置合适的健康检查间隔,间隔太短导致压力大,间隔太长导致故障感知慢。

多环境隔离:开发、测试、生产环境使用不同的注册中心,避免相互影响。

服务下线:服务下线前先从注册中心注销,等待一定时间后再停机,确保流量已切换。

灰度发布:通过标签(Tag)或分组(Group)实现灰度发布,新版本先接收少量流量。

服务注册与发现是微服务架构的基础,理解注册中心的原理和权衡,有助于选择合适的方案。