Nacos原理(注册中心和配置中心)

news2024/11/24 14:43:01

服务注册中心本质上是为了解耦服务提供者和服务消费者。对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的。更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数量和分布往往是动态变化的,也是无法预先确定的。因此,原本在单体应用阶段常用的静态LB机制就不再适用了,需要引入额外的组件来管理微服务提供者的注册与发现,而这个组件就是服务注册中心。

CAP理论

CAP理论是分布式架构中重要理论

一致性(Consistency) (所有节点在同一时间具有相同的数据)

可用性(Availability) (保证每个请求不管成功或者失败都有响应)

分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

1.什么是Nacos

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。是Spring Cloud A 中的服务注册发现组件,类似于Consul、Eureka,同时它又提供了分布式配置中心的功能,这点和Consul的config类似,支持热加载。

Nacos 服务注册需要具备的能力:

  • 服务提供者把自己的协议地址注册到Nacos server
  • 服务消费者需要从Nacos Server上去查询服务提供者的地址(根据服务名称)
  • Nacos Server需要感知到服务提供者的上下线的变化
  • 服务消费者需要动态感知到Nacos Server端服务地址的变化

  作为注册中心所需要的能力大多如此,我们需要做的是理解各种注册中心的独有特性,总结他们的共性。

Nacos的实现原理:

  下面我们先来了解一下 Nacos 注册中心的实现原理,通过下面这张图来说明。

  图中的流程是大家所熟悉的,不同的是在Nacos 中,服务注册时在服务端本地会通过轮询注册中心集群节点地址进行服务得注册,在注册中心上,即Nacos Server上采用了Map保存实例信息,当然配置了持久化的服务会被保存到数据库中,在服务的调用方,为了保证本地服务实例列表的动态感知,Nacos与其他注册中心不同的是,采用了 Pull/Push同时运作的方式。

2.Nacos原理

Nacos注册中心分为server与client,server采用Java编写,为client提供注册发现服务与配置服务。而client可以用多语言实现,client与微服务嵌套在一起,nacos提供sdk和openApi,如果没有sdk也可以根据openApi手动写服务注册与发现和配置拉取的逻辑

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

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

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

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

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

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

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

Nacos 服务注册与订阅的完整流程

Nacos 客户端进行服务注册有两个部分组成,一个是将服务信息注册到服务端,另一个是像服务端发送心跳包,这两个操作都是通过 NamingProxy 和服务端进行数据交互的。

Nacos 客户端进行服务订阅时也有两部分组成,一个是不断从服务端查询可用服务实例的定时任务,另一个是不断从已变服务队列中取出服务并通知 EventListener 持有者的定时任务。

服务领域模型

Nacos的注册发现是一种三层模型: 即 服务--集群--实例

Nacos服务领域模型主要分为命名空间、集群、服务。在下图的分级存储模型可以看到,在服务级别,保存了健康检查开关、元数据、路由机制、保护阈值等设置,而集群保存了健康检查模式、元数据、同步机制等数据,实例保存了该实例的ip、端口、权重、健康检查状态、下线状态、元数据、响应时间。

3.注册中心原理

服务注册方法:以Java nacos client v1.0.1 为例子,服务注册的策略的是每5秒向nacos server发送一次心跳,心跳带上了服务名,服务ip,服务端口等信息。同时 nacos server也会向client 主动发起健康检查,支持tcp/http检查。如果15秒内无心跳且健康检查失败则认为实例不健康,如果30秒内健康检查失败则剔除实例。

4.配置中心原理

5.Nacos 的关键特性包括:

服务发现和服务健康监测

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用

原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO

或HTTP&API查找和发现服务。

Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层

(如 HTTP、MySQL、用户自定义)的健康检查。对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos

提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos

还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

动态配置服务

动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

动态 DNS 服务 动态 DNS

服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以

DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

服务及其元数据管理 Nacos

能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的

SLA 以及最首要的 metrics 统计数据。

Nacos 服务发现产品对比

Nacos除了服务的注册发现之外,还支持动态配置服务。动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

一句话概括就是Nacos = Spring Cloud注册中心 + Spring Cloud配置中心。

面试分析

为什么要将服务注册到nacos?(为了更好的查找这些服务)

在Nacos中服务提供者是如何向Nacos注册中心(Registry)续约的?(5秒心跳)

对于Nacos服务来讲它是如何判定服务实例的状态?(检测心跳包,15,30)

服务启动时如何找到服务启动注册配置类?(NacosNamingService)

服务消费方是如何调用服务提供方的服务的?(RestTemplate)

@Bean注解的作用?(一般用于配置类内部,描述相关方法,用于告诉spring此方法的返回值要交给spring管理,bean的名字默认为方法名,假如需要指定名字可以@Bean(“bean的名字”),最多的应用场景是整合第三方的资源-对象)

@Autowired注解的作用?(此注解用于描述属性,构造方法,set方法等,用于告诉spring框架,按找一定的规则为属性进行DI操作,默认按属性,方法参数类型查找对应的对象,假如只找到一个,则直接注入,类型多个时还会按照属性名或方法参数名进行值的注入,假如名字也不同,就出报错.)

Nacos中的负责均衡底层是如何实现的?(通过Ribbon实现,Ribbon中定义了一些负载均衡算法,然后基于这些算法从服务实例中获取一个实例为消费方法提供服务)

Ribbon 是什么?(Netflix公司提供的负载均衡客户端,一般应用于服务的消费方法)

Ribbon 可以解决什么问题? (基于负载均衡策略进行服务调用, 所有策略都会实现IRule接口)

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

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

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

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

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

相关文章

【面试系列】如何保证接口的幂等性

为什么需要实现幂等性 在接口调用时一般情况下都能正常返回信息不会重复提交,不过在遇见以下情况时可以就会出现问题,如: 前端重复提交表单:在填写一些表格时候,用户填写完成提交,很多时候会因网络波动没…

C++之编译链接

目录 线程基础静态链接静态链接装载与动态链接库与运行库 关于隔离: 物理地址是实在存在的虚拟地址是虚拟的,并不存在,每个进程都有自己独立的虚拟空间,而且每个进程只能访问自己的地址空间,这样就有效地做到了进程的…

字符设备驱动开发

1、字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节 流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI, LCD 等等都是字符设备&#xff0c…

不断积累,步步高升:记录我的Python学习历程-python中f-string介绍

最近在看python基础的时候,又发现一个之前没怎么掌握的字符串格式化的小技巧,f-string f-string 格式化 f-string是Python3.6引入的一种字符串格式化方式,它提供了一种简洁、直观的方式来将变量值嵌入到字符串中。在 f-string 中,…

2022 Hubei Provincial Collegiate Programming Contest B. Potion(easy version)

题目链接 Output For each testcase, if Twilight Sparkle couldn’t make the specific mixture, print a single integer: −1. Otherwise, print the minimum number of operation 1 to do that. Example input 3 3 5 1 1 2 6 1 1 5 7 1 1 output 4 3 -1 题目大意 题目保证…

顺序表---(数据结构的开始)

目录 前言: 1.线性表的性质 2.静态数组or动态数组 2.1静态数组 2.2动态数组 3.结构体的创建 4*接口函数的详细讲解 4.1初始化结构体 4.2尾插 4.3打印数据 4.4用完后销毁创建的堆空间 4.5 尾删 4.6头插 4.7头删 4.8查找 4.9任意位置插入 4.10任意位…

正则表达式规则

元字符: 正则表达式主要依赖于元字符。 元字符不代表他们本身的字面意思,他们都有特殊的含义。一些元字符写在方括号中的时候有一些特殊的意思。以下是一些元字符的介绍: 运算符优先级: 正则表达式从左到右进行计算,…

idea一些不常见但是非常有用的sql

1.这个功能适合生产环境遇到故障,然后本地,但是前提是jvm配置了如下参数,还有一个就是要保证线上代码和本地的一致,这样就可以本地调式远程代码 在linux 运行 java -agentlib:jdwptransportdt_socket,servery,suspendn,address500…

牛客 BM19 寻找峰值

描述 给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于 2.假设 nums[-1] nums[n] -∞ 3.对于所有…

中台产品经理01:中台落地工具MSS模型

众所周知,每家企业的内部经营管理都是大相径庭的,就算相同行业的两家企业其内部也会有显著的特殊性,因此企业对于自身中台的建设需求也一定是不同的,可以说中台建设必须是为企业量身定制的。 而在每家企业的中台建设中&#xff0…

Visual Studio 2022 搭建GLFW OpenGL开发环境

最近工作需要 需要写一个全景的视频播放器 网上搜了下大概解决方案是 ffmpegopengl b站有很多视频 按照视频 搭建了OpenGL的开发环境 先去GLFW的网站下载 windows平台的库文件 为什么使用GLFW 因为GLFW是跨平台的 我下的是64位版本解压后有目录如下 包含了动态库和静态…

医院不良事件管理系统源码,PHP语言开发,填写上报、流转审批、发生原因分析定位

医疗安全不良事件管理系统源码提供不良事件的上报、事件审核处理、时间按分析、事件跟踪与持续改进,事件提醒、权限控制、外部上报等功能。从报告内容填写上报、流转审批、发生原因分析定位、处置对策的制定、统计汇总等方面,提供了不良事件处理的全过程…

[Leetcode] 0705. 设计哈希集合

705. 设计哈希集合 English Version 题目描述 不使用任何内建的哈希表库设计一个哈希集合(HashSet)。 实现 MyHashSet 类: void add(key) 向哈希集合中插入值 key 。bool contains(key) 返回哈希集合中是否存在这个值 key 。void remove(key) 将给定值 key 从哈希集…

这些神仙问题,整垮了chatGpt

垮掉,全部垮掉 今天刚上了一个chat聊天功能,网友们就不甘落后,纷纷展示了自己的技能。分分钟给我整垮了。 神仙问题 玉皇大帝住在平流层还是对流层?空腹的时候可以吃饭吗?自来水不能直接喝,那么用自来水…

CAD二次开发--根据内部点识别最近外部边界范围即boundary命令代码实现(含源码)

在AutoCAD中我们知道使用Boundary(BO)命令可以快速找到内部点附近的最近边界范围(通常要求闭合)。然而网上很多文章却停留在如何用BO命令,并没有讲如何用代码去实现!本文将实现代码贴出来并进行简单介绍。 先看下实现效果图吧! 该功能在某些时候还是具备一定的实…

yolov8 浅记

目录 Pre: 1. YOLOv8 概述 2. 模型结构设计 3. Loss 计算 4.训练数据增强 5. 训练策略 6、部署推理 End Pre: yolo系列发布时间: 先贴一下yolo各系列的发布时间(说出来很丢人,我以为 yolox是 最新的): yoloX 2…

【leetcode刷题】2659. 将数组清空(树状数组初体验)

目录 题目截图题目分析ac code树状数组模版树状数组总结 题目截图 题目分析 直接模拟的话就是平方复杂度,会超时间复杂度我们删掉一个最小的,然后就要删次小的,如何找到其中间隔的距离呢?间隔中可能有一些又被删掉了?…

循环队列、双端队列

循环队列、双端队列 1. 循环队列1.1 循环队列1.2 代码实现1.3 力扣622. 设计循环队列2. 双端队列 1. 循环队列 1.1 循环队列 特殊的队列,首尾相连,空间可重复利用;环形队列常使用数组实现,且为了方便队列的判空、判满处理&#x…

二十七、BGP技术总结

文章目录 BGP:边界网关路由协议(Border Gateway Protocol)概述1、路由协议分类1.1、IGP:Interior Gateway Protocol(内部网关协议)1.2、EGP:Exterior Gateway Protocol(外部网关协议…

人机智能中几个困难问题浅析

1、人机之间与人人之间信任的区别人机之间的信任与人人之间的信任存在以下异同:①信任对象。人机之间的信任的对象是计算机系统、算法、机器人等,而人人之间的信任的对象是其他人。②信任方式。人机之间的信任是基于技术、安全协议等建立的,例…