本文已收录 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中他们的主要区别如下:

emphemral true false
名称 临时实例 永久实例
CAP AP CP
一致性协议 distro raft
是否持久化
健康检查方式 心跳/连接 服务端检查(TCP、HTTP、MYSQL)

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

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

通信协议

功能/版本 1.x distro 1.x raft 2.x distro 2.x raft
注册/注销 http http grpc http
订阅 http http grpc grpc
心跳/健康检查 http TCP/http/mysql TCP TCP/http/mysql
推送 udp udp grpc grpc
集群间数据同步 http/distro http/自研raft grpc/distro jraft

生态建设

  • 客户端

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

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

我在组内的Nacos分享的更多相关文章

  1. ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法,先分组,然后在组内排名,分组计算,主表与附表一对多取唯一等

    ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法 今天在使用多字段去重时,由于某些字段有多种可能性,只需根据部分字段进行去重,在网上看到了row ...

  2. 组内Linq培训记录

    注: 由于该培训是在组内分享,先写成了Word,而word中的代码都以截图方式呈现了,而在博客园不能很方便的粘贴截图进来,所以我用插入代码的方式加进来,如果文中说“如下图”或“如下图代码”,那么就直接 ...

  3. VUE组内培训

    最近去参加了一个外部VUE的周末培训,加上自己比较感兴趣所以对这项很热的前端框架做了点学习,顺便给组内同事做个简单的分享,希望下次有项目可以使用上- VUE的语法教程网上很多我就不一一列举,截图放一下 ...

  4. 在论坛中出现的比较难的sql问题:29(row_number函数 组内某列的值连续出现3次标记出来)

    原文:在论坛中出现的比较难的sql问题:29(row_number函数 组内某列的值连续出现3次标记出来) 在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘 ...

  5. sql 分组后 组内排名

    语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW ...

  6. sql查询技巧,按时间分段进行分组,每半小时一组统计组内记录数量

    今天拿到一个查询需求,需要统计某一天各个时间段内的记录数量. 具体是统计某天9:00至22:00时间段,每半小时内订单的数量,最后形成的数据形式如下: 时间段          订单数 9:00~9: ...

  7. 如何用SQL实现组内前几名的输出

    关于问题 如何查询组内最大的,最小的,大家或许都知道,无非是min.max的函数使用.可是如何在MySQL中查找组内最好的前两个,或者前三个? 什么是相关子查询 在提出对于这个问题的对应方法之前,首先 ...

  8. BIRT实现组内跨行计算

    问题来源:http://developer.actuate.com/community/forum/index.php?/topic/36160-dealing-with-previous-rows- ...

  9. 模拟QQ分组(具有伸缩功能) (添加开源框架的光闪烁效果)SimpleExpandableListAdapter 适配器的用法,并且可添加组及其组内数据。

    package com.lixu.qqfenzu; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis ...

随机推荐

  1. ssrf漏洞随笔

    一.ssrf漏洞定义 SSRF漏洞:SSRF是一 种由攻击者构造请求,由服务端发起请求的安全漏洞.一般情况下,ssrf攻击的目标是外网无法访问的内部系统 SSRF漏洞( 服务器端请求伪造 )也被称为跨 ...

  2. 复杂字符串转List<JSONObject>

    public static List<JSONObject> getlist(String data){ ObjectMapper mapper = new ObjectMapper(); ...

  3. idea构建servlet程序

    1 新建maven项目 勾选maven_web模板 2 idea加载后应是如图所示 3 在main目录下新增两个文件夹,一个java 设置为源码根目录,另一个是resources 设置为源目录 4 在 ...

  4. 使用simg2img win提取安卓官方ROM包中独立的系统软件

    一.背景 今天是七夕情人节诶,但是与我一只单身老狗有啥关系呢?一大早发现手机系统更新了(MIUI12.5 增强版),但是更新完后感觉充电速度不是很妙(你们懂得),为了恢复之前的充电速度,首先想到将手机 ...

  5. Greenplum数仓监控解决方案(开源版本)

    Greenplum监控解决方案 基于Prometheus+Grafana+greenplum_exporter+node_exporter实现 关联图 一.基本概念 1.Prometheus ​ Pr ...

  6. 你认为的.NET数据库连接池,真的是全部吗?

    一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象. DBA能在对业务方无侵 ...

  7. Java文件和Java包结构

    Java中的包概念 Java中的包是封装一组类,子包和接口的机制.软件包用于: 防止命名冲突.例如,可以有两个名称分别为Employee的类,college.staff.cse.Employee和co ...

  8. 服务启动shell脚本

    #!/bin/sh JarDir=`pwd` do_start() { echo "pandora-login start ..." nohup java -jar -Xmn256 ...

  9. 使用Netcat实现通信和反弹Shell

    一.概述 nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流 可运行在TCP或者UDP模式,添加参数 -u 则调整为udP,默认为tcp -v 参数,详细输出 -n参数,net ...

  10. SQL 练习3

    查询存在" 01 "课程,可能不存在" 02 "课程的情况(不存在时显示为 null ) SELECT * FROM (SELECT * FROM SC WHE ...