介绍
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数据源能力。
安装数据库流程:
初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码
再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql nacos表如下。
2、集群模式
用于生产环境,确保高可用
3、多集群模式
用于多数据中心场景
Nacos架构设计
Nacos是一个分布式的,支持服务发现、配置管理和服务治理的平台。其架构设计主要包含以下三部分:
- 注册中心(Naming Service):用于服务的注册和发现。Nacos提供了REST和Java API接口,供开发者调用。
- 配置中心(Configuration Service):用于动态配置服务。开发者可以使用Nacos的配置中心将配置信息注入到应用程序中。
- 控制台(Console):用于管理和查看Nacos的服务和配置信息。
Nacos的架构图如下所示:
Nacos实现技术和原理
- Spring Cloud和Spring Boot:Nacos使用Spring Cloud作为服务治理的核心组件,使用Spring Boot作为开发框架。Spring Cloud提供了对Eureka、Consul等服务治理组件的支持。
- **Raft算法:Nacos使用了Raft算法作为分布式一致性算法。**Raft算法保证了分布式环境下数据的一致性,并且可以容忍节点故障。
- 数据库:Nacos使用MySQL作为存储服务注册和配置信息的数据库。
- RPC框架:Nacos使用了gRPC作为远程过程调用框架。
- Spring Cloud Gateway:Nacos使用Spring Cloud Gateway作为网关,处理所有的服务请求。
Nacos高性能实现原理
**Nacos通过使用Raft算法来实现服务列表的同步和高并发访问。**Raft算法是一种分布式一致性算法,能够保证在网络分区、服务器崩溃等异常情况下,系统仍能够保持强一致性。
**Nacos中的每个节点都是一个Raft节点,节点之间通过Raft协议进行通信和协调。**当有节点加入或离开集群时,Raft算法会自动进行选举,选出一个新的leader来负责更新服务列表,并将最新的服务列表同步给其他节点。同时,nacos使用了一些优化技术来提高同步效率和并发访问性能,包括:
- 快照技术:nacos会定期生成快照,将当前的服务列表状态保存下来,当节点重新加入集群时,可以快速恢复服务列表的状态,避免了重新同步的过程。
- 数据压缩:nacos使用了一些数据压缩算法来压缩服务列表数据,减少网络传输的数据量,提高同步效率。
- 前缀树: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方便管理。