文章目录
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