Nacos简述

news2025/1/14 18:39:21

介绍

Nacos主要在微服务生态中可以发现、配置和管理微服务,实现动态服务发现和注册、服务配置、DNS服务、服务元数据及流量管理。

​ 目前Nacos支持多种生态,比如SpringCloud、Dubbo、云原生Cloud Native等。

Nacos关键特性

1、服务发现和服务健康监测

1)Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用原生SDK、OpenAPI、或一个独立的Agent 注册 Service 后,服务消费者可以使用DNS或HTTP&API查找和发现服务。

2)Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层(如 HTTP、MySQL、用户自定义)的健康检查。对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

相关概念:

服务注册

Nacos Client 启动的时候会发送REST 请求(1.0默认为http,2.0为grpc)向Nacos Server注册服务并提供元数据信息,包含服务的别名、host、端口等信息。NacosServer接收到Client注册请求会讲实例信息存储到自身的注册表(底层为Map)中。

服务心跳

​ Nacos Client启动之后会启动一个定时任务每隔一段时间进行心跳通知Nacos Server(默认5s发送一次心跳),防止自身服务被剔除。

服务发现

​ **Nacos Client在进行第一次服务调用时,会先向Nacos Server发起REST请求拉取服务列表,并缓存到本地。**为防止缓存与实际服务数据不一致,同时Nacos Client会启动一个定时任务从Nacos Server拉取最新的注册表信息更新到本地缓存。

服务健康检查

Nacos Server会启动一个定时任务检测Nacos Client的健康状态,若15s内没有收到客户端的心跳事件,会将实例的health属性设置为false,如果实例超过30s没有收到心跳事件,会从Nacos Server注册表中剔除该实例。

2、动态配置服务

允许在所有环境中以几种和动态的方式管理所有服务的配置,Nacos消除了在更新配置时重新部署应用程序,这种动态配置服务可以以中心化、外部化和动态化的方式,管理所有环境的应用配置和服务配置。

Nacos 提供了一个简洁易用的UI帮助管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性。

特性:

  • Nacos Config 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。
  • 使用 Nacos Config,可以在 Nacos Server 配置界面集中管理 Spring Cloud 应用的外部属性配置。
  • 当应用程序通过部署管道(例如:Jenkins)从开发到测试再到生产时,可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。

1)一致性模型(AP)

Nacos 配置管理一致性分为两部分,第一部分是Server间一致性协议(Nacos Server集群环境),一个是SDK(Nacos Config Client)与Server的一致性协议。配置作为分布式系统中非强一致性数据,在出现脑裂的时候高可用性高于一致性,因此配置中心采用的是AP一致性协议。

CAP理论,C代表一致性,A代表可用性 ,P代表分区容错性。

2)支持多种类型配置

1)支持profile粒度的配置。用于开发、测试、生产环境。

2)支持自定义namespace配置。不同环境的配置的区分隔离。

3)支持自定义 Group 的配置。

4)支持共享配置。

5)支持自定义扩展DataId配置。不同分组采用不同数据源

3、动态 DNS 服务

​ **Nacos服务支持权重路由,可以用于实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。Nacos 提供了一些简单的 DNS APIs 帮助管理服务的关联域名和可用的 IP:PORT 列表。**动态DNS服务能够实现以DNS 协议为基础的服务发现,以帮助消除耦合到厂商私有服务发现 API 上的风险。

4、服务及其元数据管理

​ **Nacos支持数据中心的所有服务及元数据管理。**包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

部署模式

1、单机模式

​ 用于测试和单机试用。默认Nacos使用嵌入式数据库实现数据的存储,0.7版本之后支持mysql数据源能力。

安装数据库流程:

  1. 初始化mysql数据库,数据库初始化文件:nacos-mysql.sql

  2. 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码

    再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql nacos表如下。

2、集群模式

用于生产环境,确保高可用

3、多集群模式

用于多数据中心场景

Nacos架构设计

Nacos是一个分布式的,支持服务发现、配置管理和服务治理的平台。其架构设计主要包含以下三部分:

  1. 注册中心(Naming Service):用于服务的注册和发现。Nacos提供了REST和Java API接口,供开发者调用。
  2. 配置中心(Configuration Service):用于动态配置服务。开发者可以使用Nacos的配置中心将配置信息注入到应用程序中。
  3. 控制台(Console):用于管理和查看Nacos的服务和配置信息。

Nacos的架构图如下所示:

img

img

Nacos实现技术和原理

  1. Spring Cloud和Spring Boot:Nacos使用Spring Cloud作为服务治理的核心组件,使用Spring Boot作为开发框架。Spring Cloud提供了对Eureka、Consul等服务治理组件的支持。
  2. **Raft算法:Nacos使用了Raft算法作为分布式一致性算法。**Raft算法保证了分布式环境下数据的一致性,并且可以容忍节点故障。
  3. 数据库:Nacos使用MySQL作为存储服务注册和配置信息的数据库。
  4. RPC框架:Nacos使用了gRPC作为远程过程调用框架。
  5. Spring Cloud Gateway:Nacos使用Spring Cloud Gateway作为网关,处理所有的服务请求。

Nacos高性能实现原理

​ **Nacos通过使用Raft算法来实现服务列表的同步和高并发访问。**Raft算法是一种分布式一致性算法,能够保证在网络分区、服务器崩溃等异常情况下,系统仍能够保持强一致性。

​ **Nacos中的每个节点都是一个Raft节点,节点之间通过Raft协议进行通信和协调。**当有节点加入或离开集群时,Raft算法会自动进行选举,选出一个新的leader来负责更新服务列表,并将最新的服务列表同步给其他节点。同时,nacos使用了一些优化技术来提高同步效率和并发访问性能,包括:

  1. 快照技术:nacos会定期生成快照,将当前的服务列表状态保存下来,当节点重新加入集群时,可以快速恢复服务列表的状态,避免了重新同步的过程。
  2. 数据压缩:nacos使用了一些数据压缩算法来压缩服务列表数据,减少网络传输的数据量,提高同步效率。
  3. 前缀树:nacos中的服务列表使用了前缀树数据结构进行存储和管理,能够快速地进行服务的查找和匹配,提高了并发访问性能。

服务发现核心概念

服务(Service) 服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)

**服务注册中心 (Service Registry) 服务注册中心,它是服务,其实例及元数据的数据库。底层为Map(namespace, Map(group::serviceName, Service)),服务实例在启动时注册到服务注册表,并在关闭时注销。**服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。

服务元数据 (Service Metadata) 服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。

服务提供方 (Service Provider) 是指提供可复用和可调用服务的应用方。

服务消费方 (Service Consumer) 是指会发起对某个服务调用的应用方。

**名字服务 (Naming Service) 提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务,**例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服务发现和 DNS 就是名字服务的2大场景。

1、业务流程

1)服务注册:

​ 本地服务端会通过轮询向注册中心集群节点地址进行服务的注册。Nacos 客户端进行服务注册有两个部分组成,一个是将服务信息注册到服务端,另一个是像服务端发送心跳包,这两个操作都是通过 NamingProxy 和服务端进行数据交互的。

2)注册中心:

​ 即Nacos Server上采用了Map保存服务的实例信息,当服务信息配置了持久化策略之后,会被保存到nacos数据库中。

3)调用方:

​ 为了保证本地服务实例列表的动态感知,Nacos采用了 Pull/Push同时运作的方式。另外服务消费方是通过RestTemplate调用提供方的服务。 Nacos 客户端进行服务订阅时也有两部分组成,一个是不断从服务端查询可用服务实例的定时任务,另一个是不断从已变服务队列中取出服务并通知 EventListener 持有者的定时任务。

2、执行步骤

Nacos注册概括来说有6个步骤:

0、服务容器负责启动,加载,运行服务提供者。

1、服务提供者在启动时,向注册中心注册自己提供的服务。

2、服务消费者在启动时,向注册中心订阅自己所需的服务。

3、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

4、服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

5、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

3、Nacos 服务领域模型

Nacos支持服务在所有场景下的数据存储和管理,Nacos 的服务领域模型为 服务-集群-实例的三层模型。

1) 服务领域

  • 健康检查开关
  • 元数据
  • 路由机制
  • 保护阈值

2)集群领域

  • 健康检查模式
  • 元数据
  • 同步机制

3)实例领域

  • IP
  • 端口
  • 权重
  • 健康状态
  • 下线状态
  • 元数据
  • 响应时间

小结

1)心跳检测

1)服务注册的策略的是每5秒向nacos server发送一次心跳,心跳带上了服务名,服务ip,服务端口等信息。

2) nacos server也会向client 主动发起健康检查,支持tcp/http检查。如果15秒内无心跳且健康检查失败则认为实例不健康,如果30秒内健康检查失败则剔除实例。

2)服务领域模型

Nacos服务领域模型主要分为命名空间、集群、服务。

1)在服务级别,保存了健康检查开关、元数据、路由机制、保护阈值等设置,

2)集群保存了健康检查模式、元数据、同步机制等数据,

3)命名空间/实例保存了该实例的ip、端口、权重、健康检查状态、下线状态、元数据、响应时间。

3)其他

1、Nacos中的负责均衡底层是如何实现的?
通过内置的Ribbon实现的,nacos(部分版本)默认的负载均衡策略是轮询,然后基于这些算法从服务实例中获取一个实例为消费方法提供服务

2、Ribbon 内置的负载策略都有哪些?
8种,可以通过查看IRule接口的实现类进行分析

3、@LoadBalanced的作用是什么?
用于告诉Spring框架,在使用RestTempalte进行服务调用时,这个调用过程会被一个拦截器进行拦截,然后在拦截器内部,启动负载均衡策略。

4、我们可以自己定义负载均衡策略吗?
可以,基于IRule接口进行策略定义,也可以参考NacosRule进行实现

5、如何定位到服务实例?

​ 通过命名空间(Namespace)+ 分组(Group)+服务名(Name)可以定位到一个唯一的服务实例。

6、保护阈值设置多少?

​ 0.75。为了防止因过多实例故障,导致所有流量全部流入剩余实例,继而造成流量压力将剩余实例被压垮形成雪崩效应。应将健康保护阈值定义为⼀个 0 到 1 之间的浮点数。当域名健康实例数占总服务实例数的比例小于该值时,无论实例是否健康,都会将这个实例返回给客户端。这样做虽然损失了⼀部分流量,但是保证了集群中剩余健康实例能正常工作。

7、临时实例 VS 持久化实例

​ 临时实例在非健康状态下会被自动剔除,而持久化实例不会被自动剔除。

临时实例的健康状况是 Nacos 客户端以固定频率(5s一次)上报给 Nacos 服务器端的,而持久化实例是 Nacos 服务器端主动探测的。

8、Nacos实例数据存储在哪里?

​ 默认是把数据保存在本地磁盘文件读取,启动之后会把实例数据加载的缓存数据中用于页面展示。若是采用数据库持久化,则在启动之后同步到数据库中。定期检查心跳,并更新对应的数据。

总结

​ Nacos除了服务的注册发现之外,还支持动态配置服务。并且支持负载均衡以及流量权重,另外提供sdk方式服务注册和发现和DNS服务。并且支持集群,也有心跳检测机制,服务健康检测机制,以及异常上报,有直观的UI方便管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/915074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang面向对象:封装 继承 多态

面向过程转换到面向对象,那么必然会涉及到几个特性:封装,继承,多态,那么Golang中的面向过程会有什么特性?那我们来仔细说一说: 封装: 首先要一个类的概念,类就像一下工厂…

BATPowerShell实现本地文件自动上传FTP服务器

运维工作中,经常需要一些脚本来实现自动化,今天分享本地文件自动上传FTP的两种解决办法: 一、使用BAT自动上传FTP 使用批处理(BAT)命令文件将本地文件夹内容上传到FTP服务器需要使用Windows自带的命令行工具&#xf…

使用mysql:5.6和 owncloud 镜像,构建一个个人网盘

一.拉取镜像 docker pull mysql:5.7 docker pull owncloud 二.创建容器 1.MySQL容器 docker run -d --name db1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456. -e MYSQL_DATABASEowncloud -e MYSQL_USERowncloud -e MYSQL_PASSWORDowncloud mysql:5.7 docker run: 创建和运行…

2023年03月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:和数 给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 2 1, 4 1 3。 时间限制:10000 内存限制:65536 输入 共两行&#x…

飞天使-k8s基础组件分析-控制器

文章目录 控制器含义解释pod的标签与注释ReplicaControllerReplicaSetDeploymentsDaemonSetJobCronjob参考文档 控制器含义解释 空调遥控器知道吧ReplicationController: ReplicationController确保在任何时候都运行指定数量的pod副本。换句话说,一个ReplicationCo…

DRF ImageFiled字段时会加上域名和乱码的问题

问题描述: 一张表的image类型为imageFiled # ############################### 商品 ############################### class Category(models.Model):"""类别名称比如:螃蟹、大米、油等"""categoryname models.CharFie…

Unity 之`Physics.Raycast()`方法,射线检测

文章目录 总述参数解释形参前两个变量可以用Ray 来代替 返回值 总述 当你在Unity中使用Physics.Raycast()方法时,你实际上是在进行一种射线检测,以查看一条射线是否与场景中的碰撞体相交。这可以用来实现很多不同的功能,如点击选择物体、射击…

Windows如何安装Git

一、简介 Git 是一个开源的分布式版本控制系统,是目前世界上最先进、最流行的版本控制系统。可以快速高效地处理从很小到非常大的项目版本管理。特点:项目越大越复杂,协同开发者越多,越能体现出 Git 的高性能和高可用性。 二、…

31、springboot 配置HTTP服务端口及如何通过WebServer实例动态获取项目中的HTTP端口

配置HTTP服务端口及如何通过WebServer实例动态获取项目中的HTTP端口 ★ 设置HTTP服务端口: - server.port或者SERVER_PORT环境变量——总结来说,其实就是要配置server.port外部配置属性。▲ 同样遵守如下优先级: 这些都是外部配置源&#x…

探索Vue生命周期钩子函数:从创生到销毁

Vue这个引领前端开发潮流的框架,其优雅的响应式数据绑定和组件式开发方式,使得它备受瞩目。然而,Vue的魅力绝不仅限于此,它还赋予开发者一组神奇的生命周期钩子函数,能够在组件的各个成长阶段插入自定义代码。本文将带…

css 实现四角边框样式

效果如图 此图只实现 左下与右下边角样式 右上与左上同理 /* 容器 */ .card-mini {position: relative; } /* 左下*/ .card-mini::before {content: ;position: absolute;left: 0;bottom: 0;width: 20px;height: 20px;border-bottom: 2px solid #253d64;border-left: 2px so…

赴日程序员学日语需要学多久?

现在很多国内程序员想转型做赴日IT,但是因为完全没有日语经验,又长期从事解决问题debug的工作,所以非常担心自己学不会日语。其实你的心底里可能比较担心是,投入了很多时间发现学不会文科类型的语言,自己没有学母语以外…

[保研/考研机试] KY124 二叉搜索树 浙江大学复试上机题 C++实现

题目链接&#xff1a; 二叉搜索树_牛客题霸_牛客网判断两序列是否为同一二叉搜索树序列。题目来自【牛客题霸】https://www.nowcoder.com/share/jump/437195121692722892652 描述 判断两序列是否为同一二叉搜索树序列 输入描述&#xff1a; 开始一个数n&#xff0c;(1<…

Python数据采集实战-使用BeautifulSoup框架解析HTML文档并提取所需内容(附源码和实现效果)

实现功能 使用BeautifulSoup框架解析HTML文档并提取所需内容的例子&#xff1a;假设我们要从以下HTML文档中提取所有超链接的链接地址 实现代码 from bs4 import BeautifulSoup import requests# 发送请求并获取HTML文档 url "https://www.baidu.com" response r…

c(Bua-Cpa-Thi-Val-Asn-Cys)-Pro-d-Arg-NEt2 acetate,1647120-04-4,试剂特点介绍

英文名&#xff1a;c(Bua-Cpa-Thi-Val-Asn-Cys)-Pro-d-Arg-NEt2 acetate CAS&#xff1a;1647120-04-4 1.Molecular formula&#xff1a;C44H64ClN11O10S2 2.Molecular weight&#xff1a;1006.63 3.Packaging specification&#xff1a;1g、5g、10g, flexible packaging, inc…

宠物小程序开发

在当今社会&#xff0c;宠物已成为许多人生活中不可或缺的一部分。宠物市场的持续增长为创业者提供了巨大的商机。然而&#xff0c;作为一个创业者&#xff0c;要在竞争激烈的宠物市场中脱颖而出并不容易。因此&#xff0c;开发一个专属于自己的宠物小程序成为了解决这一难题的…

Linux下的Shell编程——Shell概述和入门(一)

前言&#xff1a; Shell还是一个功能相当强大的编程语言&#xff0c;易编写、易调试、灵活性强。为了方便后续的学习&#xff0c;我们需要学习在Linux系统下的Shell编程 目录 一、Shell概述 1.Linux 提供的 Shell 解析器有 2. 默认的解析器是 bash 二、Shell 脚本入门 1.脚…

php+echarts实现数据可视化实例3

效果 全部代码 <?php include(includes/session.inc); include(includes/SQL_CommonFunctions.inc); ?> <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" …

OpenGL —— 2.2、Shader之间数据传输、向Shder传输数据

Shader OpenGL着色器&#xff08;shader&#xff09;是一种用于编写图形渲染代码的编程语言。它们在图形处理单元&#xff08;GPU&#xff09;上运行&#xff0c;用于控制渲染管线的不同阶段。 在OpenGL中&#xff0c;有两种主要类型的着色器&#xff1a;顶点着色器和片段着色器…

Linux 压缩解压(归档管理):tar命令

计算机中的数据经常需要备份&#xff0c;tar是Unix/Linux中最常用的备份工具&#xff0c;此命令可以把一系列文件归档到一个大文件中&#xff0c;也可以把档案文件解开以恢复数据。 tar使用格式 tar [参数] 打包文件名 文件 tar命令很特殊&#xff0c;其参数前面可以使用“-”&…