MySQL 数据库与 Nacos 搭建监控服务
我相信有不少小伙伴已经用过 eureka,那么问题来了,Nacos 是个啥?
看到这个标题,MySQL 数据库与 Nacos 搭建监控服务,它们有什么关系么?
其实是 Nacos 支持连接 MySQL,内部已配置好数据源、连接池供我们使用。如果使用其它数据源(比如信创要求,使用达梦数据库比较多),可以通过插件形式适配,模仿 MySQL 实现方式。具体如何实现,可参考 Nacos 的 github issues。
MySQL 是什么?
一句话概括:一款社区活跃的开源数据库(database)软件,已被 Oracle 公司收购。
nacos 是什么?
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
nacos 官方文档:目前推荐 2.x 版本
https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html
nacos 样例
http://console.nacos.io/nacos/index.html#/login
默认用户名与密码均为:nacos

Nacos 部署
项目环境
Nacos 依赖 Java 环境来运行。如果你是一名开发人员,或许需要准备如下环境:
- Maven 3.2.x+
- 64 bit JDK1.8+
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac
- Git 2.3.x
Git 版本不一定要与我保持一致,只要版本不是太老就行。
主要以 Linux 平台作为演示环境。关于 nacos 的获取(发行包、源码包),可以前往 github 开源仓库。
你可以通过源码和发行包两种方式来获取 Nacos。
个人推荐:下载发行包。关于版本,使用稳定版本(通常有 GA 标识),个人习惯使用官方推荐的上一个小版本。有特殊需求可以下载源码包,修改源码重新编译。
从 Github 获取源码方式,使用 git clone 命令,值得注意的是你需要部署 Git 环境:
1 | git clone https://github.com/alibaba/nacos.git |
nacos 开源仓库:
https://github.com/alibaba/nacos
目前 nacos 最新稳定版是 2.2.4:
https://github.com/alibaba/nacos/releases/tag/2.2.4
当你看到这篇博文时,nacos 最新稳定版可能已经更新到 2.2.4 或者更高的版本。
下载很缓慢,可以使用在线工具箱加速,雨月空间站(公共免费资源请适度使用):
https://tool.mintimate.cn/gh/
官方推荐版本为 2.2.3:
您可以在 Nacos 的 release notes及博客中找到每个版本支持的功能的介绍,当前推荐的稳定版本为 2.2.3。
快速开始
解压 nacos
1 | unzip nacos-server-$version.zip & tar -zxvf nacos-server-$version.tar.gz |
$version 指具体 nacos 版本号,比如具体版本:nacos-server-2.1.1。
Windows 平台建议下载以 .zip 结尾的压缩包:nacos-server-2.1.1.zip。
Linux 平台建议下载以 .tar.gz 结尾的压缩包:nacos-server-2.1.1.tar.gz。
修改配置文件
修改 conf 目录下的 application.properties 文件。
设置其中的 nacos.core.auth.plugin.nacos.token.secret.key 值,详情可查看鉴权 - 自定义密钥:
https://nacos.io/zh-cn/docs/v2/plugin/auth-plugin.html
注意,文档中的默认值
SecretKey012345678901234567890123456789012345678901234567890123456789和VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=为公开默认值,可用于临时测试,实际使用时请务必更换为自定义的其他有效值。
启动服务
注:Nacos 的运行需要以至少 2C4g60g*3 的机器配置下运行,集群模式 3 台双核 CPU、4GB 运行内存、60GB 硬盘存储空间。
Linux 平台以单机模式启动 nacos 服务:
1 | sh startup.sh -m standalone |
Windows 平台以单机模式启动 nacos 服务:
1 | startup.cmd -m standalone |
访问:http://127.0.0.1:8848/nacos 后,进入登录界面:

服务注册、发现以及配置管理
服务注册:
1 | curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=192.168.245.132&port=8080' |
参数说明:
- serviceName:服务名
- ip:配置自己远程地址
- port:端口(外部访问需要放通)
服务发现:
1 | curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName' |
发布配置:
1 | curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld" |
参数说明:
- dataId:数据 Id。
- group:组名。
- content:发布配置输入的具体内容。
获取配置:
1 | curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test" |
控制台显示输出内容:HelloWorld,代表配置成功。
关于 curl 命令教程,可以去 curl 官网(curl.se)找一找,还是很常用的。
关闭服务
Linux 平台:
1 | sh shutdown.sh |
Windows 平台:
1 | .\shutdown.cmd |
nacos2.2.0 版本配置说明
以 nacos2.2.0 版本为示例说明
nacos 配置文件,支持配置文件存储到数据库(DB)中保存。如果没有开放 mysql 数据源相应设置,默认使用本地存储数据源。
配置目录:\nacos-server-2.2.0\conf,文件清单,每个版本可能略微有所不同:
- application.properties
- application.properties.example
- derby-schema.sql
- mysql-schema.sql
- 1.4.0-ipv6_support-update.sql
- cluster.conf.example
- nacos-logback.xml
配置基本说明
以 .example 结尾,是示例配置,可供参考。以 update.sql 结尾的,则是 sql 更新脚本。
application.properties 是 nacos 基本配置,例如端口、ip、数据源等等可以在此配置中修改,cluster.conf.example 是集群配置示例,nacos-logback.xml 是日志相关配置。
mysql-schema.sql 提供支持 MySQL 数据库 SQL 表结构,derby-schema.sql 提供支持 derby 数据库 SQL 表结构。
如果和我一样使用的是 MySQL 数据库,需要注意的配置文件是 application.properties 和 mysql-schema.sql,记住后续用得上。
导入表结构
新建数据库:库名命名为:nacos。编码最好指定为 utf8mb4 和 utf8mb4_bin,避免导入后看到中文注释乱码。
1 | create database nacos; |
导入 sql 脚本到新建的库 nacos 中:mysql-schema.sql。库名并不是固定的,可以根据实际需求更改,比如 nacos_config。如果你是从旧版本升级上来的,可能需要执行 SQL 脚本:1.4.0-ipv6_support-update.sql。
上面聊到 nacos 可以在配置文件中配置数据源,当然必不可少,需要部署 MySQL 数据库。
找到 application.properties 配置文件,配置 MySQL 数据源:

1 | ### If use MySQL as datasource: |
很奇怪的一个问题,第一次使用,只导入初始化 sql 脚本 MySQL 数据源:
1 | [root@Centos9-Stream ~]# cat /usr/local/nacos-2.2.0/conf/mysql-schema.sql | mysql -uroot -p nacos |
nacos 以单机模式启动:sh startup.sh -m standalone,启动无异常,正常访问。
MySQL 数据库已设置自启,排查数据库正常启动。第二天启动 centos-stream-9,再次启动 nacos 服务,出现无法设置数据源,尝试屏蔽数据源配置文件,启动正常。猜测可能是初始化脚本出问题了,执行升级 sql 脚本:1.4.0-ipv6_support-update.sql,再次启动 nacos 服务正常。
如果你和我一样,使用的是 MySQL8.0.30 版本数据库,可以参考。
如果遇到 Public Key Retrieval is not allowed,可能还需要加上 &allowPublicKeyRetrieval=true。
在 github issues 查找解决方案,提到可能是 MySQL8.0.x 设置时区的问题,将默认 serverTimezone=UTC 修改为 serverTimezone=Asia/Shanghai。
如果配置好 MySQL,但还是遇到数据源无法找到,也许是数据库导入脚本没有升级,也许是数据库版本和时区问题。
尝试重连,反复提醒 Public Key Retrieval 不被允许,反复提醒数据源没有设置。
java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
Caused by: com.mysql.cj.exceptions.CJException: Public Key Retrieval is not allowed
Caused by: com.alibaba.nacos.api.exception.NacosException: Nacos Server did not start because dumpservice bean construction failure :No DataSource set
Caused by: java.lang.IllegalStateException: No DataSource set
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘externalDumpService’: Invocation of init method failed; nested exception is ErrCode:500, ErrMsg:Nacos Server did not start because dumpservice bean construction failure :No DataSource set
也有可能是 MySQL 版本问题和设置时区问题,连接配置做如下调整:
1 | ### Connect URL of DB: |
Linux 终端执行命令导入升级脚本:
1 | cat /usr/local/nacos-2.2.0/conf/1.4.0-ipv6_support-update.sql | mysql -uroot -p nacos |
问题排查
关于 nacos 大部分问题,可以在官方仓库的 issues 找到解决方案:
https://github.com/alibaba/nacos/issues
总结配置数据源相关问题:
- 导入初始化 sql 脚本缺失字段问题。
- 使用数据源配置 jdbc,数据库时区设置问题。
- MySQL8.0.x 数据库默认密码使用缓存算法(caching_sha2_password)问题。
MySQL 部署
tips:下载注意使用带有 GA(General Availability)标识,稳定版。
实际工作中,使用比较多的是下载离线安装包。安装方式主要有如下几种分类:
安装方式
Windows 平台:
- msi 文件:直接双击进行安装,有可视化界面,安装较为容易,但不够灵活。
- 归档包(archive):以 zip 格式进行压缩,类似于 Linux 中的二进制包。比较灵活,只需几个命令即可安装服务和实例化。
- 源码包(source package):最灵活,可根据需求编译安装功能,难易度最高。
- docker 形式安装:其实是在容器中安装。
Linux 平台:
- rpm & deb 包安装:最为简单,但不灵活,适合初学者使用。
- 二进制包(binary package):也称归档包(archive),编译好的源码包,比 rpm 包更灵活。个人认为是安装多个服务最佳选择。
- 源码包(source package):最灵活,可根据需求编译安装功能,难易度最高。
- docker 形式安装:其实是在容器中安装。
当然,MySQL 同样支持 macOS 平台。
你也可以使用 MySQL 的妹妹 MariaDB 替代 MySQL,是很好的选择。
由于测试使用,本人数据库使用比较新,MySQL8.0.30。说 8.0 新,其实也并不是很新,距离 8.0 第一个稳定版 Changes in MySQL 8.0.11 (2018-04-19, General Availability)快 5 年了。
目前市面上主要以 MySQL5.7 为主,离停止维护不远了,未来应该会逐渐升级为 MySQL8.0.x。看到官网将 MySQL5.6 文档页面转移了,已停止版本更新。
Windows 平台
此处省略安装过程,请参考个人公众号以及站内的博文《MySQL 8.0.33 简易安装教程》 ,有详细说明。
Linux 平台(CentOS-Stream-9)部署 MySQL
此处我只演示 Linux 平台(CentOS-Stream-9)其中最方便的一种部署方式。
Linux 平台(CentOS-Stream-9)
通过 RHEL 系列自带的命令服务安装管理工具,yum 与 dnf 二选一即可。
1 | yum -y install mysql-server-8.0.30 |
安装后,查看 mysql 服务状态,默认服务名为 mysqld.service。
1 | systemctl status mysqld.service |
默认没有启动,手动启动 mysqld 服务
1 | systemctl start mysqld.service |
登录 mysql 字符命令行界面
1 | mysql -uroot -p |
调试防火墙管理工具
如需远程登录,需要关闭防火墙相关服务,或者开放相应端口,个人建议采用开放相应端口
1 | firewall-cmd --zone=public --add-port=3306/tcp --permanent |
由于 MySQL 默认端口 3306 可能被黑客利用通用扫描软件攻击,建议实际工作中进行修改。或者利用隧道转发功能。
如果只是在本地使用,改与不改并不影响。
重载 firewalld 服务
1 | firewall-cmd --reload |
MySQL 用户权限
设置开机自启
1 | systemctl enable mysqld.service |
查看 mysqld 服务状态:看到 enabled 代表设置为自启
1 | systemctl status mysqld.service |
如果使用第三方管理工具,需要开放相应用户权限才能登录 MySQL:
修改用户密码
1 | ALTER USER 'root'@'localhost' IDENTIFIED BY 'mypwd@123'; |
创建用户 root,主机地址 %,匹配所有;如果是 localhost,则只让本地使用,也可以是指定 ip 地址。
1 | CREATE USER 'root'@'%' IDENTIFIED BY 'mypwd@123'; |
授权 root 用户所有权限(ALL),即可使远程登录。同样可以指定特定权限,只给查询(select)。
1 | GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION; |
如果遇到第三方工具连接提示密码插件规则不被支持问题:
1 | ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'mypwd@123'; |
刷新权限
1 | flush privileges; |
更多权限细化设置请参考 MySQL8.0.x 官方文档第 6 章节 Security。关于权限控制和账号(用户)管理介绍很详细。
6.2 Access Control and Account Management
更多安装方式,你还可以参考个人持续更新的笔记:
https://blog.cnwangk.top/2023/03/15/MySQL8-0-x - 简易安装教程
MySQL 导入 mysql-schema 脚本
下面,将演示数据库创建以及 sql 脚本导入。
登录
1 | mysql -uroot -p |
创建数据库
1 | create database nacos; |
导入数据,执行 sql 脚本
关于数据导入,可以使用 DB 管理工具(MySQL workbench、DBeaver、SQLyog)连接导入,也可以使用 cat 或者 zcat 命令导入。
演示 Linux 平台使用 cat 命令导入 sql 脚本:
1 | [root@Centos9-Stream ~]# cat /usr/local/nacos-2.2.0/conf/mysql-schema.sql | mysql -uroot -p nacos |
原本我也不知道这种用法,联想到以前使用过 zabbix 监控工具。灵机一动,我也可以将 nacos 的 sql 脚本这样导入数据库中。
查看 nacos 数据库表:验证是否导入成功
1 | mysql> use nacos; |
Springboot 项目构建
如果你只是想体验 nacos 简单用法,可以跳过 springboot 项目集成 nacos 微服务。
如果你是软件实施、运维人员,可以关注 nacos 官方文档运维监控文档(运维指南)。
介绍很详细,我也觉得我很啰嗦了,这已经属于开发范畴了。
目标:项目中集成 nacos 服务,使用 nacos 监控到打包好并正常运行服务健康情况。集成 spring-cloud-starter-alibaba-nacos-discovery 和 spring-cloud-starter-alibaba-nacos-config。nacos-discovery 是服务发现组件,nacos-config 则是服务配置组件。
项目环境
需要准备的环境:
- Maven 3.6.3
- JDK17
- Linux 环境(CentOS9-Stream)
Linux 平台安装 JDK
解压 JDK
1 | tar -zxvf jdk-17.0.4.1_linux-x64_bin.tar.gz |
配置全局环境变量:vim /etc/profile
1 | JAVA_HOME=/usr/java/jdk17 |
配置当前用户环境变量:vim .bash_profile 或者 .bashrc,加入配置全局变量我所列出的内容即可。
执行 source 命令立即生效:
1 | source /etc/profile |
关于环境变量更多配置可参考个人公众号关于 JDK17 的介绍。
验证版本:
1 | java -version |
Linux 平台安装 maven
1 | yum -y install maven |
当然,你也可以到 Maven 官网下载打包好的二进制包,解压即可用。
1 | unzip apache-maven-3.6.3-bin.zip |
加入环境变量:
1 | # Maven Home |
执行 source 命令立即生效:source /etc/profile
查看版本
1 | [root@Centos9-Stream bin]# mvn --version |
看到以上环境,证明你的 Maven 环境已经部署好了。
注意:默认 Maven 镜仓库地址很慢,需要更换,推荐阿里云镜像源。
修改 Maven 配置文件:
1 | [root@Centos9-Stream bin]# vim /usr/share/maven/conf/settings.xml |
修改默认本地仓库存放目录:找到 localRepository,将如下内容开放:

配置路径参考 (Linux 平台):
1 | <localRepository>/local/repo</localRepository> |
配置路径参考 (Windows 平台):
1 | <localRepository>D:\Maven\repo</localRepository> |
配置 Maven 阿里镜像地址,加入如下配置,** 注意是在 <mirrors> </mirrors> 加入子节点 <mirror></mirror>**:

1 | <mirrors> |
更多配置可以参考阿里云云效
阿里云云效 是企业级一站式 DevOps 平台,覆盖产品从需求到运营的研发全生命周期,其中云效也提供了免费、可靠的 Maven 私有仓库 Packages 和代码管理仓库 Codeup,欢迎您体验使用。
云效制品仓库 Packages 致力于帮助开发者统一管理各种开发语言在开发、构建过程中的依赖,构建成果(二进制制品)以及交付过程关键信息的重要组件。
云效代码管理 Codeup 是阿里云出品的一款企业级代码管理平台,提供代码托管、代码评审、代码扫描、代码度量等功能,不限人数、超大容量且免费使用,全方位保护代码资产,帮助团队实现安全、稳定、高效的研发管理。
项目构建
注意:如果使用 IDE 工具构建,注意 springboot、spring cloud 以及 spring cloud alibaba 版本对应关系。尽量使用阿里云云原生应用脚手架官网推荐的版本,有助于后期遇到问题排查。当然还有一个好处,选择组件时有中文说明,一目了然。
如果你对于 IDE 工具使用,实在有困难,可以在线构建。
两种在线脚手架构建方式:
- spring 脚手架:https://start.spring.io/
- 阿里云云原生应用脚手架:https://start.aliyun.com/
个人还是比较推荐使用阿里云云原生应用脚手架构建,便于在线选择 nacos 等微服务相关组件。

springboot 版本可以自己调试,目前已经支持 springboot2.7.6 和 3.0.0 配置。之前建议版本为 springboot2.6.11,如果使用高版本,选择 nacos 相关组件时灰色的。

构建完成,如何打包成 jar(目前使用比较多的可能是 jar 包形式)?少不了 JD K 和 Maven 环境,参考环境准备步骤。老项目是有不少使用 war 包形式。
解压下载好的 springboot 项目 demo.zip
1 | unzip demo.zip |
执行 Maven 安装命令,这个过程可能有点缓慢,下载 jar 包越多,越耗时间:
1 | [root@Centos9-Stream demo]# mvn install |
如果新建的是单体应用,在根目录找到 application.properties 配置文件,如果构建 mvc 架构应用,则在 demo-start 子项目找到 application.properties,然后修改 spring.cloud.nacos.config.server-addr 与 spring.cloud.nacos.discovery.server-addr 的 IP 地址。
示例如下:

有点纳闷,也许是我本地环境问题,之前很少使用阿里脚手架构建项目。感觉使用阿里云云原生应用脚手架构建,会出现某些 jar 包(openfeign)找不到,使用 Maven 打包出现主清单文件找不到的问题。自己一步一步构建,添加微服务组件,配置 nacos 则是正常的。
Maven 打包遇到找不多依赖:

示例如下,引入 openfeign:

如果不出意外,正常打包,可以使用 java -jar 执行 jar 服务。
1 | java -jar demo-web/target/demo-web-0.0.1-SNAPSHOT.jar |
在 nacos 控制台服务管理可以监控到服务,比如我搭建测试环境,给应用区名称为:springboot-test。
如果遇到控制台日志输出乱码的时候,此时不要慌,请冷静思考。
当然有解决方案,那就是在控制台执行 Java -jar 命令时使用参数 -Dfile.encoding 指定固定的编码,比如 utf-8 。
Windows 平台处理方式:
1 | $ java -jar -Dfile.encoding=utf-8 demo-1.0.jar & |
Linux 平台处理方式:
1 | $ nohup java -server -Xms256M -Xmx2048M -jar -Dfile.encoding=utf-8 demo-1.0.jar &> demo-1.0.l |
Nacos 联动测试
新建配置:springboot-test.properties

配置详情:配置的比较随意,参考看看就行

当然,你也需要在 controller 层 Java 代码里加入如下匹配:
1 | /** 使用动态配置获取测试 --BEGIN-- **/ |
提供一种思路。可以根据业务情况而定,将多个配置封装到一个类里面,如下所示,新建 CustomConf 类:
1 | /** |
使用到注解:
- @Value :通常情况,使用注解取值。
- @Component :加入注解,便于被扫描到。
- @ConfigurationProperties:引入配置,通过 prefix 指定配置前缀。
在项目中注入:
1 | @Autowired |
准备好集成 nacos 服务的 jar 包:
1 | [root@Centos9-Stream test]# ll springboot-nacos-cloud-0.0.1-SNAPSHOT.jar |
运行服务:
- nohup:代表脱离终端运行
- &:代表放入后台
-Dspring.profiles.active=prod:指定为生产环境
1 | [root@Centos9-Stream test]# nohup java -jar -Dspring.profiles.active=prod /opt/workspace/test/springboot-nacos-cloud-0.0.1-SNAPSHOT.jar > /opt/ |
测试接口:
1 | http://192.168.245.132:8082/t/getConfig |
你也可以使用 curl 命令请求:
1 | curl -X GET http://192.168.245.132:8082/t/getConfig |
得到输出结果:
getConfig>>>>>>>>>>>> 发现:配置 >>> 服务名称:nacos 服务
查看日志验证:

验证成功,getConfig 日志打印出来了。
Nacos 监控(控制台)
官方文档比我演示介绍要更详细,如果进一步使用,请参考官方文档(运维指南)。
控制台手册:https://nacos.io/zh-cn/docs/console-guide.html
基本功能演示
nacos 功能比较丰富:
- 配置管理:动态更新配置、查看历史版本、监听查询;
- 服务管理:查看、创建服务、查看订阅者列表;
- 权限列表:管理用户、角色、权限配置;
- 命名空间:默认保留空间(public)
- 集群管理:管理各个节点。
登录 mysql,切换到 nacos 数据库,查看原始 users 表只有一条数据,存储 nacos 用户。
此处只演示一下连接上 MySQL 数据库后,在控制台左侧菜单栏找到权限控制,新建用户。
示例如下:

验证数据库表
验证 users 表,发现多了一条数据,nacos_test 成功存入到数据库,至此 MySQL 与 nacos 联动完成。

1 | mysql> select * from users\G |
新增配置,对照数据库表

- 新增配置会保存在:nacos_config
- 历史配置会保存在:his_config_info
- 用户相关配置保存在:users
- 角色相关配置保存在:roles
- 权限相关配置保存在:permissions
监控方法可以配合 prometheus 以及 grafana 使用。关于 nacos 更多用法,目前还在摸索中。
下面这张流程图思路,可供参考:

参考资料:
- nacos2.x 官方文档:https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html
- nacos2.x github issues:https://github.com/nacos-group/nacos-docker/issues/251
- MySQL8.0.x 官方文档第 6 章节 Security:https://dev.mysql.com/doc/refman/8.0/en/access-control.html
最后,希望对你的工作有所帮助。如果觉得写得还不错,可以点个小小的赞。
以上总结仅供参考。
——END——
