Nacos使用和注册部分源码介绍

news2024/12/24 3:51:25

Nacos简单介绍

Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
接下来主要介绍Nacos作为注册中心的使用和注册部分的源码解析。

Nacos安装

Nacos预装环境

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境这里就不介绍Maven和Java安装,大家自行安装一下。

安装的方式主要有两种:
  1. 从GitHub上下载源码安装:
//下载源码的地址
git clone https://github.com/alibaba/nacos.git
cd nacos/
//编译源码
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/
//进入编译包
cd distribution/target/nacos-server-$version/nacos/bin

2.下载安装包的形式:

tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
启动服务器

启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone
关闭服务器
sh shutdown.sh
单机环境下使用Mysql:

在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:

  1. 安装数据库,版本要求:5.6.5+
  2. 初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
  3. 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456

对于单机来说我们就是玩个demo是够的,但是对于生产来说我们就要考虑高可用的方案了:
对于集群部署的方式如果在虚拟机环境就采用Nagix负载3台虚拟机,对于K8S的环境通过Service负载3台Pod的形式搭建高可用环境,对于数据库选择来说最好采用主从结构,保证数据库的高可用。
整体的部署可能如下;


下图就是搭建好以后的整体界面:

Nacos使用

1.创建一个Spring Boot空应用

2.编辑pom.xml文件

    <properties>
        <springboot.vetsion>2.2.11.RELEASE</springboot.vetsion>
        <spring-cloud-version>Hoxton.SR9</spring-cloud-version>
        <spring-cloud-alibaba-version>2.2.3.RELEASE</spring-cloud-alibaba-version>
    </properties>
<dependencyManagement>
    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${springboot.vetsion}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>     
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

3.创建应用的启动项目

@SpringBootApplication(scanBasePackages = {"com.springcloud.study"})
@EnableDiscoveryClient
public class SystemApplication {

    public static void main(String[] args) {
        SpringApplication.run(SystemApplication.class, args);
    }
}

4.配置application.yaml文

server:
  port: 8081
spring:
  application:
    name: system
  # 数据源配置项
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/study_user?useSSL=false&useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 123456
  #nacos基础配置
  cloud:
    nacos:
      discovery:
        server-addr: 10.226.73.115:8886
        #环境选择
        #namespace: b7d341fc-df29-45ce-b3cd-4415f66b1ee0

5.启动项目

Nacos注册部分源码分析

客户端通过Rest接口式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。 Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。对于注册部分的源码整体上分为两部分:

客户端注册源码

按照Spring Boot Starter的习惯,我们首先找到spring-cloud-starter-alibaba-nacos-discovery启动项,如下图所示:


标红部分的NacosServiceRegistryAutoConfiguration是我们注册部分关注的类,首先我们看下该类的整体的继承结构:
 


重点关注AbstractAutoServiceRegistration接口,NacosAutoServiceRegistration该Bean的注入就是我们注入开始的:
 


整体看下该类,基本上是对AbstractAutoServiceRegistration继承和实现,该类位于spring-cloud-common这个jar下面,Spring Cloud Commons模块是为了对微服务中的服务注册与发现、负载均衡、熔断器等功能提供一个抽象层代码,这个抽象层与具体的实现无关。这样这些功能具体的实现上可以采用不同的技术去实现,并可以做到在使用时灵活的更换。
NacosAutoServiceRegistration内部存在一个@EventListener注解,@EventListener是一种事件驱动编程在spring4.2的时候开始有的,可以理解为ApplicationListener接口的扩展,方便我们使用,可以理解为Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式;为的就是业务系统逻辑的解耦,提高可扩展性以及可维护性。事件发布者并不需要考虑谁去监听,监听具体的实现内容是什么,发布者的工作只是为了发布事件而已。
 


接下来我们重点看下AbstractAutoServiceRegistration内部start方法,
 


register的具体的实现类是NacosServiceRegistry,内部调用NacosNamingService的registerInstance方法,该方法内部通过调用NamingProxy的reqApi,通过NacosRestTemplate请求服务端的/instance方法注册到服务端。
 


 


至此完成了客户端注册到服务端,下图是整体的时序图:

服务端注册部分

服务端注册相对比较复杂一点,这块需要将Nacos源码下载一下,找到naming模块,InstanceController就是我们调用服务端的接口,如下图所示:


接下来重点看下ServiceManager的registerInstance的方法,如下图:
 


首先看下createEmptyService方法,该方法目的双肩一个双层的Map对象,用于存储注册应用的信息,整体的结构Map(namespace, Map(group::serviceName, Service)),这里正好对应注册中心介绍时候的张图,我们整体在看一下:
 


 


初始化的注册表结构以后,接下来就是将应用的信息注册添加到注册表中,主要分为两步如下图:
 


addIpAddresses就是获取当前注册服务的所有ip,整体的流程如下图:
 


这里的主要的重点是put方法,这里我们全部按照CP的场景去解释,AP的场景在未来的章节补充,CP的实现类是DistroConsistencyServiceImpl,如下图:
 


通过把需要注册到注册表的服务添加到阻塞队列当中,Notifier本质上一个线程,然后通过执行run内部的hander方法,如下图:
 


通过调用Service的onChange方法来变更注册表的信息,内部主要通过updateIPs完成注册表信息的表更,主要也是采用CopyOnWrite的思想,如下图:
 


到此服务端的注入就完成了,这个里面整体上有三处亮点:
1.CopyOnWrite的思想的广泛应用;
2.通过阻塞队列实现异步任务提升系统性能,并且解决并发写入问题;
3.观察者设计的广泛应用;
 

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

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

相关文章

社群团购对接,【概率思维】可以增加你做项目的成功率!

社群团购对接&#xff0c;【概率思维】可以增加你做项目的成功率&#xff01; 今天来聊一个关于概率的问题&#xff0c;我们不管去做社群团购项目、做流量&#xff0c;还是做销售&#xff0c;我们都要有概率思维&#xff0c;有了这个思维以后&#xff0c;就可以增加你的成功率…

input输入框从右边开始输入,光标靠左移动

未设置前 光标在左边 <input type"number" placeholder"请输入分润数量" placeholder-class"shareprofit_placeholder_num" v-model"money">设置后 光标在右边 <input type"number" placeholder"请输入分润数…

C#开发的OpenRA游戏之调试菜单1

C#开发的OpenRA游戏之调试菜单1 在开发一个游戏里,经常需要提供一些调试设置,以便快速地达到需要测试的阶段,否则按正常游戏的进程,就会需要比较久的时间,这样浪费开发人员的时间。 在OpenRA提供一个调试菜单,它就是在下面的界面里: 这个菜单叫做 Debug Menu,当玩家点…

关于游戏开发,还有这些信息你可能不知道

游戏开发是一个复杂而令人兴奋的领域&#xff0c;有许多人不知道的有趣事实和趋势。以下是一些可能令你感兴趣的游戏开发领域的事实&#xff1a; 游戏开发是巨大的产业&#xff1a; 游戏产业已经成为世界上最大的娱乐产业之一&#xff0c;超过电影和音乐产业。这包括移动游戏、…

综合续航达1040公里:腾势计划2024年在香港上市,售价60-100 万

腾势汽车表示&#xff0c;他们计划于2024年在香港地区上市全新的D9车型。这款中大型高端新能源MPV是通过DM-i超级混动技术打造的&#xff0c;由于综合续航能力达到1040公里&#xff0c;且纯电续航最大可达190公里&#xff0c;这款车已经引起了广泛关注。据腾势销售事业部总经理…

华为云云耀云服务器L实例评测|教你如何使用云服务器L实例

目录 一、为什么选择华为云云耀云服务器L实例1、智能不卡顿2、价优随心用3、上手更简单4、管理特省心 二、服务器快速上手1、注册账号2、查看华为云耀云服务器L实例产品信息3、购买4、查看服务器详情5、远程登录6、通过第三方终端连接 三、宝塔面板管理服务器 本篇文章给大家分…

分享一个宝贝,如果你对新奇世界感兴趣,这个绝对不能错过

昨晚没怎么睡好&#xff0c;迷迷糊糊到天亮&#xff0c;6点多起床后反思&#xff0c;应该是因为今天周一&#xff0c;要上班&#xff0c;所以晚上没睡好&#xff0c;好像这叫“周一综合症”&#xff0c;即不想上班。 周末两天其实也没做啥&#xff0c;翻完小说《动物农场》&…

「AIGC」智能美学,AI绘画 API 激发无限创意

引言 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI绘画 API 正在以惊人的速度改变艺术创作的面貌。它不仅为艺术家和创作者提供了全新的创作工具&#xff0c;还激发了无限的创意和想象力。在这个智能美学的时代&#xff0c;让我们一起探索 AI 绘画 AP…

Three.js-矩形块shader

自定义shader代码在文末 调用方式&#xff1a; new AudioMaterial({ row: 10,column: 5,start: new Color("#00CC99"),end: new Color("#d3039c"),brightness: "(p.y < fft && p.y > fft -0.1)" })就是这样 这样 默认不传递fre…

Neo4j安装教程及版本匹配

Neo4j简介 Neo4j是基于java的图形数据库&#xff08;即环境中需预先安装jdk&#xff0c;jdk8是免费的&#xff0c;但是jdk11及更高的版本是收费的&#xff09;&#xff1b;开源&#xff1b;NoSQL(非关系型数据库) windows环境中neo4j与jdk版本的对应关系 neo4j版本jdk版本3.58…

AUTOSAR-UDS诊断

目录 一.AutoSAR 诊断功能概述 二.UDS 服务分类 诊断报文格式 &#xff08;1&#xff09;带有子服务的请求报文 &#xff08;2&#xff09;不带子服务的请求报文 &#xff08;3&#xff09;含有子服务正响应报文 &#xff08;4&#xff09;不含子服务正响应报文 &#…

无涯教程-JavaScript - PMT函数

描述 PMT功能基于固定的还款额和固定的利率来计算贷款的还款额。 语法 PMT (rate, nper, pv, [fv], [type])争论 Argument描述Required/OptionalRateThe interest rate for the loan.RequiredNperThe total number of payments for the loan.RequiredPv 现在的价值,或一系列…

1462. 课程表 IV

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;Floyd传递闭包方法二&#xff1a;拓扑排序 思考写在最后 Tag 【拓扑排序】【传递闭包】【并查集】【数组】 题目来源 1462. 课程表 IV 题目解读 给你一个表示课程先决条件的数组 prerequisites&#xff0c;prerequis…

LeetCode:88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组…

【深度学习】实验09 使用Keras完成线性回归

文章目录 使用Keras完成线性回归1. 导入Keras库2. 创建数据集3. 划分数据集4. 构造神经网络模型5. 训练模型6. 测试模型7. 分析模型 附&#xff1a;系列文章 使用Keras完成线性回归 Keras是一款基于Python的深度学习框架&#xff0c;以Tensorflow、Theano和CNTK作为后端&#…

AlwaysOn-关于读写分离的误区(一)

前言 很多人认为AlwaysOn在同步提交模式下数据是实时同步的&#xff0c;也就是说在主副本写入数据后可以在辅助副本立即查询到。因此期望实现一个彻底的读写分离策略&#xff0c;即所有的写语句在主副本上&#xff0c;所有的只读语句分离到辅助副本上。这是一个认知误区&#x…

多要素气象站:推动气象监测进入智能化新时代

一、多要素气象站概述 多要素气象站是一种集成了多种气象监测要素的自动化气象站&#xff0c;可实现对温度、湿度、风速、风向、气压、太阳辐射等多项气象参数的实时监测。相较于传统气象站&#xff0c;多要素气象站体积更小、能耗更低&#xff0c;且具备更高的测量精度和更广…

高精度加法[大整数运算]

这里只有大整数运算,浮点数相对来说很少使用到 前言 如果使用C内置的类型来存储大整数(位数有几万位),是会溢出的,得不到正确的值,即使是long long int类型的范围也只是[-9*10^19,9*10^19](无符号是[0,10^20]),所能存储的最大数字也就20位,所以需要高精度算法,高精度加法具体…

人脸签到系统 pyQT+数据库+深度学习

一、简介 人脸签到系统是一种基于人脸识别技术的自动签到和认证系统。它利用计算机视觉和深度学习算法来检测、识别和验证个体的面部特征&#xff0c;以确定其身份并记录其出现的时间。这个系统通常用于各种场景&#xff0c;包括企业、学校、会议、活动和公共交通等&#xff0c…

海格里斯HEGERLS托盘式四向穿梭车系统核心技术有哪些?

四向穿梭车立体仓库是常见的自动化立体库解决方案&#xff0c;可以应用在不规则、异型、长宽比较大或者少品种大批量、多品种大批量的仓库。其核心设备四向穿梭车克服了环形穿梭车的缺点&#xff0c;具有很高的灵活性和柔性。对于大型的立体库系统&#xff0c;四向穿梭车具有很…