写点什么

我在组内的 Nacos 分享

用户头像
捉虫大师
关注
发布于: 2 小时前

本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎 star。

Nacos 简介

Nacos : Naming and Configuration Service,可打包部署配置中心和注册中心,也可独立部署其中之一,配置中心、控制台依赖 mysql,由阿里巴巴 2018 年 8 月开源,github 19.1k star(截止 2021.08.24)


本文只讲解服务发现部分。

服务注册发现模型


  • namespace:环境隔离、租户隔离;不同 namespace 服务无法相互发现

  • group:业务隔离;解决不同业务下 serviceName 相同的问题;可获取默认或指定 group 实例

  • cluster:集群隔离;可定制化路由偏好;可获取全部或指定集群实例

临时实例

  • 临时实例:靠 client 的心跳或连接保活,当不存活时,直接下线实例;适用于主动注册的服务,特别适合 K8S 下 ip 漂移的场景

  • 永久实例:注册后不用保活,靠服务端健康检查来判断实例是否健康,不健康实例也不用下线;适用于 ip 不常变化的场景


在 Nacos 中他们的主要区别如下:


Dubbo 适配


  • 使用临时实例

  • 应用级:serviceName 为应用名即可

  • 服务级(Dubbo):以provider/consumer:$[service_name]:${version}:${group}为服务名

路由模式

客户端路由模式

客户端(SDK)根据 service,指定部分或全部 group、cluster 获取相应的实例,客户端根据权重或其他策略进行路由

服务端路由模式

插件式 selector 实现自定义路由模式,可对接第三方 CMDB



  1. 与 CMDB 对接,根据 service、ip 等信息获取元数据(如机房位置)

  2. 自定义实现选择器 selector,根据手动配置规则表达式选取相应实例

架构设计

存储模型

全量数据位于内存中,每个节点数据保持一致,节点间采取同步协议进行复制


数据结构

一个客户端连接为一个 client,打包客户端的信息与注册、订阅数据


  • 注册

  • publisherIndexes => 哪些客户端注册了哪些服务

  • serviceName

  • clientid

  • clientid

  • serviceName

  • ...

  • 订阅

  • subscriberIndexes => 哪些客户端订阅了哪些服务

  • serviceName

  • clientid

  • clientid

  • serviceName

  • ...

同步协议

distro

  • 客户端心跳/连接保活,重连时有恢复(注册、订阅)机制

  • 数据同步为异步


raft

  • 半数以上节点同步成功才返回给客户端


通信协议

生态建设

  • 客户端

  • Java

  • golang

  • Python

  • C#

  • Nodejs

  • C++

  • 插件

  • Dubbo-registry-nacos

  • Rpc-java-registry-nacos

  • Nacos-spring-starter

  • Nacos-sync

  • Nacos-k8s-sync

  • Nacos-client-mse-extension

  • Nacos-coredns-plugin

  • Nacos-istio

Nacos-sync

主要用于注册中心迁移以及多数据中心数据同步


Nacos-coredns-plugin

consumer 侧可使用域名方式发现服务,无需使用 Nacos 客户端


Nacos-istio

支持 Nacos 数据同步至 MCP Server


优缺点分析

  • 优点:

  • AP 模式,扩展性、多数据中心支持友好

  • 服务发现模型设计支持逻辑上 namespace、group、cluster 等的隔离

  • 健康检查模式支持较多

  • 支持临时实例与持久化实例,满足不同场景

  • 功能多,生态丰富,支持多语言 SDK

  • 2.x 版本 grpc 长连接性能强

  • 单一进程,部署简单,且附带开箱即用的控制台

  • 基本无依赖(除控制台依赖 mysql,注册中心部分实际不依赖任何第三方组件)

  • 缺点:

  • 1.x http 心跳消耗大,2.x 刚发布不久,可能存在一些 bug

  • 没有分层设计,没办法针对性扩容,如连接数太多时,扩容能解决,但也会增加数据同步压力




搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。



发布于: 2 小时前阅读数: 5
用户头像

捉虫大师

关注

还未添加个人签名 2018.09.19 加入

欢迎关注我的公众号“捉虫大师”

评论

发布
暂无评论
我在组内的Nacos分享