Alibaba Nacos注册中心源码剖析

news2025/1/18 20:22:33

Nacos&Ribbon&Feign核心微服务架构图

image.png
架构原理:

  1. 微服务系统在启动时将自己注册到服务注册中心,同时对外发布 Http 接口供其它系统调用(一般都是基于Spring MVC)
  2. 服务消费者基于 Feign 调用服务提供者对外发布的接口,先对调用的本地接口加上注解@FeignClient,Feign会针对加了该注解的接口生成动态代理,服务消费者针对 Feign 生成的动态代理去调用方法时,会在底层生成 Http 协议格式的请求,类似/stock/deduct?productId=100
  3. Feign 最终会调用 Ribbon 从本地的 Nacos 注册表的缓存里根据服务名取出服务提供者机器的列表,然后进行负载均衡并选择一台机器出来,对选出来的机器 IP 和端口拼接生成url请求,再生成调用的 Http 接口地址 [http://192.168.0.60:9000/stock/deduct?productId=100](http://192.168.0.60:9000/stock/deduct?productId=100),最后基于 HTTPClient 调用请求

Nacos 架构图

image.png

Nacos 核心功能点

  • 服务注册

Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。

  • 服务心跳

在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。

  • 服务健康检查

Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会被发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)。

  • 服务发现

服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存。

  • 服务同步

Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。

Nacos 核心功能源码架构图

Nacos服务注册表结构:Map<namespace, Map<group::serviceName, Service>>
// TODO 整理中

Nacos 服务端源码单机运行

# 下载nacos源码
git clone https://github.com/alibaba/nacos.git

选择Tag 1.4.1版本,对应的地址:[https://github.com/alibaba/nacos/tree/1.4.1](https://github.com/alibaba/nacos/tree/1.4.1)
源码整体结构(注意,nacos源码导入要求maven 3.2.5以上版本):
image.png
1、源码单机运行
直接运行console模块里的 com.alibaba.nacos.Nacos.java(该启动类可以通过 shell 启动命令 nacos/bin/startup.sh 中找到)

# 增加启动vm参数
-Dnacos.standalone=true 

image.png
2、源码集群运行
nacos集群需要配置mysql存储,需要先创建一个数据,名字随便取,然后执行 distribution/conf 目录下的 nacos-mysql.sql 脚本,然后修改 console\src\main\resources 目录下的 application.properties 文件里的mysql配置,如下所示:

### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

运行console模块里的 com.alibaba.nacos.Nacos.java,需要增加启动vm参数端口号和实例运行路径nacos.home(对应的目录需要自己提前创建好),每台server的nacos.home目录里需要创建一个conf文件夹,里面放一个cluster.conf文件,文件里需要把所有集群机器ip和端口写入进去,见下图:
image.png
image.png
image.png

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

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

相关文章

如何零基础自学AI人工智能

随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;越来越多的有志之士被其强大的潜力所吸引&#xff0c;希望投身其中。然而&#xff0c;对于许多零基础的人来说&#xff0c;如何入门AI成了一个难题。本文将为你提供一份详尽的自学AI人工智能的攻略&#xff0c;帮…

彩色年终工作总结汇报PPT模板下载

这是一套彩色年终工作总结汇报PPT模板&#xff0c;共27页&#xff1b; PPT模板封面&#xff0c;使用了红黄蓝色块、网格背景。中间填写年终工作总结汇报PPT标题。界面为简约商务风格。 PowerPoint模板内容页&#xff0c;由25张彩色动态幻灯片图表&#xff0c;搭配PPT文字排版…

HTTP 到 HTTPS 再到 HSTS 的转变

近些年&#xff0c;随着域名劫持、信息泄漏等网络安全事件的频繁发生&#xff0c;网站安全也变得越来越重要&#xff0c;也促成了网络传输协议从 HTTP 到 HTTPS 再到 HSTS 的转变。 HTTP HTTP&#xff08;超文本传输协议&#xff09; 是一种用于分布式、协作式和超媒体信息系…

【入门篇】1.5 redis 客户端Jedis和Lettuce对比详解

文章目录 0. 前言1. Lettuce 与Jedis 对比2.详解2.1 线程安全2.2 阻塞/非阻塞2.3 集群支持2.4 PUB/SUB模型2.5 二进制协议 3. 参考资料 0. 前言 对于Java开发者来说&#xff0c;Jedis和Lettuce是两种非常常见的Redis客户端&#xff0c;他们可以帮助开发者更容易地在Java应用中…

重生之我是一名程序员 34

哈喽啊大家晚上好&#xff01; 今天给大家带来的知识是——库函数qsort。首先&#xff0c;给大家介绍一下qsort函数&#xff0c; qsort函数是C标准库中的一种排序函数&#xff0c;用于对数组中的元素进行快速排序。它接受四个参数&#xff1a;待排序数组的基地址&#xff0c;数…

解决:微软在登录时总是弹出需要家长或监护人同意才能使用该账户并且不断循环?

目录 问题来源&#xff1a; 解决办法&#xff1a; 问题来源&#xff1a; 我的edge浏览器账号登录&#xff0c;一直弹出来需要家长或监护人同意才能使用&#xff0c;然后按照提示操作&#xff0c;会一直循环&#xff0c;是个无穷循环。 解决办法&#xff1a; 参考&#xff1…

计算机算法分析与设计(23)---二分搜索算法(C++)

文章目录 1. 算法介绍2. 代码编写 1. 算法介绍 1. 二分搜索&#xff08;英语&#xff1a;binary search&#xff09;&#xff0c;也称折半搜索&#xff08;英语&#xff1a;half-interval search&#xff09;、对数搜索&#xff08;英语&#xff1a;logarithmic search&#xf…

MFC 常用控件

目录 一、控件的交互方式 二、CButton/CheckBox/RadioButton 三、EditControl 四、ListBox 五、ComBox 六、Progress/Timer 七、PictureController 八、ListControl 九、Tree 一、控件的交互方式 得到控件的类的对象&#xff0c;就可以通过这个对象来操作类 CWnd* G…

计算机毕业设计 基于SpringBoot的车辆网位置信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【入门篇】1.4 redis 客户端 之 Lettuce 详解

文章目录 1. 简介1. 什么是Lettuce2. Lettuce与其他Redis客户端的比较3. Lettuce的特性和优势 2. 安装和配置3. 连接池配置1. 什么是连接池2. Lettuce的连接池使用与配置3. 连接池配置项 4. 基本操作1. 如何创建Lettuce连接2. Lettuce的基本操作如增删改查3. Lettuce的事务操作…

Halcon (2):Halcon基础知识

文章目录 文章专栏视频资源前言Halcon文档案例学习结论 文章专栏 Halcon开发 视频资源 机器视觉之C#联合Halcon 前言 本章我们主要讲解Halcon的基础语法 Halcon文档 按下F1&#xff0c;就可以看到Halcon的文档&#xff0c;不过都是纯英文的 如果不清楚参数如何使用&#x…

十三、Docker的安装

0.安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道…

异地工业设备集中运维、数据采集,一招搞定

为了提升运维效率&#xff0c;能够及时发现和响应设备的故障、异常和潜在问题。 越来越多的企业都在搭建“集中式”的远程智慧运维体系&#xff0c;以提高运维效率和降低成本。 异地工业设备远程运维&#xff0c;提升响应效率、降低运维成本 以国内陕西某机床公司为例&#xff…

Buildroot 添加 Qt 支持

Buildroot 添加 Qt 支持 lqonlylove 于 2022-12-03 13:37:34 发布 阅读量2.8k 收藏 12 点赞数3 分类专栏: 根文件系统制作 文章标签: qt buildroot 版权 ​编辑根文件系统制作专栏收录该内容 2 篇文章0 订阅 订阅专栏 一、制作根文件系统 Buildroot 制作根文件系统_l…

【IT杂谈】--数据中台和BI项目失败的原因分析--以M集团传统制造业为例

“我们这个BI怎么做成这副鸟样&#xff0c;他们还想要钱&#xff0c;我们的尾款是不可能付的。”这是我在G集团听到财务总监的抱怨。感觉类似于这种吐槽BI的话&#xff0c;我经常能够听到的。我正在经历第四家公司&#xff0c;有三家公司都上了BI分析平台&#xff0c;但是效果都…

plantuml最原始的主题如何设置

在startuml下一行添加 skin rose startuml skin rose:Hello world; :This is defined on several **lines**;enduml 效果如下&#xff1a; plantuml官网地址如下&#xff1a; ​​​​​​使用简单的文字描述画UML图的开源工具。轻松从简单的文字说明创建UML图。也有许多种可…

信号的机制——信号的发送与处理

对于硬件触发的&#xff0c;无论是中断&#xff0c;还是信号&#xff0c;肯定是先到内核的&#xff0c;然后内核对于中断和信号处理方式不同。一个是完全在内核里面处理完毕&#xff0c;一个是将信号放在对应的进程 task_struct 里信号相关的数据结构里面&#xff0c;然后等待进…

Leetcode—剑指Offer LCR 140.训练计划II【简单】

2023每日刷题&#xff08;三十三&#xff09; Leetcode—LCR 140.训练计划II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* trainingPlan(struct ListNode* head, int cnt) {str…

【好奇心驱动力】ESP8266驱动SG90舵机开关灯

0.前言 ESP8266弄丢了好几个都忘记放在哪&#xff0c;重新买了个typeC接口的方便多了&#xff0c;看到驱动SG90舵机作为智能开关&#xff0c;简单复现了一下&#xff0c;代码比较简单&#xff0c;没有连接小爱同学或者其他语音助手。 1.实验方法 ESP8266连接SG90舵机&#x…

Java中的集合内容总结——Collection接口

集合概述 Java 集合可分为 Collection 和 Map 两大体系&#xff1a; Collection接口&#xff1a;用于存储一个一个的数据。 List子接口&#xff1a;用来存储有序的、可以重复的数据&#xff08;主要用来替换数组&#xff0c;"动态"数组&#xff09; 实现类&#xf…