服务注册
首先说服务注册,所谓服务注册,就是把服务给注册到nacos的注册中心上面去,让nacos知道自己是提供某个服务的。
服务注册时发生在服务实例(如订单服务)启动时,通过nacos客户端向nacos server发送注册请求,包含服务名、ip、端口、集群名、元数据等信息。
nacos server将实例信息存入持久化存储(如内嵌数据库derby或外置mvsql),并同步至集群其他节点(基于raft协议保证一致性)。
ap模式:在 nacos 中,服务注册默认使用 distro 协议(基于 ap 模型,优先保证可用性),其特点是 异步同步、最终一致性
- 服务实例启动时,仅需向集群中的任意一个 nacos server 节点发起注册请求(无需写入所有节点)。
- 若当前节点是 负责节点(responsible node),则处理注册请求并异步将数据同步到其他节点(通过 distro 协议)。
- 若当前节点不是负责节点,则会将请求转发给负责节点(leader 节点或通过哈希算法确定的负责节点)。
特点:
- 异步同步:数据先写入本地,后续通过定时任务或事件驱动同步到其他节点。
- 最终一致性:可能存在短暂不一致(如同步延迟),但最终所有节点数据一致。
cp模式:nacos 使用 raft 协议(基于 cp 模型,强一致性),适用于配置信息等对一致性要求高的场景
- 客户端写请求发送到 leader 节点。
- leader 将操作日志复制到所有 follower 节点,多数派(n/2+1)确认后提交数据
注册后,实例定期(默认5秒)向nacos发送心跳包,维持健康状态。若15秒内无心跳,实例被标记为不健康;30秒未收到则删除实例。
ap模式,临时实例(ephemeral=true)默认通过客户端定期(5 秒)向 nacos server 发送心跳包。
- 15 秒无心跳:实例被标记为 不健康。
- 30 秒无心跳:实例从注册表中 删除。
cp模式,持久化实例(ephemeral=false) 不会主动发送心跳,而是由 nacos server 定期每20s主动探测其实例的健康状态
服务发现
继续说服务发现,服务发现指的是通过nacos来发现对应的服务都有哪些提供者。服务发现有两种方式,一种是主动查询,首次调用前,消费者客户端向 nacos server 发起一次查询,获取目标服务的全量实例列表。结果缓存到本地,并订阅该服务的变更事件。后续调用时,直接读取本地缓存,根据负载均衡策略 (如随机、轮询、权重)选择一个实例发起调用。
为了保证本地缓存的实时性,客户端默认每隔 10 秒(可通过 nacos,client,naming.pull.interval=10000 配置) 主动向 nacos server 拉取最新服务列表,覆盖旧缓存。
另外,当 nacos server 检测到服务实例变化(如注册、下线、健康状态变更),会通过http 长轮询(long polling)或 grpc 主动推送变更事件到订阅的客户端。客户端收到推送后立即更新本地缓存,无需等待定时拉取,实现秒级更新。
http 长轮询(long polling)
- 客户端发送 http 请求,nacos server 保持连接打开,直到检测到变更后返回响应。
grpc 长连接(nacos 2.x)
- 客户端与 nacos server 建立 grpc 流式连接,server 立即推送变更事件
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论