Nacos简单了解

Nacos简单了解

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 主要作用是发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 的关键特性

服务发现和服务健康监测:Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。

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

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

服务及其元数据管理:Nacos 能从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

简单而言,Nacos就是帮助管理微服务的组件。

Nacos的实现原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u2JNkYMg-1663517995802)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172059396.png)]

1、客户端启动时会将当前服务的信息包含IP、端口号、服务名、分组名、集群名等信息封装为一个实例对象,准备向nacos服务器注册服务,在注册服务之前,会根据instance中的信息创建一个beatinfo对象(心跳检测),然后创建一个定时任务,定时向nacos服务器发送PUT请求并携带相关信息,作为定时心跳连接。服务器端在接收到心跳请求后,会去检查当前服务列表中有没有该实例,如果没有的话将当前服务实例重新注册,注册完成后立即开启一个异步任务,更新客户端实例的最后心跳时间,如果当前实例是非健康状态则将其改为健康状态;

2、心跳定时任务创建完成后,通过POST请求将当前服务实例信息注册进Nacos服务器,服务器端在接收到注册实例请求后,会将请求携带的数据封装为一个Instance对象,然后为这个服务实例创建一个服务Service,一个Service下可能有多个服务实例,服务在Nacos保存到一个ConcurrentHashMap中,格式为命名空间为key,value为map,分组名和服务名为内层map的key,value为服务数据,Map(namespace,Map(group::serviceName, Service));

3、服务创建完成之后,开启一个定时任务(5s),检查当前服务中的各个实例是否在线,如果实例上次心跳时间大于15s就将其状态设置为不健康,如果超出30s,则直接将该实例删除;

4、然后将当前实例添加到对应服务列表中,这里会通过synchronized锁住当前服务,然后分两种情况向集群中添加实例,如果是持久化数据,则使用基于CP模式的简单Raft协议,通过leader节点将实例数据更新到内存和磁盘文件中,并且通过CountDownLatch实现了一个简单的raft写入数据的逻辑,必须集群半数以上节点写入成功才会给客户端返回成功;

5、如果是非持久话实例数据,使用的是基于AP模式的Distro协议,首先向任务阻塞队列添加一个本地服务实例改变任务,去更新本地服务列表,然后在遍历集群中所有节点,分别创建数据同步任务放进阻塞队列异步进行集群数据同步,不保证集群节点数据同步完成即可返回;

6、在将服务实例更新到服务注册表中时,为了防止并发读写冲突,采用的是写时复制的思想,将原注册表数据拷贝一份,添加完成之后再替换回真正的注册表,更新完成之后,通过发布服务变化事件,将服务变动通知给客户端,采用的是UDP通信,客户端接收到UDP消息后会返回一个ACK信号,如果一定时间内服务端没有收到ACK信号,还会尝试重发,当超出重发时间后就不在重发,虽然通过UDP通信不能保证消息的可靠抵达,但是由于Nacos客户端会开启定时任务,每隔一段时间更新客户端缓存的服务列表,通过定时轮询更新服务列表。

7、服务发现:客户端通过定时任务定时从服务端拉取服务数据保存在本地缓存,服务端在发生心跳检测、服务列表变更或者健康状态改变时会触发推送事件,在推送事件中会基于UDP通信将服务列表推送到客户端,同时开启定时任务,每隔10s定时推送数据到客户端。

Nacos数据模型

Nacos由三元组唯一确定,Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sjiO1OwH-1663517995802)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172122310.png)]

命名空间

不同环境进行隔离

命令空间(namespace)可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境、和生产环境。因为它们的配置可能各不相同,或者隔离不一的用户,不同开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(group)或配置集。

配置分组(Group)

配置分组是对配置集进行分组,通过一个有意义的字符串(eg. Buy 或 Trade)来表示,不同的配置分组下可以有相同的配置集(Data Id). 当您在Nacos上创建一个配置时,如果未写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP.配置分组的常见场景,可用于区分不同的项目或应用,例如,学生管理系统 的配置集可以定义为:STUDENT_GROUP

配置集(DataId)

在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含系统的各种配置信息,例如,一个配置集可能包含了数据源、线程池,日志级别等配置项。每个配置集都可以定义一个有意义的名称,就是配置集的ID即DataId.

部署nacos配置单机模式(适用外部数据库支持配置)

下载nacos

官网的提供下载地址:https://github.com/alibaba/nacos/releases

一、安装jdk
rpm包执行rpm安装

cd /opt

rpm -qpl jdk-8u201-linux-x64.rpm  //查看安装列表

rpm -ivh jdk-8u201-linux-x64.rpm  //安装jdkrpm包

java -version //查看java版本信息确认是否安装成功

//配置环境变量

vim /etc/profile.d/java.sh

export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64

export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

export PATH=$JAVA_HOME/bin:$PATH

source /etc/profile.d/java.sh

java -version
二、配置mysql
安装mysql

之前做过,不写了

安装mysql

之前做过,不写了
mysql -uroot -p123456

CREATE DATABASE nacos_config character set utf8 collate utf8_bin;

GRANT all ON nacos_config.* TO 'nacos'@'%' IDENTIFIED BY 'nacos';
解压安装包
tar -xvf nacos-server-$version.tar.gz//解压下载的安装包

配置nacosmysql数据库

cd /opt/nacos/conf

cat nacos-mysql.sql | mysql -uroot -p123456 nacos_config

配置nacos连接数据库

vim /opt/nacos/bin/application.properties

大致35行左右:

db.num=1

db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTim  ezone=UTC

db.user.0=nacos

db.password.0=nacos

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sxq94680-1663517995803)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172207305.png)]

开启nacos
./opt/nacos/bin/startup.sh -m standalone

注:-m standalone表示单机模式运行,非集群模式

通过访问

http://x.x.x.x:8848/nacos/index.html

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iax6dwRr-1663517995803)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172214967.png)]

默认用户和密码为nacos

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RYuNoXDB-1663517995803)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172224097.png)]

Nacos集群部署

3个或3个以上Nacos节点才能构建集群

一、安装3个即以上Nacos

条件有限(单机模式演示)

我们可以复制之前已经解压好的nacos文件侠,分别使名为 nacos 、nacos1、nacos2

但是需要修改里面的监听端口号

cp -rf nacos nacos1

cp -rf nacos nacos2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CgXBmqyp-1663517995804)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172230624.png)]

进入application.properties配置文件中修改监听端口

vim nacos/conf/application.properties

server.port=8848

vim nacos1/conf/application.properties

server.port=8849

vim nacos2/conf/application.properties

server.port=8850

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMTGlGED-1663517995804)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172234679.png)]

配置集群配置文件

在所有nacos目录的 conf目录下,有文件cluster.conf.example,将其命名为cluster.conf,并将每行配置成ip:port

三个都需要修改,修改一个然后拷贝过去

\# ip:port

192.168.10.10:8848

192.168.10.10:8849

192.168.10.10:8850

cp /opt/nacos/conf/cluster.conf.example /opt/nacos/conf/cluster.conf

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s9pmSj2a-1663517995804)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172243533.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kYqf65Gx-1663517995805)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172255862.png)]

vim /opt/nacos/conf/cluster.conf

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gv9wlHCi-1663517995805)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172302669.png)]

cp /opt/nacos/conf/cluster.conf /opt/nacos1/conf/

cp /opt/nacos/conf/cluster.conf /opt/nacos2/conf/
总结:
确认数据源

使用内置数据源

无需进行任何配置

使用外置数据源

生产使用建议至少主备模式,或者采用高可用数据库。

初始化 MySQL 数据库

sql语句源文件

application.properties 配置

application.properties配置文件

(这里直接复制之前配置好的使用外部数据源的配置)
启动服务器

集群模式启动:

使用内置数据源

sh startup.sh -p embedded

使用外置数据源

sh startup.sh

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kYZI7lQL-1663517995805)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172324116.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DrQln1iC-1663517995805)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172332753.png)]

因为nacos是Java写的,需要使用jdk来运行,即使给了5G内存,仍然所以导致48849哪个节点没有开启。

服务注册、发现

1.服务注册
OpenAPI模式:

OpenAPI 的使用方式相对来说比较简单,首先打开系统的命令行,在系统命令行中使用以下命令实现服务注册:

curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=spring-cloud-nacos-producer&ip=192.168.76.224&port=8081'

以上命令的执行结果如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lJS5cWJ9-1663517995806)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172343695.png)]

当返回“ok”结果时,表示服务注册成功,其中:

serviceName:表示服务名。

ip:表示客户端程序的 IP 地址。

port:表示客户端程序的端口号。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HqcXa1Vh-1663517995806)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172353791.png)]

SDK模式

SDK 模式需要先创建一个 Spring Cloud 项目,具体配置请参考:https://nacos.io/zh-cn/docs/quick-start-spring.html,项目创建成功之后添加 Nacos 的 SDK 框架支持,最后再配置 Nacos 的相关信息即可

服务发现

服务被正确注册到 Nacos 之后,就可以通过服务发现正常的调用服务提供者暴露的方法了,它的实现方法依然有以下两种。

OpenAPI模式:

curl -X GET ‘http://192.168.10.10:8848/nacos/v1/ns/instance/list?serviceName=httpd’

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zZ8oHgoV-1663517995806)(C:\Users\15560\AppData\Roaming\Typora\typora-user-images\image-20220916172411570.png)]

{“name”:“DEFAULT_GROUP@@httpd”,“clusters”:“”,“cacheMillis”:3000,“hosts”:[{“instanceId”:“192.168.10.10#8080#DEFAULT#DEFAULT_GROUP@@httpd”,“ip”:“192.168.10.10”,“port”:8080,“weight”:1.0,“healthy”:true,“enabled”:true,“ephemeral”:true,“clusterName”:“DEFAULT”,“serviceName”:“DEFAULT_GROUP@@httpd”,“metadata”:{},“lastBeat”:1661883050461,“marked”:false,“app”:“DEFAULT”,“instanceHeartBeatInterval”:5000,“instanceIdGenerator”:“simple”,“instanceHeartBeatTimeOut”:15000,“ipDeleteTimeout”:30000}],“lastRefTime”:1661883058472,“checksum”:“48f30aeea8fff180850be9302daee2b5”,“allIPs”:false,“reachProtectionThreshold”:false,“valid”:true}[root@localhost ~]#

其中:

healthy:表示是否开启健康检测功能,也就是定期的将自己的健康状态报告给 Nacos 服务器端。

ephemeral:表示是否为临时实例,临时实例下线一段时间之后,会被 Nacos 直接剔除。

““instanceHeartBeatInterval”: 5000”:表示每 5s 执行一次健康检测。

““instanceHeartBeatTimeOut”: 15000”:表示如果超过 15s 没有收到(客户端)心跳包,就将此实例设置为非健康状态。

““ipDeleteTimeout”: 30000”:表示如果超过 30s 没有收到心跳包就剔除临时实例。

SDK模式

与 SDK 实现服务注册的步骤类似,服务发现也是先要创建 Spring Cloud 项目,然后添加 Nacos SDK 框架,再配置 Nacos 相关信息,最后编写代码来调用服务提供者提供的方法。

具体配置请参考:https://nacos.io/zh-cn/docs/quick-start-spring.html

nterval": 5000”:表示每 5s 执行一次健康检测。

““instanceHeartBeatTimeOut”: 15000”:表示如果超过 15s 没有收到(客户端)心跳包,就将此实例设置为非健康状态。

““ipDeleteTimeout”: 30000”:表示如果超过 30s 没有收到心跳包就剔除临时实例。

SDK模式

与 SDK 实现服务注册的步骤类似,服务发现也是先要创建 Spring Cloud 项目,然后添加 Nacos SDK 框架,再配置 Nacos 相关信息,最后编写代码来调用服务提供者提供的方法。

具体配置请参考:https://nacos.io/zh-cn/docs/quick-start-spring.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值