前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >打造企业级自动化运维平台系列(十二):服务发现与配置管理平台 Nacos 详解

打造企业级自动化运维平台系列(十二):服务发现与配置管理平台 Nacos 详解

作者头像
民工哥
发布2024-01-18 16:02:56
8480
发布2024-01-18 16:02:56
举报
文章被收录于专栏:民工哥技术之路

Nacos 概述

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

Nacos 致力于帮助用户发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,能够快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 可以更敏捷和容易地构建、交付和管理微服务平台。Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

Nacos 架构

Nacos 核心功能

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

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

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

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

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

Nacos 流程解析

  • 1、客户端启动时会将当前服务的信息包含ip、端口号、服务名、分组名、集群名等信息封装为一个Instance对象,准备向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 安装

下载

下载地址:https://github.com/alibaba/nacos/tags

解压
代码语言:javascript
复制
#进入压缩包所在的文件夹:
[root@localhost ~]# cd /usr/upload
#把文件解压到/user/local目录下:
[root@localhost upload]# tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local 
启动和关闭
启动
代码语言:javascript
复制
#进入nacos的bin包:
[root@localhost local]# cd nacos/bin/
#非集群模式启动:
[root@localhost bin]# ./startup.sh -m standalone
关闭
代码语言:javascript
复制
[root@localhost bin]# ./shutdown.sh
测试

查看Linux的IP地址:

代码语言:javascript
复制
[root@localhost bin]# ifconfig

浏览器访问:http://192.168.204.156:8848/nacos,默认用户名/密码为:nacos/nacos。

Nacos持久化

为什么持久化?

Nacos默认有自带嵌入式数据库derby,但是如果做集群模式的话,就不能使用自己的数据库不然每个节点一个数据库,那么数据就不统一了,需要使用外部的mysql。

配置Nacos持久化
切换数据库

修改application.properties

代码语言:javascript
复制
vim /usr/local/nacos/conf/application.properties:

增加支持mysql数据源配置(目前只支持mysql,版本要求:5.6.5+)

代码语言:javascript
复制
### If use MySQL as datasource:
spring.datasource.platform=mysql

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

### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.31.19:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=1111
初始化数据库

创建nacos数据库并导入sql。

测试

重启nacos测试nacos所有写到嵌入式数据库的数据是否都写到了mysql:

Nacos集群

部署架构图
  • 1、如何把请求平均分配?使用nginx
  • 2、为甚么是3台?投票选举leader
  • 3、如何同步数据?leader
集群
节点规划
配置集群

1.找到conf/cluster.conf.example ,将其改名为 conf/cluster.conf ,并将内容改为如下:

代码语言:javascript
复制
# ip:port
192.168.209.129:8848
192.168.209.129:8849
192.168.209.129:8850

2.复制三份Nacos

代码语言:javascript
复制
[root@localhost bin]# cd /usr/local
新建文件夹命令
[root@localhost java]# mkdir nacos_cluster
复制文件夹命令
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8848
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8849
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8850

3.将 conf/application.properties 中的端口号分别改为:

代码语言:javascript
复制
nacos_8848的叫8848,下面的两个以此类推
server.port=8848
server.port=8849
server.port=8850
配置代理服务
安装nginx
代码语言:javascript
复制
#安装nginx的依赖库
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

#下载nginx
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz

#解压安装包
tar -zxvf nginx-1.12.0.tar.gz

#配置nginx安装包
cd nginx-1.12.0
./configure --prefix=/usr/local/nginx

#./configure配置nginx安装到/usr/local/nginx目录下
#编译并安装
make && make install
配置nginx代理nacos

修改nginx.conf:

代码语言:javascript
复制
#新建一个参数
upstream nacos {
  server 192.168.209.129:8848;
  server 192.168.209.129:8849;
  server 192.168.209.129:8850;
}
#修改server.location
server {
  listen 80;
  server_name  localhost;
  location / {
    proxy_pass http://nacos;
  }
}
测试nginx
代码语言:javascript
复制
#进入nginx工具包
cd /usr/local/nginx/sbin

#开启
./nginx

#关闭
./nginx -s stop

#重启
./nginx -s reload

#查看状态
ps -ef | grep nginx

#同理,也可以使用这个命令查看nacos:
ps -ef | grep nacos
测试
启动nacos集群
代码语言:javascript
复制
[root@localhost upload]# cd /usr/local/nacos_cluster/nacos_8848/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8849/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8850/bin
[root@localhost bin]# ./startup.sh
启动nginx
代码语言:javascript
复制
[root@localhost nginx]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ./nginx 
将微服务注册到Nacos集群
访问nacos集群

启动 nacos-config 服务,并通过 nginx 访问 nacos 集群:http://192.168.209.129/nacos。

Nacos开机自启

编写开机启动文件
代码语言:javascript
复制
#添加nacos.service文件
vim /lib/systemd/system/nacos.service

#文件内容如下
[Unit]
Description=nacos
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target
修改nacos的startup.sh
  • 修改JAVA_HOME路径并注销之后的3行配置,如下:
代码语言:javascript
复制
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_191 
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
#[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME
设置开机启动
代码语言:javascript
复制
systemctl daemon-reload        #重新加载服务配置
systemctl enable nacos.service #设置为开机启动
systemctl start nacos.service  #启动nacos服务
systemctl stop nacos.service   #停止nacos服务
systemctl status nacos.service   #查看nacos服务的状态

参考链接:https://blog.csdn.net/qq_52830988/ article/details/128319218

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 民工哥技术之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Nacos 概述
  • Nacos 架构
  • Nacos 核心功能
  • Nacos 流程解析
  • Nacos 安装
    • 下载
      • 解压
        • 启动和关闭
        • Nacos持久化
          • 为什么持久化?
            • 配置Nacos持久化
            • Nacos集群
              • 部署架构图
                • 集群
                  • 配置代理服务
                    • 测试
                    • Nacos开机自启
                      • 编写开机启动文件
                        • 修改nacos的startup.sh
                          • 设置开机启动
                          相关产品与服务
                          云数据库 MySQL
                          腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档