写最好的Nacos Server稳定版(nacos-server-2.1.1)在Centos、Docker和Windows上安装部署(单机、集群)教程

写最好的Nacos Server稳定版(nacos-server-2.1.1)在Centos、Docker和Windows上安装部署(单机、集群)教程

一、前言

 
  Nacos官方中文网址:https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html
 
  相信每个掉进了Java这个深坑的人都知道,必须掌握如何使用 Nacos 是最基本的技能,它既是服务注册中心,又是服务配置中心。本文就来教教大家如何在 Centos、Docker和Windows 三个平台安装 Nacos Server ,分为 单机部署集群部署 ,安装步骤说简单,但也不简单,有些小细节需要注意。
 
  如果说这是全网写得最好的一篇Nacos Server安装部署教程,你们会认同吗?觉得还行的话就点个赞吧,+收藏,+关注,别的博客可不会写得这么详细和深入,CSDN@大白有点菜 出品,必属精品。
 
  可能用到的组件,可参考以下博客部署。如果心情烦躁,可以吃块西瓜解解暑,南方4月的西瓜不便宜哦。

1、最新Docker在Centos7下安装部署(参考官方教程文档)
 
2、最新JDK8(jdk-8u341)在云服务器Centos7.9安装部署
 
3、最新MySQL-5.7.40在云服务器Centos7.9安装部署
 
4、最新JDK8(jdk-8u341)在Win10安装部署(超详细)
 
5、写最好的Docker安装最新版MySQL8(mysql-8.0.31)教程(参考Docker Hub和MySQL官方文档)
 
6、Docker安装最新版MySQL5.7(mysql-5.7.40)教程(参考Docker Hub)
 
7、最新 MySQL 8.0.32 在Win10安装部署(详细)

 
  截止 2023 年 4 月 24 日,Nacos Server最新版是 nacos-server-2.2.2,但官方推荐使用稳定版 nacos-server-2.1.1,那我就按官方推荐的稳定版来安装部署吧。
 
  官方只在Github上提供正宗的Nacos Server下载,网址为:https://github.com/alibaba/nacos/releases/tag/2.1.1 。用过Github都懂的,有时可以和蜗牛比速度,使用梯子就下载快。当然,也有一些其它网站可以下载,安全性自行斟酌。
 
  本文由 CSDN@大白有点菜 原创,如需转载,请说明出处。如果觉得文章还不错,可以 点赞+收藏+关注 ,你们的肯定是我创作优质博客的最大的动力。
 
稳定版nacos-2.1.1
 
安装Nacos都唔识,吔西瓜啦

 

二、Nacos Server在 Centos7 安装部署(单机模式)

 
  其实 Centos7 和 Centos8 差不多,安装部署是适用的。这节内容主要在 Centos7 安装部署单机版 Nacos Server
 

2.1 下载 nacos-server-2.1.1 安装包

 
  下载 nacos-server-2.1.1 安装包有两种方式:一种是直接在 Centos7 里下载,另外一种是在 Windows 下载,然后上传到 Centos7 。经过本人亲测,即使在使用梯子的情况下,直接在 Centos7 里下载的速度和蜗牛爬行速度无异,在云服务器和虚拟机都试过,极其的慢。所以,推荐在 Windows 下载,然后上传到 Centos 7 这种方式!
 

2.1.1 Centos7的 wget 命令下载(不推荐)

wget https://github.com/alibaba/nacos/releases/tag/2.1.1

 
  如果提示 wget: command not found,那就安装 Wget :yum -y install wget
 

2.1.2 Centos7的 curl 命令下载(不推荐)

curl -O https://github.com/alibaba/nacos/releases/tag/2.1.1

 
  如果提示 curl: command not found,那就安装 Curl :yum -y install curl
 

2.1.3 Windows下载并上传(推荐)

 
  nacos-server-2.1.1安装包下载地址https://github.com/alibaba/nacos/releases/tag/2.1.1
 
  注意:需要安装 Xshell 等连接虚拟机工具,如果没有,可以参考我的另一篇博客:《Xshell7安装教程》
 
  上传命令:rz ,如果提示 rz 命令不存在,需要安装相应组件:yum -y install lrzsz
 
Windows下载nacos-server-2.1.1安装包
 
nacos-server-2.1.1安装包上传到Centos7

 

2.2 解压 nacos-server-2.1.1 安装包到指定目录

 
  上传完 nacos-server-2.1.1 安装包后,需要解压到指定的目录,我这里解压到 /usr/local/ 目录下。命令如下:
 

tar -xvf nacos-server-2.1.1.tar.gz -C /usr/local/

 
解压 nacos-server-2.1.1 安装包到指定目录 /usr/local/
 
nacos server解压后的目录

 

2.3 使用 “-m standalone” 命令参数的方式运行单机版 Nacos Server(不推荐)

 
  我不推荐使用 -m standalone 命令参数的方式运行单机版 Nacos Server,很多教程都这么写,连官网也这么说。不是说这种方式有问题,而是有更好的方案去处理,每次都需要输入 -m standalone 命令显得很麻烦。
 
  切换到 nacos 解压包的 bin 目录下,首先修改程序运行的堆内存,默认的太大了,自己学习使用,不用设置那么大。使用 vim 编辑 startup.sh 文件。注意:startup.cmd 是 Windows环境下使用的,shutdown.sh 用来关闭 Nacos Server 。
 

vim startup.sh

 
  修改为多大运行的堆内存,看个人需求吧,我这里设置 -Xms256m -Xmx256m -Xmn128m 。有个技巧是:按比例设置, 最小堆内存(-Xms) 和最大堆内存(-Xmx)设置一样的值,新生代内存(-Xmn)则为堆内存的一半。最后,记得按 Esc 退出编辑,并输入 :wq 进行保存!
 
使用 vim 编辑  startup.sh 文件修改堆内存和新生代内存
 
  可以直接以命令运行 sh startup.sh -m standalone ,也可以使用 nohup 开头和 & 结尾命令,以 后台方式 运行 startup.sh ,模式为单机模式Nacos Server 官方已经处理为在后台中运行,不用特意使用 nohup 命令。如下:
 

sh startup.sh -m standalone
nohup sh startup.sh -m standalone &

 
使用 nohup 开头和 & 结尾命令,以 后台方式 运行 startup.sh ,模式为单机模式
 
  使用浏览器输入:http://192.168.50.136:8848/nacos 并回车,可以看到 Nacos 的登录页面,说明 Nacos Sever 是正常运行的。192.168.50.136 是虚拟机 Centos7 的 IP 地址,端口号默认为 8848 ,当然可以修改为指定的端口运行,后面跟着 /nacos 路径。默认的用户名和密码都是:nacos 。
 
使用浏览器输入:http://192.168.50.136:8848/nacos 并回车,可以看到 Nacos 的登录页面
 
  Naocs 登录进去的页面如下。
 
Naocs 登录进去的页面如下
 

2.4 不使用 “-m standalone” 命令参数的方式运行单机版 Nacos Server(推荐)

 
  推荐一种方式,只需修改 startup.sh 某个参数值,就能以单机模式运行 Nacos Server,并且避免输入 -m standalone 命令。
 
  同样是切换到 nacos 解压包的 bin 目录下,首先修改程序运行的堆内存,默认的太大了,自己学习使用,不用设置那么大。使用 vim 编辑 startup.sh 文件。注意:startup.cmd 是 Windows环境下使用的,shutdown.sh 用来关闭 Nacos Server 。
 

vim startup.sh

 
  修改为多大运行的堆内存,看个人需求吧,我这里设置 -Xms256m -Xmx256m -Xmn128m 。有个技巧是:按比例设置, 最小堆内存(-Xms) 和最大堆内存(-Xmx)设置一样的值,新生代内存(-Xmn)则为堆内存的一半。最后,记得按 Esc 退出编辑,并输入 :wq 进行保存!
 
使用 vim 编辑  startup.sh 文件修改堆内存和新生代内存
 
  修改这一行:export MODE=“cluster” ,将 cluster 修改为 standalone 即可。
 
export MODE="cluster",将 cluster 修改为 standalone 即可。
 
  重新运行看看效果,使用命令 sh shutdown.sh 关闭已运行 Nacos Server 。直接使用 sh startup.sh 命令重新运行,打印的日志“nacos is starting with standalone”说明这种方式更加简洁,同样是以单机模式运行 Nacos Server。
 

sh shutdown.sh
sh startup.sh

 
重新运行看看效果,使用命令 sh shutdown.sh 是关闭 Nacos Server
 
使用sh startup.sh命令运行Nacos Server,发现也是以单机模式运行的
 

2.5 以指定的端口号运行(不推荐)

 
  在大众的认知中,8848 是 Nacos 的默认端口号,从 8848 你想到什么呢?没错,珠穆朗玛峰,世界最高峰,最新的海拔高度为:8848.86 米!看来,阿里巴巴是想将 Nacos 打造成世界 No.1 啊!
 
  前面闲聊一下,回到主题,如何指定端口去运行 Nacos 呢?
 
  只需要修改 nacos 解压包下的 conf 目录的 application.properties 配置文件的 server.port 属性值,默认是 8848 。此处修改为 8900 ,退出编辑并保存,重新运行,看效果如何。注意:如果以指定的端口运行,日志打印是正常运行的,但输入地址却访问不了,那就是防火墙的问题了,要么添加放行指定的端口号(强烈推荐),要么关闭防火墙(强烈不建议)。 我在之前也写了一篇博客,关于Centos放行端口号:《Centos中防火墙(Firewall)操作(允许端口、删除端口、查看端口列表、重启、停止、开机启动等)》 ,有需要可以去看看。
 

 
修改 nacos 解压包下的 conf 目录的 application.properties 配置文件的 server.port 属性值
 
修改端口号为 8900 并重新运行 Nacos Server
 
  此时,端口号是 8900 而不是 8848 了。
 

2.6 关闭 Nacos Server 使用 kill -9 pid ?

 
  如何关闭一个运行中的 Nacos Server 呢?有人说,那还不简单,使用 jps 查看 Nacos Server 的 pid ,它是个 java 进程嘛。或者使用 ps -ef | grep nacos 查看 pid 。最后,使用终极武器:kill -9 pid ,干掉各种牛鬼蛇神,如图所示。
 
使用 jps 或 ps -ef | grep nacos 查看 Nacos Server 的 pid,使用 kill -9 pid 杀死进程
 
  就这?有点简单粗暴哦,Nacos 官方提供了一个 shutdown.sh 脚本去优雅地关闭 Nacos Server 呢!在 nacos 的 bin 目录下,使用命令 sh shutdown.sh 即可完成关闭 Nacos Server 。打印以下内容说明 Nacos Server 被关闭了。
 

sh shutdown.sh

 
Nacos Server 被关闭

 
  真别笑,shutdown.sh 脚本里面使用一条命令进行进程的关闭:kill pid 。其实还是使用 kill 命令杀死进程,只不过 kill -9 pid 是强制杀死进程
 

kill pid
kill -9 pid

 
shutdown.sh 脚本里面使用一条命令进行进程的关闭:kill pid
 

2.7 Nacos Server 配置全局环境变量(谨慎配置,应思考是否需要这么做)

 
  网上没有这种教程,自行摸索出来的方法。无论部署什么组件,都应该需要配置它的全局环境变量,那么可以做到在任何路径下都能执行组件指定的脚本或命令。注意:除非真有必要,Nacos Server 配置全局环境变量可能与其它组件存在冲突,主要是 Nacos Server 的两个 startup.sh 和 shutdown.sh 脚本文件。
 
  如果有第三方的组件也部署在同一台服务器,并且也同样有 startup.sh 和 shutdown.sh 这两个脚本文件,同时配置了全局环境变量,那么,就存在和 Nacos Server 冲突的可能。 好比同一个班级有两个张三,老师叫张三做题,两个张三都会懵圈,谁去做?这就是冲突,只是举个例子,不一定存在。
 
  不配置 Nacos Server 的全局环境变量,例如执行 shutdown.sh 脚本,只能切换到其 nacos 目录下的 bin 目录去执行,或者指定绝对路径,例如 sh /usr/local/nacos/bin/shutdown.sh 。这样使用是很不方便的。如下:
 
无法识别 sh shutdown.sh 脚本

 
  编辑 profile 文件,如下:
 

vim /etc/profile

 
  添加以下语句,新增一个 NACOS_HOME 环境变量,并在 PATH 变量后面加上“:$NACOS_HOME/bin”。注意:有个英文冒号隔开,不要遗漏了!
 

export NACOS_HOME=/usr/local/nacos
export PATH=$PATH:${JAVA_PATH}:$NACOS_HOME/bin

 
新增一个 NACOS_HOME 环境变量,并在 PATH 变量后面加上“:$NACOS_HOME/bin”。
 
  最后,一定记得运行 source 命令刷新 profile 文件使其生效。
 

source /etc/profile

 
运行 source 命令刷新 profile 文件使其生效。

 
  上面 Nacos Server 配置环境变量步骤和 JDK 配置环境变量步骤异曲同工,应该是没问题的。我们来运行一下,不能想当然认为没有问题,如图所示。
 
执行 sh startup.sh 脚本,Nacos Server 日志正常输出
 
  目前我是在“~”目录执行 sh startup.sh 脚本,其实脚本能被识别并执行,不然不会出现上面的内容。那哪里有问题呢?经过观察,发现日志打印中出现了类似 //target/nacos-server.jar 这样前面有两个斜杠的。分析得出:startup.sh 脚本执行的时候,找不到 nacos 的目录
 
都是以两个斜杆 // 开头,说明找不到 nacos 路径
 
  Nacos Server 启动问题根源找到了,那就需要修改 startup.sh 和 shutdown.sh 这两个脚本。无论修改什么文件或内容,都有一个原则:先备份旧的文件,再去修改副本文件。先注释旧的内容,再新增或修改新的内容
 
  startup.sh 脚本内容修改如下,注释旧的 BASE_DIR 变量,新增一条新 BASE_DIR 变量,填入 Nacos 安装包的绝对路径,例如 /usr/local/nacos
 

#export BASE_DIR=`cd $(dirname $0)/..; pwd`
export BASE_DIR=/usr/local/nacos

 
注释旧的 BASE_DIR 变量,新增一条新 BASE_DIR 变量,填入 Nacos 安装包的绝对路径,例如 /usr/local/nacos
 
  shutdown.sh 脚本内容修改如下,先注释后修改
 

#cd `dirname $0`/../target
cd /usr/local/nacos/target

 
shutdown.sh 脚本内容修改如下,先注释后修改

 
  修改完脚本之后,依旧在“~”目录下执行 sh startup.shsh shutdown.sh 命令,发现 Nacos Server 能正常运行(pid 为 5387)和正常关闭了。
 
修改完脚本,依旧在“~”目录下执行 sh startup.sh 和 sh shutdown.sh 命令,发现 Nacos Server 能正常运行和正常关闭了
 

2.8 Nacos Server 配置开机自启动

 
  只研究过三种方式配置 Nacos Server 的开机自启动,读者可自行选择。方式二是方式一的优化版,网上没有这样的教程,自己探索出来这两种。方式三参考网上各种满天飞的博客,这种方式亲测后,发现了一些意想不到的变化。
 
  如果脚本没有运行,或者运行失败,就要去排查,有没有设置为单机模式启动,有没有修改运行的堆内存,启动时内存设置过大,程序也不能正常运行。修改的内容是否是正确的,有时候写错了或写少了一个符号,就是不能启动起来,但又很难发现。
 

2.8.1 方式一设置开机自启动

 
  首先在 nacos 目录下新建一个脚本 nacos-auto-startup.sh名称随意,有意义就行,在哪个目录下创建都可以,没有要求),后面会将这个脚本的绝对路径添加到 rc.local 文件中。新建文件的方式有多种,使用 touch 或 vi、vim 都行,例如 touch nacos-auto-startup.shvi nacos-auto-startup.shvim nacos-auto-startup.sh我更推荐使用 vim 或 vi 。
 

touch nacos-auto-startup.sh
vi nacos-auto-startup.sh
vim nacos-auto-startup.sh

 
在 nacos 目录下新建一个脚本 nacos-auto-startup.sh

 
  脚本 nacos-auto-startup.sh添加以下内容,注意,必须添加 JAVA_HOME 变量,不然没有效果! 有人可能存在疑问了,Nacos Server 的 startup.sh 本身是一个脚本,为什么要画蛇添足,再搞一个脚本 nacos-auto-startup.sh 呢?先看下去,后面再解释。
 

#!/bin/bash

#必须要添加这一行,是 JDK 实际安装路径
export JAVA_HOME=/usr/local/jdk1.8.0_351
#执行 startup.sh 脚本
sh /usr/local/nacos/bin/startup.sh

 
请添加图片描述

 
  其次编辑 rc.local 文件。编辑 rc.local 文件的方法有些麻烦,后面会补充一种更方便的处理方法。
 

vim /etc/rc.local

 
  rc.local 文件添加内容如下,此处开机会执行上面新建的脚本 nacos-auto-startup.sh ,最后按 Esc 退出编辑,再输入 :wq 保存并退出。
 

sh /usr/local/nacos/nacos-auto-startup.sh

 
rc.local 文件添加内容

 
  补充另外一种更方便的方法,使用 echo 命令将指定内容写入 rc.local 文件中,可以做到和编辑文件一样的效果。执行命令如下。
 

echo "sh /usr/local/nacos/nacos-auto-startup.sh" >> /etc/rc.local

 
  更改 /etc/rc.d/rc.local 文件为 可执行(x)权限。注意,/etc/rc.local 只是 /etc/rc.d/rc.local 的快捷方式。
 

chmod +x /etc/rc.d/rc.local

 
  先解释前面提到的需要单独创建 nacos-auto-startup.sh 脚本的原因吧。经过我反复验证,如果直接写的是 “sh /usr/local/nacos/bin/startup.sh” ,是不会有效果的,即开机不能执行 startup.sh 脚本,原因应该是无法识别 JAVA_HOME 这个系统变量,找不到 JDK 去启动 Nacos Server(nacos-server.jar)【这种说法只是我个人猜想】。只有按上面步骤去做,才会实现想要的功能。
 
  使用命令 reboot 可以重启 Centos7 系统,重新启动后,通过 jps 命令查看,nacos-server.jar 服务已经实现开机启动了。
 
reboot重启Centos7后,使用 jps 命令可以查看到 nacos-server.jar 服务开机启动了
 

2.8.2 方式二设置开机自启动(方式一的优化版)

 
  在方式一提到需要在 nacos 目录下新建一个脚本 nacos-auto-startup.sh ,将这个脚本的绝对路径添加到 rc.local 文件中,才能实现 Nacos Server 的开机自启动。其实不用那么麻烦,不用新建 nacos-auto-startup.sh 脚本也能实现 Nacos Server 开机自启动。只需修改 Nacos Server 的 startup.sh 脚本和 rc.local 文件即可。
 
  首先修改 Nacos Server 的 startup.sh 脚本,修改内容如下。先注释,再复制并修改。此处 JAVA_HOME 填入 JDK 实际的安装路径。
 

#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_351

 
修改 Nacos Server 的 startup.sh 脚本,先注释,再复制并修改。此处 JAVA_HOME 填入 JDK 实际的安装路径。
 
  其次修改 rc.local 文件,两种方式处理,二选一吧。
 
  (1)使用 echo 命令将指定内容插入到 rc.local 文件中。
 

echo "sh /usr/local/nacos/bin/startup.sh" >> /etc/rc.local

 
  (2)直接编辑 rc.local 文件并添加内容。
 

vim /etc/rc.local
sh /usr/local/nacos/bin/startup.sh

 
直接编辑 rc.local 文件并添加内容

 
  最最最重要,不要忘记更改 /etc/rc.d/rc.local 文件为 可执行(x)权限。注意,/etc/rc.local 只是 /etc/rc.d/rc.local 的快捷方式。
 

chmod +x /etc/rc.d/rc.local

 
  使用命令 reboot 可以重启 Centos7 系统,重新启动后,通过 jps 命令查看,nacos-server.jar 服务已经实现开机启动了。
 
reboot重启Centos7后,使用 jps 命令可以查看到 nacos-server.jar 服务开机启动了
 

2.8.3 方式三设置开机自启动(网上大多数博客的做法,但不推荐)

 
  方式三的做法是新建一个 nacos.service 文件,由 systemctl 去管理。亲测后,倒是出现了一些意想不到的情况,这种方法我不推荐。
 
  (1)首先在 /lib/systemd/system/ 目录下新建 nacos.service 文件。
 

vim /lib/systemd/system/nacos.service

 
  (2) nacos.service 文件添加以下内容。其它博客还写到 ExecReload 这么一行,不过内容和 ExecStop 是一样的,此处我移除了。
 

[Unit]
Description=nacos
After=network.target

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

[Install]
WantedBy=multi-user.target

 
  (3)重点来了,修改 Nacos Server 的 startup.sh 脚本内容,JAVA_HOME 这一行先注释掉,复制一行再修改,一定要修改为 JDK 的实际安装路径,不然会提示找不到 JAVA_HOME 报错而启动失败。如图所示。其它博客有说到需要注释另外三行(红圈下面的那三行,都有JAVA_HOME),其实不用。
 

#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_351

 
修改 Nacos Server 的 startup.sh 脚本内容

 
提示找不到 JAVA_HOME 报错而启动失败
 
  (4)使用 systemctl daemon-reload 重新加载服务配置。注意,无论是新增一个 *.service 或者修改,都需要先执行这条命令,再执行其它的启动命令,不然会报警告。
 

systemctl daemon-reload

 
无论是新增一个 *.service 或者修改,都需要先执行这条命令,再执行其它的启动命令,不然会报警告。
 
  (5)【开机自启动】:使用 systemctl enable nacos.service 设置 Nacos Server 服务开机自启动。
 

systemctl enable nacos.service

 
  (6)【启动】:使用 systemctl start nacos.service 启动 Nacos Server 服务。
 

systemctl start nacos.service

 
  (7)【查看服务运行状态】:使用 systemctl status nacos.service 查看 Nacos Server 服务运行状态。
 

systemctl status nacos.service

 
使用 systemctl status nacos.service 查看 Nacos Server 服务运行状态。
 
  (8)【重新启动】:使用 systemctl restart nacos.service 重新启动 Nacos Server 服务。亲测过,每次重新启动后的 pid 都不一样。
 

systemctl restart nacos.service

 
  (9)【停止】:使用 systemctl stop nacos.service 停止 Nacos Server 服务。
 

systemctl stop nacos.service

 
  (10)【禁用开机自启动】:使用 systemctl disable nacos.service 禁用 Nacos Server 服务开机自启动。
 

systemctl disable nacos.service

 
请添加图片描述

 
  开头说到使用这种方式发生一些意想不到的情况,是什么呢?其实是使用 jps 命令去查看 nacos-server.jar 的 pid ,发现居然不存在了,我还以为服务没有正常启动。但 Nacos Server 服务运行是正常的,使用 ps -ef | grep nacos 命令查看,Nacos Server 服务运行情况一目了然。使用 nacos.service 方式居然 “干掉” 了 nacos-server.jar,从 jps 中除名。
 
禁用Nacos Server开机自启动
 
  这就是为什么我不推荐使用 nacos.service 这种方式去配置 Nacos Server 开机自启动,不方便查看 Nacos Server 的运行状况,使用 jps 多方便啊!
 

三、使用嵌入式数据库(Derby) 或 MySQL 数据库

 
  在0.7版本之前,在单机模式时 Nacos 使用嵌入式数据库(Derby)实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持 MySQL(要求 5.6.5版本或以上) 数据源能力。
 
  分布式系统下,Derby 数据库只适用单机模式,数据无法被共享。使用 MySQL 数据库可以解决分布式系统下 Derby 数据库的数据不共享问题。
 
  【Nacos官网上的教程 - 单机模式支持mysql】
  https://nacos.io/zh-cn/docs/v2/guide/admin/deployment.html
 

3.1 初始化数据库文件 nacos-mysql.sql

 
  Nacos 的 conf 目录下就存在 nacos-mysql.sql 数据库脚本文件,只是创建表的SQL脚本,并没有创建数据库,需要我们手动创建 nacos_config 名称的数据库。Windows 系统处理方法是一样的,不再过多说明,参考 Centos7 下处理方法即可。
 
Nacos 的 conf 目录下存在 nacos-mysql.sql 脚本文件,需要我们手动创建 nacos_config 名称的数据库
 
  Nacos 在 Github 上的源码目录里面也存在数据库脚本文件 mysql-schema.sql ,网址为:https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql ,我将其和压缩包上的 nacos-mysql.sql 数据库脚本文件做了对比,发现有少许不一样,主要是 config_infoconfig_info_aggr 两张表的 groud_id 字段类型大小不一样,一个是 128 字符,另一个是 255 字符。选择发布版压缩包里面 conf 目录下的 nacos-mysql.sql 的吧。如图所示:
 
Nacos 在 Github 上的源码目录和发布版压缩包的 mysql 脚本不一样
 

3.2 修改 conf/application.properties 文件,增加支持 MySQL 数据源配置

 
  由于默认支持的是嵌入式数据库 Derby ,所以需要手动修改 conf 目录下的 application.properties 配置文件来增加支持 MySQL 数据源配置。
 

vim /usr/local/nacos/conf/application.properties

 
  有两行去掉注释即可,另外三行填写正确的数据库所在的服务器IP和数据库全名,数据库连接的账户和密码。复制一行再修改。如下:
 
有两行去掉注释即可,另外三行填写正确的数据库所在的服务器IP和数据库全名,数据库连接的账户和密码。
 
  (1)配置数据源平台为 MySQL ,目前只支持 MySQL(官方的说法)。只有配置这个才会更改为 MySQL 数据源。

spring.datasource.platform=mysql

  (2)MySQL 数据库数量。

db.num=1

  (3)MySQL 数据库的IP(例如 192.168.50.134)和数据库全名(例如 nacos_config)。注意,connectTimeout 的值修改为 10000socketTimeout 的值修改为 30000 ,样例给出的值太小了。

db.url.0=jdbc:mysql://192.168.50.134:3306/nacos_config?characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC

  (4)MySQL 数据库连接的用户名。

db.user.0=root

  (5)MySQL 数据库连接的密码。

db.password.0=123456

 
  浏览 http://192.168.50.136:8848/nacos 并使用 nacos 用户名登录后,在“权限控制” - “用户列表” 这栏中创建一个用户 dbydc ,再去数据库 nacos_config 查看表 users ,确实有新增 username 为 dbydc 的记录。
 
在“权限控制” - “用户列表” 这栏中创建一个用户 dbydc ,再去数据库 nacos_config 查看表 users ,有新增 username 为 dbydc 的记录。
 

3.3 烦人的 No DataSource set 报错

 
  不知你在配置为 MySQL 数据源后,是否遇到,浏览器输入 http://192.168.50.136:8848/nacos 并回车,发现怎么刷新都打不开 Nacos 登录页面的情况?你可能使用 jps 或者 ps -ef | grep nacos 去查看 Nacos Server 是否已经启动成功,但失望的是,Nacos Server 正常运行,什么情况!?Nacos Server 服务明明运行正常,浏览 Nacos 登录页面却是一直失败失败失败!
 
  你可能立马打开 Nacos 的 application.properties 文件:vim /usr/local/nacos/conf/application.properties 查看配置的数据源是否写错了,检查了 N 多遍也没找出哪里有问题。
 
  我们都遇到了烦人 No DataSource set 报错 !!!连我都被它搞了“失眠”几天。
 
No DataSource set  报错
 

3.3.1 如何查看 No DataSource set 错误

 
  Nacos Server 服务在启动时,会生成一个 logs 目录(可能在 bin 目录下或者 nacos 目录下,具体看日志配置的路径),里面有个 start.out 文件,Nacos Server 服务启动会将启动日志写进去
 
Nacos Server 服务启动会将启动日志写入到 logs/start.out 文件
 
  使用 sh startup.sh 命令启动 Nacos Server 服务后,执行 tail -f /usr/local/nacos/logs/start.out 命令(注意每个人的日志目录可能不一样,我这里是 nacos 目录下 logs 目录实时打印 Nacos Server 服务的启动日志,按组合键 Ctrl + C 即可退出
 

tail -f /usr/local/nacos/logs/start.out

 
tail -f /usr/local/nacos/logs/start.out 命令实时打印 Nacos Server 服务的启动日志
 

3.3.2 什么情况下不会报 No DataSource set 错误

 
  先总结一下不会报 No DataSource set 错误的情况,不一定完全准确,每个人的环境都不一样,但我都验证过了,暂时没有问题。
 

1、禁用数据源为 MySQL数据库,使用默认的 Derby 数据库。即注释掉 spring.datasource.platform=mysql
 
2、数据源的 IP 地址为另外一台同样网段的虚拟机(Centos系统)、远程的云服务器(Centos系统)、本地数据库(和 Nacos Server 同一个服务器安装的 MySQL)。即 db.url.0=jdbc:mysql://192.168.50.134:3306/db.url.0=jdbc:mysql://119.91.xx.xx:3306/db.url.0=jdbc:mysql://localhost:3306/
 
3、数据源的 用户名密码 有效,并且能进行远程连接 MySQL 数据库

 
  有人可能连接同样网段的Centos虚拟机和远程云服务器都可能出现 No DataSource set 报错,如果是这样,那就看看后面的解决方法能否帮到你们。
 
  我启动的 Nacos Server 连不上 MySQL 而报错 No DataSource set 的原因竟然是 用户名(root)不支持远程连接 MySQL 数据库,后面会详细复盘过程。
 

3.3.3 众说纷坛的 No DataSource set 错误解决方案

 
  为了解决“失眠”问题,我特意搜集了网上大量的解决方案,同样包括查阅 Github 上 Nacos 的 Issues 有关 No DataSource set 的问题,网址:https://github.com/alibaba/nacos/issues?q=No+DataSource+set ,发现 No DataSource set 问题很常见,涉及各个版本。
 
  从事编程最痛苦的事,不是实现功能,而是排查并解决问题!解决问题过程都会有一种砸鼠标的冲动,问题容易解决的除外。
 
  整理出来几种解决方案,希望能帮到你们。如下:
 

1、DataSource的 Url 加入 allowPublicKeyRetrieval=true 。即在后面添加 db.url.0=jdbc:mysql://192.168.50.134:3306/nacos_config?这里省略很多内容…&allowPublicKeyRetrieval=true ,不要遗漏“&”符号其实不加也行,亲测过
 
2、DataSource的 Url 的 connectTimeout=1000 修改为 connectTimeout=10000socketTimeout=3000 修改为 socketTimeout=30000 ,参数值修改为更大的值。其实不修改也行,亲测过。建议修改更大的值
 
3、如果使用 Docker 版 Nacos 部署,那么使用 MYSQL_SERVICE_USER 而不是 MYSQL_MASTER_SERVICE_USER 。对应的 Issues :nacos-server 2.0.3,2.0.4 出现 no datasource set #8106
 
4、DataSource的 Url 添加 serverTimezone=UTC ,使用 MySQL 8 数据库需要添加,可以写成 serverTimezone=GMT%2b8 或者 serverTimezone=Asia/Shanghai。【2.1.1 版本的 application.properties 里面就写到 db.url.0=jdbc:mysql://192.168.50.134:3306/nacos_config?这里省略很多内容…&serverTimezone=UTC ,不用画蛇添足
 
5、连接 MySQL 是否被防火墙拦截了,端口 3306 是否在防火墙中设置放行了。
 
6、连接 MySQL 的参数是否都正确,往往一点小错误细节容易被忽略,多检查几遍。MySQL 的用户名和密码允许远程连接吗?

 

3.3.4 复盘解决 No DataSource set 过程

 
  先说一下我的环境:Nacos Server 服务部署在 Centos7 虚拟机(IP:192.168.50.136)上,MySQL8.0 数据库安装在本机的 Window 10 下,Centos7 虚拟机并没有安装 MySQL 数据库。所以打算设置 Nacos Server 并连接 Window 10 下的 MySQL 8.0 数据库,即在 Centos7 虚拟机中连接主机(Windows 10)的 MySQL 数据库。
 
  Nacos Server 的 application.properties 中配置 DataSource 的 Url 为:db.url.0=jdbc:mysql://192.168.50.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC ,IP(192.168.50.1)是Windows 10 下 VMware 虚拟机的起始IP。数据库连接的 用户名 为:db.user.0=root 。数据库连接的 密码 为:db.password.0=123456
 
application.properties配置 DataSource
 
  无论怎么看,各个参数都挑不出任何毛病,一旦 sh startup.sh 启动 Nacos Server 服务并使用命令 tail -f /usr/local/nacos/logs/start.out 实时打印启动日志,一堆堆的 No DataSource set 报错日志扑面而来,一次又一次地砸在精神上,隐隐作痛。反反复复试了各种方法(前面列出的解决方法就是这么查询并总结出来的),都找不出来原因,为此“失眠”好几个日夜!
 
一堆堆的 No DataSource set 报错日志扑面而来
 
  经历无数次的 No DataSource set 报错的摧残,终于迎来了曙光。我灵光一现,想到是不是连接 MySQL 的 用户名:root 不支持远程连接呢? 记得当初好像安装 MySQL 8 时有设置到禁用 MySQL 的 root 用户不支持远程连接,并且添加一个新的用户名:zyt 。试试新用户名吧,不行再想其它办法。数据库连接的 用户名 修改为:db.user.0=zyt ,连接密码还是 123456 保持不变。
 
  一番启动、查看实时启动日志操作,发现,居然不报 No DataSource set 错误了!我顿时想把 MySQL 的 root 用户名按在地上摩擦再摩擦,真的是 root 用户名不支持远程连接的问题,折磨我这么久!
 
Nacos Server 服务启动正常
 
  【总结】复盘解决 No DataSource set 过程,分享出来也是想告诉大家,如果出现同样的问题,那就很容易解决了。连接不上 MySQL 可能是网络不通,又可能是用户名不支持远程连接,或者密码错误。千万不要搞混 本地连接 和 远程连接 的概念。 禁用 root 用户远程连接很有必要这么做,是为了安全,特别是在云服务器中安装 MySQL ,一定要禁用。最好的做法是新增一个用户来进行远程连接数据库。可以参考我的另一篇博客:《如何优雅地创建MySQL账户供外部工具连接》
 

四、Nacos Server Docker版在 Centos7 安装部署(单机模式)

 
  安装 Docker 版的 Nacos Server 比直接在 Centos7 上安装 Nacos Server 原版稍微简单些。前提是在 Centos 上已经安装好 Docker 组件,没有的请移步:《最新Docker在Centos7下安装部署(参考官方教程文档)》
 

4.1 拉取指定 Docker 版本的Nacos Server镜像

 
  在 Docker 官网搜索 nacos 镜像。Docker 官网为:https://hub.docker.com/ ,对应的 Nacos Server Docker版网址:https://hub.docker.com/r/nacos/nacos-server
 
在 Docker 官网搜索 nacos 镜像

 
对应的 Nacos Server Docker版
 
  拉取指定 Docker 版本的 Nacos Server 镜像,例如 nacos-server-2.1.1。切换到“Tags”标签,找到指定的版本(v2.1.1),点复制按钮复制命令。注意,如果输入的命令是:docker pull nacos/nacos-server ,那就是拉取最新的 Nacos Server,一定要考虑有没有必要使用最新的版本。如图所示:
 

docker pull nacos/nacos-server:v2.1.1

 
切换到“Tags”标签,找到指定的版本

 
点复制按钮复制命令
 
docker pull nacos/nacos-server:v2.1.1 命令拉取 Nacos Sever镜像
 

4.2 挂卷自定义配置文件方式新建并运行Nacos Server容器(使用默认的嵌入式数据库 Derby)

 
  我们可以从以下三个网址了解 Docker 版的 Nacos Server 部署方式和配置参数设置,其实都是 Nacos 官方提供的,我建议看 Nacos 官网的 Docker 页面Github 上 Nacos Docker 源码包中的 README_ZH.md 文件,中文更友好。
 

1、Docker 官网的 Nacos Server 页面:https://hub.docker.com/r/nacos/nacos-server
 
2、Nacos 官网的 Docker 页面:https://nacos.io/zh-cn/docs/quick-start-docker.html
 
3、Github 上 Nacos Docker 源码包中的 README_ZH.md 文件:https://github.com/nacos-group/nacos-docker/blob/master/README_ZH.md

 
  【Docker 版 Nacos Server 属性配置列表】
 

属性名称描述选项
MODE系统启动方式: 集群/单机cluster/standalone 默认 cluster
NACOS_SERVERS集群地址p1:port1空格ip2:port2 空格ip3:port3
PREFER_HOST_MODE支持IP还是域名模式hostname/ip 默认 IP
NACOS_SERVER_PORTNacos 运行端口默认 8848
NACOS_SERVER_IP多网卡模式下可以指定IP
SPRING_DATASOURCE_PLATFORM单机模式下支持MYSQL数据库mysql / 空 默认 : 空
MYSQL_SERVICE_HOST数据库连接地址
MYSQL_SERVICE_PORT数据库端口默认 : 3306
MYSQL_SERVICE_DB_NAME数据库库名
MYSQL_SERVICE_USER数据库用户名
MYSQL_SERVICE_PASSWORD数据库用户密码
MYSQL_SERVICE_DB_PARAM数据库连接参数默认 : characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
MYSQL_DATABASE_NUM数据库个数默认 : 1
JVM_XMS-Xms默认 : 1g
JVM_XMX-Xmx默认 : 1g
JVM_XMN-Xmn512m
JVM_MS- XX:MetaspaceSize默认 : 128m
JVM_MMS-XX:MaxMetaspaceSize默认 : 320m
NACOS_DEBUG是否开启远程DEBUGy/n 默认 : n
TOMCAT_ACCESSLOG_ENABLEDserver.tomcat.accesslog.enabled默认 : false
NACOS_AUTH_SYSTEM_TYPE权限系统类型选择,目前只支持nacos类型默认 : nacos
NACOS_AUTH_ENABLE是否开启权限系统默认 : false
NACOS_AUTH_TOKEN_EXPIRE_SECONDStoken 失效时间默认 : 18000
NACOS_AUTH_TOKENtoken注意:该环境变量在Nacos 2.2.1版本中已移除
NACOS_AUTH_CACHE_ENABLE权限缓存开关 ,开启后权限缓存的更新默认有15秒的延迟默认 : false
MEMBER_LIST通过环境变量的方式设置集群地址例子 : 192.168.16.101:8847?raft_port=8807,192.168.16.101:8848?raft_port=8808,192.168.16.101:8849?raft_port=8809
EMBEDDED_STORAGE是否开启集群嵌入式存储模式embedded 默认 : none
NACOS_AUTH_CACHE_ENABLEnacos.core.auth.caching.enabled默认 : false
NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLEnacos.core.auth.enable.userAgentAuthWhite默认 : false
NACOS_AUTH_IDENTITY_KEYnacos.core.auth.server.identity.key注意:该环境变量在Nacos 2.2.1版本中已移除
NACOS_AUTH_IDENTITY_VALUEnacos.core.auth.server.identity.value注意:该环境变量在Nacos 2.2.1版本中已移除
NACOS_SECURITY_IGNORE_URLSnacos.security.ignore.urls默认 : /,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**

 
  Docker 容器基本都支持以自定义的配置文件进行挂卷,除了挂卷配置文件,还支持 数据 目录和 日志 目录的挂卷。因此,先创建要挂载的配置文件目录、日志目录。自定义配置文件可以从运行中的 Nacos Server 容器中复制到主机(Centos7)
 

4.2.1 创建配置文件目录和日志目录

 

mkdir -p /mydata/nacos/conf
mkdir -p /mydata/nacos/logs

 
创建配置文件目录和日志目录

 

4.2.2 conf 目录的不可少文件:application.properties 和 nacos-logback.xml

 
  在 Nacos Server 容器中的主目录是:/home/nacos ,在其目录下的 conf 目录有配置文件 application.properties 。除了 application.properties 文件还有 1.4.0-ipv6_support-update.sqlnacos-logback.xmlschema.sql 另外三个文件,真正必不可少的只有 application.properties(服务配置文件)nacos-logback.xml(日志配置文件)这两个。
 
  前面创建的 /mydata/nacos/conf 目录里面必须有application.properties(服务配置文件)nacos-logback.xml(日志配置文件)这两个配置文件,那可以实现以自定义的配置文件启动 Nacos Server 容器。
 

4.2.3 自定义配置文件获取的三种方式

 
  先说结论,获取自定义配置文件有三种方式:

1、自己新建 application.propertiesnacos-logback.xml 文件,将指定内容复制进去。需要和 Nacos Server 的镜像版本保持一致【方便,但要注意版本要保持一致】
 
2、下载和 Nacos Server 镜像对应版本(例如 2.1.1 版)的 Nacos Server 发布版压缩包,从压缩包里面的 conf 文件夹复制并上传 application.propertiesnacos-logback.xml 文件到 Centos7 的 /mydata/nacos/conf 目录。【方便,但要注意版本要保持一致】
 
3、启动一个临时的 Nacos Server 容器,将容器内的 application.propertiesnacos-logback.xml 文件复制到主机的 /mydata/nacos/conf 目录,随后删除这个临时的容器。【稍微有点麻烦,但最保险】

 
  方式一:新建 application.properties 和 nacos-logback.xml 文件并复制指定内容(Nacos Server镜像是 v2.1.1)
 
  (1)编辑 application.properties 文件并复制以下指定内容:

vim /mydata/nacos/conf/application.properties

 

#
# Copyright 1999-2021 Alibaba Group Holding Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

#*************** Spring Boot Related Configurations ***************#
### Default web context path:
server.servlet.contextPath=/nacos
### Include message field
server.error.include-message=ON_PARAM
### Default web server port:
server.port=8848

#*************** Network Related Configurations ***************#
### If prefer hostname over ip for Nacos server addresses in cluster.conf:
# nacos.inetutils.prefer-hostname-over-ip=false

### Specify local server's IP:
# nacos.inetutils.ip-address=


#*************** Config Module Related Configurations ***************#
### 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=nacos
# db.password.0=nacos

### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2

#*************** Naming Module Related Configurations ***************#
### Data dispatch task execution period in milliseconds: Will removed on v2.1.X, replace with nacos.core.protocol.distro.data.sync.delayMs
# nacos.naming.distro.taskDispatchPeriod=200

### Data count of batch sync task: Will removed on v2.1.X. Deprecated
# nacos.naming.distro.batchSyncKeyCount=1000

### Retry delay in milliseconds if sync task failed: Will removed on v2.1.X, replace with nacos.core.protocol.distro.data.sync.retryDelayMs
# nacos.naming.distro.syncRetryDelay=5000

### If enable data warmup. If set to false, the server would accept request without local data preparation:
# nacos.naming.data.warmup=true

### If enable the instance auto expiration, kind like of health check of instance:
# nacos.naming.expireInstance=true

### will be removed and replaced by `nacos.naming.clean` properties
nacos.naming.empty-service.auto-clean=true
nacos.naming.empty-service.clean.initial-delay-ms=50000
nacos.naming.empty-service.clean.period-time-ms=30000

### Add in 2.0.0
### The interval to clean empty service, unit: milliseconds.
# nacos.naming.clean.empty-service.interval=60000

### The expired time to clean empty service, unit: milliseconds.
# nacos.naming.clean.empty-service.expired-time=60000

### The interval to clean expired metadata, unit: milliseconds.
# nacos.naming.clean.expired-metadata.interval=5000

### The expired time to clean metadata, unit: milliseconds.
# nacos.naming.clean.expired-metadata.expired-time=60000

### The delay time before push task to execute from service changed, unit: milliseconds.
# nacos.naming.push.pushTaskDelay=500

### The timeout for push task execute, unit: milliseconds.
# nacos.naming.push.pushTaskTimeout=5000

### The delay time for retrying failed push task, unit: milliseconds.
# nacos.naming.push.pushTaskRetryDelay=1000

### Since 2.0.3
### The expired time for inactive client, unit: milliseconds.
# nacos.naming.client.expired.time=180000

#*************** CMDB Module Related Configurations ***************#
### The interval to dump external CMDB in seconds:
# nacos.cmdb.dumpTaskInterval=3600

### The interval of polling data change event in seconds:
# nacos.cmdb.eventTaskInterval=10

### The interval of loading labels in seconds:
# nacos.cmdb.labelTaskInterval=300

### If turn on data loading task:
# nacos.cmdb.loadDataAtStart=false


#*************** Metrics Related Configurations ***************#
### Metrics for prometheus
#management.endpoints.web.exposure.include=*

### Metrics for elastic search
management.metrics.export.elastic.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200

### Metrics for influx
management.metrics.export.influx.enabled=false
#management.metrics.export.influx.db=springboot
#management.metrics.export.influx.uri=http://localhost:8086
#management.metrics.export.influx.auto-create-db=true
#management.metrics.export.influx.consistency=one
#management.metrics.export.influx.compressed=true

#*************** Access Log Related Configurations ***************#
### If turn on the access log:
server.tomcat.accesslog.enabled=true

### The access log pattern:
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i

### The directory of access log:
server.tomcat.basedir=file:.

#*************** Access Control Related Configurations ***************#
### If enable spring security, this option is deprecated in 1.2.0:
#spring.security.enabled=false

### The ignore urls of auth, is deprecated in 1.2.0:
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**

### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=nacos

### If turn on auth system:
nacos.core.auth.enabled=false

### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=true

### Since 1.4.1, Turn on/off white auth for user-agent: nacos-server, only for upgrade from old version.
nacos.core.auth.enable.userAgentAuthWhite=false

### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
### The two properties is the white list for auth and used by identity the request from other server.
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security

### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789

### worked when nacos.core.auth.system.type=ldap,{0} is Placeholder,replace login username
#nacos.core.auth.ldap.url=ldap://localhost:389
#nacos.core.auth.ldap.basedc=dc=example,dc=org
#nacos.core.auth.ldap.userDn=cn=admin,${nacos.core.auth.ldap.basedc}
#nacos.core.auth.ldap.password=admin
#nacos.core.auth.ldap.userdn=cn={0},dc=example,dc=org


#*************** Istio Related Configurations ***************#
### If turn on the MCP server:
nacos.istio.mcp.server.enabled=false

#*************** Core Related Configurations ***************#

### set the WorkerID manually
# nacos.core.snowflake.worker-id=

### Member-MetaData
# nacos.core.member.meta.site=
# nacos.core.member.meta.adweight=
# nacos.core.member.meta.weight=

### MemberLookup
### Addressing pattern category, If set, the priority is highest
# nacos.core.member.lookup.type=[file,address-server]
## Set the cluster list with a configuration file or command-line argument
# nacos.member.list=192.168.16.101:8847?raft_port=8807,192.168.16.101?raft_port=8808,192.168.16.101:8849?raft_port=8809
## for AddressServerMemberLookup
# Maximum number of retries to query the address server upon initialization
# nacos.core.address-server.retry=5
## Server domain name address of [address-server] mode
# address.server.domain=jmenv.tbsite.net
## Server port of [address-server] mode
# address.server.port=8080
## Request address of [address-server] mode
# address.server.url=/nacos/serverlist

#*************** JRaft Related Configurations ***************#

### Sets the Raft cluster election timeout, default value is 5 second
# nacos.core.protocol.raft.data.election_timeout_ms=5000
### Sets the amount of time the Raft snapshot will execute periodically, default is 30 minute
# nacos.core.protocol.raft.data.snapshot_interval_secs=30
### raft internal worker threads
# nacos.core.protocol.raft.data.core_thread_num=8
### Number of threads required for raft business request processing
# nacos.core.protocol.raft.data.cli_service_thread_num=4
### raft linear read strategy. Safe linear reads are used by default, that is, the Leader tenure is confirmed by heartbeat
# nacos.core.protocol.raft.data.read_index_type=ReadOnlySafe
### rpc request timeout, default 5 seconds
# nacos.core.protocol.raft.data.rpc_request_timeout_ms=5000

#*************** Distro Related Configurations ***************#

### Distro data sync delay time, when sync task delayed, task will be merged for same data key. Default 1 second.
# nacos.core.protocol.distro.data.sync.delayMs=1000

### Distro data sync timeout for one sync data, default 3 seconds.
# nacos.core.protocol.distro.data.sync.timeoutMs=3000

### Distro data sync retry delay time when sync data failed or timeout, same behavior with delayMs, default 3 seconds.
# nacos.core.protocol.distro.data.sync.retryDelayMs=3000

### Distro data verify interval time, verify synced data whether expired for a interval. Default 5 seconds.
# nacos.core.protocol.distro.data.verify.intervalMs=5000

### Distro data verify timeout for one verify, default 3 seconds.
# nacos.core.protocol.distro.data.verify.timeoutMs=3000

### Distro data load retry delay when load snapshot data failed, default 30 seconds.
# nacos.core.protocol.distro.data.load.retryDelayMs=30000

 
  (2)编辑 nacos-logback.xml 文件并复制以下指定内容:

vim /mydata/nacos/conf/nacos-logback.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright 1999-2018 Alibaba Group Holding Ltd.
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<configuration scan="true" scanPeriod="10 seconds">

    <springProperty scope="context" name="logPath" source="nacos.logs.path" defaultValue="${nacos.home}/logs"/>
    <property name="LOG_HOME" value="${logPath}"/>

    <appender name="cmdb-main"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${nacos.home}/logs/cmdb-main.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${nacos.home}/logs/cmdb-main.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="naming-server"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-server.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-server.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="async-naming-server" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="naming-server"/>
    </appender>

    <appender name="naming-raft"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-raft.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-raft.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="async-naming-raft" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="naming-raft"/>
    </appender>


    <appender name="naming-distro"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-distro.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-distro.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="async-naming-distro" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="naming-distro"/>
    </appender>

    <appender name="naming-event"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-event.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-event.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="async-naming-event" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="naming-event"/>
    </appender>

    <appender name="naming-push"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-push.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-push.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="naming-rt"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-rt.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-rt.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%msg%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="naming-performance"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/naming-performance.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/naming-performance.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--config module logback config-->
    <appender name="dumpFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-dump.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-dump.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="pullFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-pull.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-pull.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>20MB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>128MB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="fatalFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-fatal.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-fatal.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>20MB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>128MB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="memoryFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-memory.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-memory.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>20MB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>128MB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="pullCheckFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-pull-check.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-pull-check.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%msg%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="clientLog"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-client-request.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-client-request.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date|%msg%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="traceLog"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-trace.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-trace.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date|%msg%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="notifyLog"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-notify.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-notify.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>1GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="startLog"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/config-server.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/config-server.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>512MB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="rootFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/nacos.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/nacos.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>512MB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="nacos-address"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/nacos-address.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/nacos-address.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="istio-main"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/istio-main.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/istio-main.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="core-auth"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/core-auth.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/core-auth.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="protocol-raft"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/protocol-raft.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/protocol-raft.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="protocol-distro"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/protocol-distro.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/protocol-distro.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="nacos-cluster"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/nacos-cluster.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/nacos-cluster.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="alipay-jraft"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/alipay-jraft.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/alipay-jraft.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    
    <!--TPS control -->
    <appender name="tps-control"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/tps-control.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/tps-control.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <appender name="tps-control-digest"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/tps-control-digest.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/tps-control-digest.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <appender name="tps-control-detail"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/tps-control-detail.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/tps-control-detail.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    
    <appender name="remote"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/remote.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/remote.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <appender name="remote-digest"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/remote-digest.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/remote-digest.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <appender name="remote-push"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/remote-push.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/remote-push.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
            <maxFileSize>2GB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>7GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>%date %level %msg%n%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    
    <logger name="com.alibaba.nacos.address.main" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="nacos-address"/>
    </logger>

    <logger name="com.alibaba.nacos.cmdb.main" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="cmdb-main"/>
    </logger>
    
    <logger name="com.alibaba.nacos.core.remote" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="remote"/>
    </logger>
    <logger name="com.alibaba.nacos.core.remote.push" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="remote-push"/>
    </logger>
    
    <logger name="com.alibaba.nacos.core.remote.digest" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="remote-digest"/>
    </logger>
    
    <!-- TPS Control-->
    <logger name="com.alibaba.nacos.core.remote.control.digest" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="tps-control-digest"/>
    </logger>
    
    <logger name="com.alibaba.nacos.core.remote.control.detail" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="tps-control-detail"/>
    </logger>
    
    <logger name="com.alibaba.nacos.core.remote.control" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="tps-control"/>
    </logger>
    
    <logger name="com.alibaba.nacos.naming.main" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="async-naming-server"/>
    </logger>
    <logger name="com.alibaba.nacos.naming.raft" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="async-naming-raft"/>
    </logger>
    <logger name="com.alibaba.nacos.naming.distro" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="async-naming-distro"/>
    </logger>
    <logger name="com.alibaba.nacos.naming.event" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="async-naming-event"/>
    </logger>
    <logger name="com.alibaba.nacos.naming.push" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="naming-push"/>
    </logger>
    <logger name="com.alibaba.nacos.naming.rt" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="naming-rt"/>
    </logger>
    <logger name="com.alibaba.nacos.naming.performance" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="naming-performance"/>
    </logger>

    <logger name="com.alibaba.nacos.config.dumpLog" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="dumpFile"/>
    </logger>
    <logger name="com.alibaba.nacos.config.pullLog" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="pullFile"/>
    </logger>
    <logger name="com.alibaba.nacos.config.pullCheckLog" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="pullCheckFile"/>
    </logger>
    <logger name="com.alibaba.nacos.config.fatal" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="fatalFile"/>
    </logger>
    <logger name="com.alibaba.nacos.config.monitorLog" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="memoryFile"/>
    </logger>

    <logger name="com.alibaba.nacos.config.clientLog" additivity="false">
        <level value="info"/>
        <appender-ref ref="clientLog"/>
    </logger>

    <logger name="com.alibaba.nacos.config.notifyLog" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="notifyLog"/>
    </logger>

    <logger name="com.alibaba.nacos.config.traceLog" additivity="false">
        <level value="info"/>
        <appender-ref ref="traceLog"/>
    </logger>

    <logger name="com.alibaba.nacos.config.startLog" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="startLog"/>
    </logger>

    <logger name="com.alibaba.nacos.istio.main" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="istio-main"/>
    </logger>

    <logger name="com.alibaba.nacos.core.auth" additivity="false">
        <level value="DEBUG"/>
        <appender-ref ref="core-auth"/>
    </logger>

    <logger name="com.alibaba.nacos.core.protocol.raft" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="protocol-raft"/>
    </logger>

    <logger name="com.alipay.sofa.jraft" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="alipay-jraft"/>
    </logger>

    <logger name="com.alibaba.nacos.core.protocol.distro" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="protocol-distro"/>
    </logger>

    <logger name="com.alibaba.nacos.core.cluster" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="nacos-cluster"/>
    </logger>

    <springProfile name="standalone">
        <logger name="org.springframework">
            <appender-ref ref="CONSOLE"/>
            <level value="INFO"/>
        </logger>

        <logger name="org.apache.catalina.startup.DigesterFactory">
            <appender-ref ref="CONSOLE"/>
            <level value="INFO"/>
        </logger>

        <logger name="org.apache.catalina.util.LifecycleBase">
            <appender-ref ref="CONSOLE"/>
            <level value="ERROR"/>
        </logger>

        <logger name="org.apache.coyote.http11.Http11NioProtocol">
            <appender-ref ref="CONSOLE"/>
            <level value="WARN"/>
        </logger>

        <logger name="org.apache.tomcat.util.net.NioSelectorPool">
            <appender-ref ref="CONSOLE"/>
            <level value="WARN"/>
        </logger>
    </springProfile>

    <logger name="com.alibaba.nacos.core.listener.StartingApplicationListener">
        <appender-ref ref="CONSOLE"/>
        <level value="INFO"/>
    </logger>

    <logger name="com.alibaba.nacos.common.notify.NotifyCenter">
        <appender-ref ref="CONSOLE"/>
        <level value="INFO"/>
    </logger>

    <logger name="com.alibaba.nacos.sys.file.WatchFileCenter">
        <appender-ref ref="CONSOLE"/>
        <level value="INFO"/>
    </logger>

    <logger name="com.alibaba.nacos.common.executor.ThreadPoolManager">
        <appender-ref ref="CONSOLE"/>
        <level value="INFO"/>
    </logger>

    <root>
        <level value="INFO"/>
        <appender-ref ref="rootFile"/>
    </root>
</configuration>

 
  方式二:将发布版安装包解压出来的 conf 目录下的 application.properties 和 nacos-logback.xml 文件通过命令 rz 上传到 Centos7 的 /mydata/nacos/conf/ 目录。(Nacos Server镜像和发布版压缩包都是 v2.1.1 版)
 
将发布版安装包解压出来的 conf 目录下的 application.properties 和 nacos-logback.xml 文件通过命令 rz 上传到 Centos7 的 /mydata/nacos/conf/ 目录
 
  方式三:启动一个临时的 Nacos Server 容器,将容器内的 application.properties 和 nacos-logback.xml 文件复制到主机的 /mydata/nacos/conf 目录,随后删除这个临时的容器。(Nacos Server镜像是 v2.1.1 版)
 
  (1)启动一个临时的 Nacos Server 容器,名称设置为 nacos ,稍后会删除这个容器。

docker run --name nacos -e MODE=standalone -p 8848:8848 nacos/nacos-server:v2.1.1

 
  第一次运行可能会打印日志,按 Ctrl + C 退出,再重新启动 Nacos Server 容器即可,命令是:docker start nacos注意 nacos 是运行时创建的名称,即 --name 后面的名称) 或者 docker start 容器id命令 docker ps -a 查看所有容器的运行状态(包含正在运行的和停止的),命令 docker ps 只查看正在运行的容器状态。如图所示:
 
第一次启动 Nacos Server 容器会打印日志
 
命令 docker ps -a 查看所有容器的运行状态(包含正在运行的和停止的),重新启动Nacos Server容器
 
  (2)复制容器内的 application.properties 和 nacos-logback.xml 文件到主机的 /mydata/nacos/conf 目录。

docker cp nacos:/home/nacos/conf /mydata/nacos/

 
复制容器内的 application.properties 和 nacos-logback.xml 文件到主机的 /mydata/nacos/conf 目录
 
  (3)先停止临时的 Nacos Server 容器。两种方式:容器名称容器ID

docker stop nacos

  或者

docker stop cf5

 
docker stop cf5 先停止 Nacos Server 容器
 
  (4)再删除临时的 Nacos Server 容器。两种方式:容器名称容器ID注意,一定要删除临时容器,不然后面再创建新的 Nacos Server 容器会失败。可以创建 nacos1、nacos2、nacos3…无数个不同名称容器,但 Docker 不允许容器重名。我有篇博客,读者有兴趣可以去看看:《如何优雅地删除Docker镜像和容器(超详细)》

docker rm nacos

  或者

docker rm cf5

 
docker rm cf5 再删除临时的 Nacos Server 容器
 

4.2.4 更改 /mydata/nacos 目录下所有文件的权限为可读、可写、可执行

 

chmod 777 -R /mydata/nacos

 

4.2.5 以挂卷自定义配置文件的方式运行新的 Nacos Server 容器(待优化,可跳过直接看 4.2.6 小节)

 

docker run --name nacos -e MODE=standalone -v /mydata/nacos/conf/application.properties:/home/nacos/conf/application.properties -v /mydata/nacos/logs:/home/nacos/logs -p 8848:8848 -d nacos/nacos-server:v2.1.1

 
以挂卷自定义配置文件的方式运行新的 Nacos Server 容器
 
挂卷的 logs 目录有日志文件

 

4.2.6 以挂卷自定义配置文件的方式运行新的 Nacos Server 容器(已优化)

 
  在 4.2.5 小节中,运行一个 Nacos Server 容器,只设置为单机模式(MODE=standalone),并没有设置其它参数,例如 -Xms(最小堆内存)、-Xmx(最大堆内存)、-Xmn(新生代内存)。我们只用来学习,默认的启动内存太大了,没必要。重新优化下面的执行命令,只新增 JVM_XMS(最小堆内存)JVM_XMX(最大堆内存)JVM_XMN(新生代内存) 三个参数。详细参数请看前面的 【Docker 版 Nacos Server 属性配置列表】
 

docker run --name nacos -e MODE=standalone -e JVM_XMS=256m -e JVM_XMX=256m -e JVM_XMN=128m -v /mydata/nacos/conf/application.properties:/home/nacos/conf/application.properties -v /mydata/nacos/logs:/home/nacos/logs -p 8848:8848 -d nacos/nacos-server:v2.1.1

 
以挂卷自定义配置文件的方式运行新的 Nacos Server 容器(已优化)
 
  访问:http://192.168.50.134:8848/nacos ,Nacos 页面也是能正常登录的,默认账号和密码都是 nacos
 
访问:http://192.168.50.134:8848/nacos ,Nacos 页面也是能正常登录的。
 

4.2.7 配置 Nacos Server 容器开机启动

 

docker update --restart=always nacos

 

4.2.8 容器的启动、停止、删除、重新启动、查看运行状态。

(1)启动容器

docker start nacos

docker start 容器ID

(2)停止容器

docker stop nacos

docker stop 容器ID

(3)删除容器

docker rm nacos

docker rm 容器ID

(4)重新启动容器

docker restart nacos

docker restart 容器ID

(5)查看容器运行状态
 
查看所有容器的运行状态,包括运行的和停止的

docker ps -a

查看所有运行中的容器的状态,不包括停止的

docker ps

 

4.3 挂卷自定义配置文件方式新建并运行Nacos Server容器(使用外部数据库 MySQL)

 
  有些重复的步骤请认真阅读第 4.2.1 至 4.2.4 小节内容,此处不再重复。
 

4.3.1 以挂卷自定义配置文件的方式运行新的 Nacos Server 容器,并指定 MySQL 数据源的参数

 
  【要注意的参数设置】
 

1、MYSQL_SERVICE_HOST:自己数据库的IP。
 
2、MYSQL_SERVICE_USER:自己数据库支持远程连接的用户名。
 
3、MYSQL_SERVICE_PASSWORD:自己数据库支持远程连接的密码。
 
4、MYSQL_SERVICE_DB_PARAMconnectTimeoutsocketTimeout 可设置合适的大小,serverTimezone 可设置为 GMT%2b8 或者 Asia/Shanghai

 

docker run --name nacos -e MODE=standalone -e JVM_XMS=256m -e JVM_XMX=256m -e JVM_XMN=128m -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.50.1 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos_config -e MYSQL_SERVICE_USER=zyt -e MYSQL_SERVICE_PASSWORD=123456 -e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC" -v /mydata/nacos/conf/application.properties:/home/nacos/conf/application.properties -v /mydata/nacos/logs:/home/nacos/logs -p 8848:8848 -d nacos/nacos-server:v2.1.1

 
以挂卷自定义配置文件的方式运行新的 Nacos Server 容器,并指定 MySQL 数据源的参数
 
  访问:http://192.168.50.134:8848/nacos ,Nacos 页面也是能正常登录和进入管理页面的,默认账号和密码都是 nacos
 
数据来自本地MySQL数据库 nacos_config
 

4.3.2 配置 Nacos Server 容器开机启动

 

docker update --restart=always nacos

 

4.3.3 容器的启动、停止、删除、重新启动、查看运行状态。

(1)启动容器

docker start nacos

docker start 容器ID

(2)停止容器

docker stop nacos

docker stop 容器ID

(3)删除容器

docker rm nacos

docker rm 容器ID

(4)重新启动容器

docker restart nacos

docker restart 容器ID

(5)查看容器运行状态
 
查看所有容器的运行状态,包括运行的和停止的

docker ps -a

查看所有运行中的容器的状态,不包括停止的

docker ps

 

五、Nacos Server在 Window 10 安装部署(单机模式)

 
  运行 Nacos Server 的前提需要安装 JDK ,如果没有安装,可参考:《最新JDK8(jdk-8u341)在Win10安装部署(超详细)》
 

5.1 下载 nacos-server-2.1.1 安装包

 
  nacos-server-2.1.1安装包下载地址https://github.com/alibaba/nacos/releases/tag/2.1.1
 
下载 nacos-server-2.1.1 安装包
 

5.2 运行Nacos Server服务

 
  将下载的 nacos-server-2.1.1.zip 安装包解压到指定目录,不要有中文路径。启动前先修改运行内存,如果本机内存足够大可以忽略。
 
  在 nacos 包下的 bin 目录里,使用 Notepad++ 或记事本打开 startup.cmd 文件,NACOS_JVM_OPTS 参数值修改为 NACOS_JVM_OPTS=-Xms256m -Xmx256m -Xmn128m 。如图所示:
 
修改startup.cmd中NACOS_JVM_OPTS参数值
 
  如果我们直接双击 startup.cmd 进行启动,Nacos Server 默认会以集群模式(cluster)启动,导致报错而运行失败。如图所示。
 
如果我们直接双击 startup.cmd 进行启动,Nacos Server 默认会以集群模式(cluster)启动,导致报错而运行失败
 
  正确的运行方式是,使用参数“-m standalone”以单机模式运行。这种方式不推荐,稍后推荐更好的做法。 在路径框上输入 cmd 并回车,打开的 cmd 窗口就已经是 D:\Develop\nacos\bin 路径下了(每个人的 nacos 安装包路径不一样)。全命令是:startup.cmd -m standalone
 
在路径框上输入 cmd 并回车,打开的 cmd 窗口就已经是 D:\Develop\nacos\bin 路径下了
 
使用startup.cmd -m standalone命令启动 Nacos Server服务
 
  浏览器输入:http://localhost:8848/nacos ,在登录页面输入默认的账号和密码,都是 nacos ,可以进入到 Nacos 管理页面。
 
浏览器输入:http://localhost:8848/nacos ,可以进入到 Nacos 管理页面
 
  另外一种更好的以单机模式的运行方式是,不使用参数“-m standalone”,修改 startup.cmd 中的 “MODE”为 standalone。如图所示:
 
更好的以单机模式的运行方式是,不使用参数“-m standalone”,修改 startup.cmd 中的 “MODE”为 standalone
 
  这样修改后,直接双击运行 startup.cmd ,Nacos Server 服务以单机模式启动,并不会报错,需要以参数运行的方式多麻烦,这种方式简单又方便。
 
直接双击运行 startup.cmd ,Nacos Server 服务以单机模式启动,并不会报错
 

六、Nacos Server在 Centos7 安装部署(集群模式)

 
  准备三台 Centos7 虚拟机(Centos7_VM1、Centos7_VM2、Centos7_VM3),用来模拟3个 Nacos Server 服务组成一个集群。 Centos7_VM1的IP地址为:192.168.50.132Centos7_VM2的IP地址为:192.168.50.133Centos7_VM3的IP地址为:192.168.50.134
 

6.1 Centos7_VM1 虚拟机安装部署第一个 Nacos Server 服务

 
  主要处理三个部分:服务运行端口号集群模式运行内存配置集群配置文件
 

6.1.1 修改服务运行端口号

 
  修改 nacos/conf 目录下的 application.properties 文件,将 server.port=8848 修改为 server.port=8850
 
修改 nacos/conf 目录下的 application.properties 文件,将 server.port=8848 修改为 server.port=8850
 

6.1.2 修改集群模式运行内存

 
  默认的集群模式运行内存很大,-Xms2g -Xmx2g -Xmn1g ,在学习环境下没有必要,所以尽量设置小内存,例如 -Xms256m -Xmx256m -Xmn128m
 
  修改 nacos/bin 目录下的 startup.sh 脚本,修改内容如图所示:
 
设置集群模式运行内存

 

6.1.3 配置集群配置文件

 
  在 nacos/conf 目录下,将 cluster.conf.example 复制并重命名为 cluster.conf ,这是用来配置集群配置文件。主要设置三个 Nacos Server 对应的服务器 IP 和端口号。
 

cp cluster.conf.example cluster.conf

 
在 nacos/conf 目录下,将 cluster.conf.example 复制并重命名为 cluster.conf
 
  编辑 cluster.conf ,填入以下内容。
 

vim cluster.conf
192.168.50.132:8850
192.168.50.133:8852
192.168.50.134:8854

 
编辑 cluster.conf

 

6.2 Centos7_VM2 虚拟机安装部署第二个 Nacos Server 服务

 
  主要处理三个部分:服务运行端口号集群模式运行内存配置集群配置文件
 

6.2.1 修改服务运行端口号

 
  修改 nacos/conf 目录下的 application.properties 文件,将 server.port=8848 修改为 server.port=8852
 
修改 nacos/conf 目录下的 application.properties 文件,将 server.port=8848 修改为 server.port=8852
 

6.2.2 修改集群模式运行内存

 
  默认的集群模式运行内存很大,-Xms2g -Xmx2g -Xmn1g ,在学习环境下没有必要,所以尽量设置小内存,例如 -Xms256m -Xmx256m -Xmn128m
 
  修改 nacos/bin 目录下的 startup.sh 脚本,修改内容如图所示:
 
设置集群模式运行内存

 

6.2.3 配置集群配置文件

 
  在 nacos/conf 目录下,将 cluster.conf.example 复制并重命名为 cluster.conf ,这是用来配置集群配置文件。主要设置三个 Nacos Server 对应的服务器 IP 和端口号。
 

cp cluster.conf.example cluster.conf

 
在 nacos/conf 目录下,将 cluster.conf.example 复制并重命名为 cluster.conf
 
  编辑 cluster.conf ,填入以下内容。
 

vim cluster.conf
192.168.50.132:8850
192.168.50.133:8852
192.168.50.134:8854

 
编辑 cluster.conf

 

6.3 Centos7_VM3 虚拟机安装部署第三个 Nacos Server 服务

 
  主要处理三个部分:服务运行端口号集群模式运行内存配置集群配置文件
 

6.3.1 修改服务运行端口号

 
  修改 nacos/conf 目录下的 application.properties 文件,将 server.port=8848 修改为 server.port=8854
 
修改 nacos/conf 目录下的 application.properties 文件,将 server.port=8848 修改为 server.port=8854
 

6.3.2 修改集群模式运行内存

 
  默认的集群模式运行内存很大,-Xms2g -Xmx2g -Xmn1g ,在学习环境下没有必要,所以尽量设置小内存,例如 -Xms256m -Xmx256m -Xmn128m
 
  修改 nacos/bin 目录下的 startup.sh 脚本,修改内容如图所示:
 
设置集群模式运行内存

 

6.3.3 配置集群配置文件

 
  在 nacos/conf 目录下,将 cluster.conf.example 复制并重命名为 cluster.conf ,这是用来配置集群配置文件。主要设置三个 Nacos Server 对应的服务器 IP 和端口号。
 

cp cluster.conf.example cluster.conf

 
在 nacos/conf 目录下,将 cluster.conf.example 复制并重命名为 cluster.conf
 
  编辑 cluster.conf ,填入以下内容。
 

vim cluster.conf
192.168.50.132:8850
192.168.50.133:8852
192.168.50.134:8854

 
编辑 cluster.conf

 

6.4 分别运行三个 Nacos Server 服务(使用内置数据源 Derby 数据库)

 
  注意,如果直接使用命令 sh startup.sh 去运行服务,那是使用外置数据源(MySQL),没有配置外置数据源情况下,服务会运行报错:java.lang.RuntimeException: [db-load-error]load jdbc.properties error。命令 sh startup.sh -p embedded 才是使用内置数据源 Derby 数据库
 

sh startup.sh -p embedded

 
  在 nacos 目录下,使用命令 tail -f logs/start.out 可以实时查看 Nacos Server 服务的启动情况。
 

tail -f logs/start.out

 
  注意,假设服务的端口号设置为 8850 ,那么在保持防火墙继续启用的情况下,一定要放行 7850 端口(规则:8850 - 1000 = 7850)。或者直接关闭防火墙。亲测过,不进行端口放行或者关闭防火墙,会永不休止地打印 Nacos is starting...,其实服务运行已失败!
 
  正常运行的服务也会打印 Nacos is starting...,但最后会打印这么一行:2023-04-24 xx:xx:xx,xxx INFO Nacos started successfully in cluster mode. use embedded storage
 
  如何放行端口号或关闭防火墙,请看我的另一篇博客:《Centos中防火墙(Firewall)操作(允许端口、删除端口、查看端口列表、重启、停止、开机启动等)》
 
  浏览器输入:http://192.168.50.132:8850/nacos登录用户名和密码都是 nacos ,在管理页面的“集群管理” - “节点列表” 可以看到,三个 Nacos Server 节点都是正常运行的。
 
“集群管理”菜单下的“节点列表”显示正常运行的 Nacos Server 节点。
 

6.5 分别运行三个 Nacos Server 服务(使用外置数据源 MySQL 数据库)

 
  使用命令 sh startup.sh 去运行 Nacos Server 服务,那是使用外置数据源(MySQL)
 

sh startup.sh

 
  在 nacos 目录下,使用命令 tail -f logs/start.out 可以实时查看 Nacos Server 服务的启动情况。
 

tail -f logs/start.out

 

6.5.1 三个 Nacos Server 服务都配置相同的外置数据源(MySQL)

 
  在 nacos/conf 目录下,编辑 application.properties 文件,设置数据源平台为 MySQL 和配置数据源信息。修改内容如下:
 

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.url.0=jdbc:mysql://数据库IP:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=数据库支持远程连接的用户名
db.password.0=数据库支持远程连接的用户名密码

 
三个 Nacos Server 服务都配置相同的外置数据源(MySQL)
 
  正常运行的服务会打印 Nacos is starting...,最后会打印这么一行:2023-04-24 xx:xx:xx,xxx INFO Nacos started successfully in cluster mode. use embedded storage。如果是永不休止地打印 Nacos is starting... ,那就是服务运行异常了,需要排查。
 
  浏览器输入:http://192.168.50.133:8852/nacos登录用户名和密码都是 nacos ,在管理页面的“集群管理” - “节点列表” 可以看到,三个 Nacos Server 节点都是正常运行的。
 
“集群管理”菜单下的“节点列表”显示正常运行的 Nacos Server 节点。
 

七、Nacos Server Docker版在 Centos7 安装部署(集群模式)

 
  准备三台 Centos7 虚拟机(Centos7_VM1、Centos7_VM2、Centos7_VM3),用来模拟3个 Nacos Server 服务组成一个集群。 Centos7_VM1的IP地址为:192.168.50.132Centos7_VM2的IP地址为:192.168.50.133Centos7_VM3的IP地址为:192.168.50.134
 

7.1 统一Nacos Server Docker版本

 
  统一拉取的 Nacos Server Docker 镜像是 v2.1.1 版。
 

docker pull nacos/nacos-server:v2.1.1

 

7.2 三个Centos7虚拟机运行Nacos Server容器(使用外置数据库 MySQL)

 
  【Docker 版 Nacos Server 属性配置列表】
 

属性名称描述选项
MODE系统启动方式: 集群/单机cluster/standalone 默认 cluster
NACOS_SERVERS集群地址p1:port1空格ip2:port2 空格ip3:port3
PREFER_HOST_MODE支持IP还是域名模式hostname/ip 默认 IP
NACOS_SERVER_PORTNacos 运行端口默认 8848
NACOS_SERVER_IP多网卡模式下可以指定IP
SPRING_DATASOURCE_PLATFORM单机模式下支持MYSQL数据库mysql / 空 默认 : 空
MYSQL_SERVICE_HOST数据库连接地址
MYSQL_SERVICE_PORT数据库端口默认 : 3306
MYSQL_SERVICE_DB_NAME数据库库名
MYSQL_SERVICE_USER数据库用户名
MYSQL_SERVICE_PASSWORD数据库用户密码
MYSQL_SERVICE_DB_PARAM数据库连接参数默认 : characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
MYSQL_DATABASE_NUM数据库个数默认 : 1
JVM_XMS-Xms默认 : 1g
JVM_XMX-Xmx默认 : 1g
JVM_XMN-Xmn512m
JVM_MS- XX:MetaspaceSize默认 : 128m
JVM_MMS-XX:MaxMetaspaceSize默认 : 320m
NACOS_DEBUG是否开启远程DEBUGy/n 默认 : n
TOMCAT_ACCESSLOG_ENABLEDserver.tomcat.accesslog.enabled默认 : false
NACOS_AUTH_SYSTEM_TYPE权限系统类型选择,目前只支持nacos类型默认 : nacos
NACOS_AUTH_ENABLE是否开启权限系统默认 : false
NACOS_AUTH_TOKEN_EXPIRE_SECONDStoken 失效时间默认 : 18000
NACOS_AUTH_TOKENtoken注意:该环境变量在Nacos 2.2.1版本中已移除
NACOS_AUTH_CACHE_ENABLE权限缓存开关 ,开启后权限缓存的更新默认有15秒的延迟默认 : false
MEMBER_LIST通过环境变量的方式设置集群地址例子 : 192.168.16.101:8847?raft_port=8807,192.168.16.101:8848?raft_port=8808,192.168.16.101:8849?raft_port=8809
EMBEDDED_STORAGE是否开启集群嵌入式存储模式embedded 默认 : none
NACOS_AUTH_CACHE_ENABLEnacos.core.auth.caching.enabled默认 : false
NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLEnacos.core.auth.enable.userAgentAuthWhite默认 : false
NACOS_AUTH_IDENTITY_KEYnacos.core.auth.server.identity.key注意:该环境变量在Nacos 2.2.1版本中已移除
NACOS_AUTH_IDENTITY_VALUEnacos.core.auth.server.identity.value注意:该环境变量在Nacos 2.2.1版本中已移除
NACOS_SECURITY_IGNORE_URLSnacos.security.ignore.urls默认 : /,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**

 

7.2.1 Centos7_VM1 虚拟机创建和运行第一个 Nacos Server 容器

 
  先创建一个目录:mkdir -p /mydata/nacos/conf

mkdir -p /mydata/nacos/conf

 
  其次在 /mydata/nacos/conf 目录下新建 cluster.conf 文件,填入 Nacos Server 集群的服务器IP和端口号。

vim /mydata/nacos/conf/cluster.conf
192.168.50.132:8851
192.168.50.133:8853
192.168.50.134:8855

 
1、先创建目录 mkdir -p /mydata/nacos/conf ,再新建 cluster.conf 并填入Nacos Server 集群的服务器IP和端口号
 
  【要注意的参数设置】
 

1、JVM_XMS:最小堆内存(-Xms)。
 
2、JVM_XMX:最大堆内存(-Xmx)。
 
3、JVM_XMN:新生代内存(-Xmn)。
 
4、NACOS_SERVERS:集群地址。
 
5、SPRING_DATASOURCE_PLATFORM:数据源平台。
 
6、MYSQL_SERVICE_HOST:数据库连接地址。
 
7、MYSQL_SERVICE_USER:数据库支持远程连接的用户名。
 
8、MYSQL_SERVICE_PASSWORD:数据库支持远程连接的密码。
 
9、MYSQL_SERVICE_DB_PARAMconnectTimeoutsocketTimeout 可设置合适的大小,serverTimezone 可设置为 GMT%2b8 或者 Asia/Shanghai

 
  Nacos Server 容器名称命名为 nacos-c1(名称随意,没有要求) 。对 /mydata/nacos/conf/cluster.conf 文件进行挂卷。Nacos Server运行端口设置为 8851 ,需要在防火墙中设置放行此端口,或者关闭防火墙。如何放行端口号或关闭防火墙,请看我的另一篇博客:《Centos中防火墙(Firewall)操作(允许端口、删除端口、查看端口列表、重启、停止、开机启动等)》
 

docker run --name nacos-c1 -e JVM_XMS=256m -e JVM_XMX=256m -e JVM_XMN=128m -e NACOS_SERVERS="192.168.50.132:8851 192.168.50.133:8853 192.168.50.134:8855" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.50.1 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos_config -e MYSQL_SERVICE_USER=zyt -e MYSQL_SERVICE_PASSWORD=123456 -e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC" -v /mydata/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf -p 8851:8848 -d nacos/nacos-server:v2.1.1

 
运行名称为 nacos-c1 的Nacos Server容器
 

7.2.2 Centos7_VM2 虚拟机创建和运行第二个 Nacos Server 容器

 
  先创建一个目录:mkdir -p /mydata/nacos/conf

mkdir -p /mydata/nacos/conf

 
  其次在 /mydata/nacos/conf 目录下新建 cluster.conf 文件,填入 Nacos Server 集群的服务器IP和端口号。

vim /mydata/nacos/conf/cluster.conf
192.168.50.132:8851
192.168.50.133:8853
192.168.50.134:8855

 
2、先创建目录 mkdir -p /mydata/nacos/conf ,再新建 cluster.conf 并填入Nacos Server 集群的服务器IP和端口号
 
  【要注意的参数设置】
 

1、JVM_XMS:最小堆内存(-Xms)。
 
2、JVM_XMX:最大堆内存(-Xmx)。
 
3、JVM_XMN:新生代内存(-Xmn)。
 
4、NACOS_SERVERS:集群地址。
 
5、SPRING_DATASOURCE_PLATFORM:数据源平台。
 
6、MYSQL_SERVICE_HOST:数据库连接地址。
 
7、MYSQL_SERVICE_USER:数据库支持远程连接的用户名。
 
8、MYSQL_SERVICE_PASSWORD:数据库支持远程连接的密码。
 
9、MYSQL_SERVICE_DB_PARAMconnectTimeoutsocketTimeout 可设置合适的大小,serverTimezone 可设置为 GMT%2b8 或者 Asia/Shanghai

 
  Nacos Server 容器名称命名为 nacos-c2(名称随意,没有要求) 。对 /mydata/nacos/conf/cluster.conf 文件进行挂卷。Nacos Server运行端口设置为 8853 ,需要在防火墙中设置放行此端口,或者关闭防火墙。如何放行端口号或关闭防火墙,请看我的另一篇博客:《Centos中防火墙(Firewall)操作(允许端口、删除端口、查看端口列表、重启、停止、开机启动等)》
 

docker run --name nacos-c2 -e JVM_XMS=256m -e JVM_XMX=256m -e JVM_XMN=128m -e NACOS_SERVERS="192.168.50.132:8851 192.168.50.133:8853 192.168.50.134:8855" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.50.1 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos_config -e MYSQL_SERVICE_USER=zyt -e MYSQL_SERVICE_PASSWORD=123456 -e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC" -v /mydata/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf -p 8853:8848 -d nacos/nacos-server:v2.1.1

 
运行名称为 nacos-c2 的Nacos Server容器
 

7.2.3 Centos7_VM3 虚拟机创建和运行第三个 Nacos Server 容器

 
  先创建一个目录:mkdir -p /mydata/nacos/conf

mkdir -p /mydata/nacos/conf

 
  其次在 /mydata/nacos/conf 目录下新建 cluster.conf 文件,填入 Nacos Server 集群的服务器IP和端口号。

vim /mydata/nacos/conf/cluster.conf
192.168.50.132:8851
192.168.50.133:8853
192.168.50.134:8855

 
3、先创建目录 mkdir -p /mydata/nacos/conf ,再新建 cluster.conf 并填入Nacos Server 集群的服务器IP和端口号
 
  【要注意的参数设置】
 

1、JVM_XMS:最小堆内存(-Xms)。
 
2、JVM_XMX:最大堆内存(-Xmx)。
 
3、JVM_XMN:新生代内存(-Xmn)。
 
4、NACOS_SERVERS:集群地址。
 
5、SPRING_DATASOURCE_PLATFORM:数据源平台。
 
6、MYSQL_SERVICE_HOST:数据库连接地址。
 
7、MYSQL_SERVICE_USER:数据库支持远程连接的用户名。
 
8、MYSQL_SERVICE_PASSWORD:数据库支持远程连接的密码。
 
9、MYSQL_SERVICE_DB_PARAMconnectTimeoutsocketTimeout 可设置合适的大小,serverTimezone 可设置为 GMT%2b8 或者 Asia/Shanghai

 
  Nacos Server 容器名称命名为 nacos-c3(名称随意,没有要求) 。对 /mydata/nacos/conf/cluster.conf 文件进行挂卷。Nacos Server运行端口设置为 8855 ,需要在防火墙中设置放行此端口,或者关闭防火墙。如何放行端口号或关闭防火墙,请看我的另一篇博客:《Centos中防火墙(Firewall)操作(允许端口、删除端口、查看端口列表、重启、停止、开机启动等)》
 

docker run --name nacos-c3 -e JVM_XMS=256m -e JVM_XMX=256m -e JVM_XMN=128m -e NACOS_SERVERS="192.168.50.132:8851 192.168.50.133:8853 192.168.50.134:8855" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.50.1 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos_config -e MYSQL_SERVICE_USER=zyt -e MYSQL_SERVICE_PASSWORD=123456 -e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC" -v /mydata/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf -p 8855:8848 -d nacos/nacos-server:v2.1.1

 
运行名称为 nacos-c3 的Nacos Server容器
 

7.2.4 浏览器浏览 Nacos 管理页面

 
  浏览器输入:http://192.168.50.132:8851/nacos默认的登录用户名和密码都是 nacos ,在管理页面的“集群管理” - “节点列表” 可以看到,三个 Nacos Server 节点都是正常运行的。
 
在管理页面的“集群管理” - “节点列表” 可以看到,三个 Nacos Server 节点都是正常运行的
 

7.2.5 分别配置三个 Nacos Server 容器开机启动(注意容器名称不能错)

 
(1)Centos7_VM1 虚拟机的 Nacos Server 容器 nacos-c1

docker update --restart=always nacos-c1

(2)Centos7_VM2 虚拟机的 Nacos Server 容器 nacos-c2

docker update --restart=always nacos-c2

(3)Centos7_VM3 虚拟机的 Nacos Server 容器 nacos-c3

docker update --restart=always nacos-c3

 

7.2.6 容器的启动、停止、删除、重新启动、查看运行状态。

(1)启动容器

docker start 容器名称

docker start 容器ID

(2)停止容器

docker stop 容器名称

docker stop 容器ID

(3)删除容器

docker rm 容器名称

docker rm 容器ID

(4)重新启动容器

docker restart 容器名称

docker restart 容器ID

(5)查看容器运行状态
 
查看所有容器的运行状态,包括运行的和停止的

docker ps -a

查看所有运行中的容器的状态,不包括停止的

docker ps

 

八、Nacos Server在 Window 10 安装部署(集群模式)

 

8.1 修改 startup.cmd 文件的集群模式运行内存

 
  【Nacos官方网址 - 集群部署说明】
  https://nacos.io/zh-cn/docs/v2/guide/admin/cluster-mode-quick-start.html
 
  修改 nacos/bin 目录下的 startup.cmd 运行文件。“MODE” 的值为默认的“cluster”。默认的集群模式运行内存 -Xms2g -Xmx2g -Xmn1g 三个参数值都很大,设置为 -Xms512m -Xmx512m -Xmn256m 足矣。
 
修改 nacos/bin 目录下的 startup.cmd 运行文件,“MODE” 的值为默认的“cluster”
 
修改默认的集群模式运行内存
 

8.2 配置集群配置文件 cluster.conf ,模拟3个Nacos Server服务组成集群

 
  在 nacos/conf 目录下,官方提供了一个 cluster.conf 文件的样例:cluster.conf.example,将其复制并修改为 cluster.conf 即可。在 cluster.conf 文件中新增 Nacos Server 集群所在的服务器IP和端口号,如图所示。
 

192.168.1.104:8848
192.168.1.104:8850
192.168.1.104:8852

 
cluster.conf.example 复制为 cluster.conf

 
在 cluster.conf 文件中新增 Nacos Server 集群所在的服务器IP和端口号
 

8.3 nacos 安装包复制为两份(nacos2和nacos3),修改各自的端口号。

 
  修改各自安装包 nacos/conf 目录下的 application.properties 配置文件的 server.port 端口号,nacos 为 8848 ,nacos2 为 8850 ,nacos3 为 8852
 
nacos 安装包复制为两份(nacos2和nacos3),修改各自的端口号
 

8.4 运行三个Nacos Server服务。

 
  直接双击 startup.cmd 运行,效果如下:
 
双击 startup.cmd 运行
 
  浏览器输入:localhost:8848/nacos用户名和密码都是 nacos ,“集群管理”菜单下的“节点列表”显示正常运行的 Nacos Server 节点。
 
“集群管理”菜单下的“节点列表”显示正常运行的 Nacos Server 节点。
 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Nacos 2.2.3是一款集服务注册与发现、配置管理和动态 DNS 服务于一体的开源项目。Nacos支持多种数据源,包括Oracle数据库。 与传统的配置中心不同,Nacos提供了更灵活的配置管理功能。它支持动态配置刷新和灰度发布,开发人员可以实时修改配置并将其发布到生产环境中,而无需重启服务。此外,Nacos还支持配置的命名空间隔离,确保不同的服务可以使用不同的配置。 对于Oracle版的Nacos 2.2.3,它集成了Oracle数据库作为数据源。这意味着Nacos可以直接与Oracle数据库交互,将配置信息存储在数据库中。这种集成可以更好地满足一些企业应用中对数据安全性和稳定性的要求。 使用Nacos 2.2.3 Oracle版,可以通过简单的配置实现服务注册与发现。服务提供者可以将自己的服务注册到Nacos,而服务消费者可以查询Nacos获取可用的服务列表。这样,服务提供者和消费者可以解耦,并且可以根据需求动态调整服务列表。 除了服务注册与发现,Nacos还提供了配置管理的功能。通过Nacos,开发人员可以集中管理应用程序所需的配置信息,并且可以实时修改这些配置。Nacos提供了Restful API和Web界面来管理配置,使得配置管理更加便捷。 总之,Nacos 2.2.3 Oracle版是一款功能强大的开源项目,通过集成Oracle数据库作为数据源实现了更高的数据安全性和稳定性,同时提供了服务注册与发现以及配置管理等功能,帮助企业和开发人员更好地构建可靠的分布式系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大白有点菜

你的鼓励决定文章的质量

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值