我在组内的Nacos分享
本文已收录 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

与CMDB对接,根据service、ip等信息获取元数据(如机房位置)
自定义实现选择器selector,根据手动配置规则表达式选取相应实例
架构设计
存储模型
全量数据位于内存中,每个节点数据保持一致,节点间采取同步协议进行复制

数据结构
一个客户端连接为一个client,打包客户端的信息与注册、订阅数据
- 注册
- publisherIndexes => 哪些客户端注册了哪些服务
- serviceName
- clientid
- clientid
- serviceName
- ...
- serviceName
- publisherIndexes => 哪些客户端注册了哪些服务
- 订阅
- subscriberIndexes => 哪些客户端订阅了哪些服务
- serviceName
- clientid
- clientid
- serviceName
- ...
- serviceName
- subscriberIndexes => 哪些客户端订阅了哪些服务
同步协议
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分享的更多相关文章
- ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法,先分组,然后在组内排名,分组计算,主表与附表一对多取唯一等
ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法 今天在使用多字段去重时,由于某些字段有多种可能性,只需根据部分字段进行去重,在网上看到了row ...
- 组内Linq培训记录
注: 由于该培训是在组内分享,先写成了Word,而word中的代码都以截图方式呈现了,而在博客园不能很方便的粘贴截图进来,所以我用插入代码的方式加进来,如果文中说“如下图”或“如下图代码”,那么就直接 ...
- VUE组内培训
最近去参加了一个外部VUE的周末培训,加上自己比较感兴趣所以对这项很热的前端框架做了点学习,顺便给组内同事做个简单的分享,希望下次有项目可以使用上- VUE的语法教程网上很多我就不一一列举,截图放一下 ...
- 在论坛中出现的比较难的sql问题:29(row_number函数 组内某列的值连续出现3次标记出来)
原文:在论坛中出现的比较难的sql问题:29(row_number函数 组内某列的值连续出现3次标记出来) 在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘 ...
- sql 分组后 组内排名
语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW ...
- sql查询技巧,按时间分段进行分组,每半小时一组统计组内记录数量
今天拿到一个查询需求,需要统计某一天各个时间段内的记录数量. 具体是统计某天9:00至22:00时间段,每半小时内订单的数量,最后形成的数据形式如下: 时间段 订单数 9:00~9: ...
- 如何用SQL实现组内前几名的输出
关于问题 如何查询组内最大的,最小的,大家或许都知道,无非是min.max的函数使用.可是如何在MySQL中查找组内最好的前两个,或者前三个? 什么是相关子查询 在提出对于这个问题的对应方法之前,首先 ...
- BIRT实现组内跨行计算
问题来源:http://developer.actuate.com/community/forum/index.php?/topic/36160-dealing-with-previous-rows- ...
- 模拟QQ分组(具有伸缩功能) (添加开源框架的光闪烁效果)SimpleExpandableListAdapter 适配器的用法,并且可添加组及其组内数据。
package com.lixu.qqfenzu; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis ...
随机推荐
- CF474D Flowers 题解
题目:CF474D Flowers 传送门 DP?递推? 首先可以很快看出这是一道 DP 的题目,但与其说是 DP,还不如说是递推. 大家还记得刚学递推时教练肯定讲过的一道经典例题吗?就是爬楼梯,一个 ...
- ECDSA高性能硬件实现——算法详解与模块划分
ECDSA全称椭圆曲线数字签名算法,它是基于素数域的椭圆曲线对信息进行加签与验签.其核心在于对信息的加签,及对加签的信息进行验签,那么下面介绍该算法流程. 假设Alice希望对消息m进行签名,并将消息 ...
- JavaScript实现,判断一个点是否在多边形内(简直nice,希望能帮到你)
//定义点的结构体 function point(){ this.x=0; this.y=0; } //计算一个点是否在多边形里,参数:点,多边形数组 function PointInPoly(pt, ...
- 如何删除windows10右键新建中不需要的选项
参考博客https://blog.csdn.net/Kinglen_R/article/details/102983259 首先打开注册表程序,可以点击开始按钮后直接输入regedit点击进入 (或者 ...
- Linux文件系统只读 解决方案:
Linux系统Read-only file system,文件系统只读排查解决方案:文件系统只读机制:当文件系统自身的校验机制发现文件系统存在问题时,为避免文件系统受到进一步的损坏,系统会把文件系统设 ...
- 常见web中间件漏洞(四)Tomcat漏洞
这部分好久没写了,继续更新web中间件漏洞思路整理(不复现) ,争取...整理完 前几篇指路链接: nginx: https://www.cnblogs.com/lcxblogs/p/13596239 ...
- Linux学习手册
入门概述 Linux 简介 Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的. Linux 是一套免费使用和自由传播的类 Unix ...
- 奇思妙想 CSS 3D 动画 | 仅使用 CSS 能制作出多惊艳的动画?
本文将从比较多的方面详细阐述如何利用 CSS 3D 的特性,实现各类有趣.酷炫的动画效果.认真读完,你将会收获到: 了解 CSS 3D 的各种用途 激发你新的灵感,感受动画之美 对于提升 CSS 动画 ...
- 【Python机器学习实战】决策树和集成学习(二)——决策树的实现
摘要:上一节对决策树的基本原理进行了梳理,本节主要根据其原理做一个逻辑的实现,然后调用sklearn的包实现决策树分类. 这里主要是对分类树的决策进行实现,算法采用ID3,即以信息增益作为划分标准进行 ...
- 题解 party?
传送门 挺遗憾的一个题 考场上想到的思路是题解的退化版,可以有71pts(赛时以为只有20pts),但因为这一场的策略原因没有打-- 首先发现颜色种类数很少,可以直接bitset上树剖维护,炸不了空间 ...