0.前因
事情的起因是我准备给我的汐落记账增加ai分析功能
汐落记账的几个功能页面如下(这里只展示了桌面端,移动端网页也有适配)





放着这些数据不做数据分析就有些浪费了,所以我准备引入AI模块,将用户的账单数据交由AI分析,之后给出用户合理的财富分配建议
为此,笔者考虑使用Spring AI来调用LLM大模型的API,但是汐落的开发使用了Spring Boot2.7的框架,而Spring AI最低需要使用Spring Boot3.4版本,将整个汐落升级太耗费时间和精力,意义也不大,所以笔者选择使用微服务的方式,让AI服务单独成为一个微服务模块,通过Nacos进行注册与配置管理,使用OpenFeign与汐落进行通信,汐落的前端会通过请求来判断AI服务是否在线,如果AI服务下线则不显示对应的页面入口,保证服务的可靠性
1.部署
1.1-部署方式选择
根据下方链接可以打开Nacos官方提供的部署手册
Nacos官方部署手册
从目录可以看到有三种主流的部署方式,这里笔者要部署在Linux系统,所以采用Docker容器部署会方便管理,而根据Nacos官方的说明,Docker也有两种部署方式,区别主要是数据持久化的策略,第一种是直接部署Docker容器,这会使用镜像内置的Derby数据库,意味着如果你的Nacos容器损坏,被删除,那么对应的配置文件也会被永久删除,这显然是不安全的,笔者选择使用第二种方式,外置MySQL数据库的方式部署
1.2-MySQL数据库创建
如果需要使用外置的MySQL数据库部署Nacos,那么我们必须手动为其创建一个数据库以供数据的持久化,如下图是笔者已经创建好的数据库示例,创建数据库需要使用Nacos官方提供的SQL脚本文件,接下来会一步步讲解怎么选择正确的SQL脚本文件并创建数据库(MySQL版本大于5.6.5)

1.2.1-SQL脚本选择
比较重要的一点是,每个版本的Nacos初始化MySQL数据库的脚本有可能存在差异,所以我们必须找到对应版本的SQL脚本才可以正确初始化数据库,那么怎么找到每个版本对应的脚本呢?我们需要去Nacos的Github仓库里面,寻找release中对应版本的文件
问题又来了,这里我怎么知道自己应该使用哪个版本呢?
笔者建议如果没有特殊需求,使用常规的最新发行版就可以,但是这次要将Nacos部署在Arm架构的服务器上,所以版本选择就有讲究了
1.2.2-x86架构系统Linux
通常来说,使用x86/x86-64架构的Linux系统可以直接使用docker安装Nacos,所以只需要选择一个长期稳定的发行版,并且找到对应的SQL脚本就可以了,这里我们直接选择比较新的2.5.1版本
在下面的Assets中下载zip文件
解压zip可以在目录中得到我们需要的sql文件
点进来就可以看到创建表的语句
接下来创建数据库
(这里推荐一下数据库管理工具 DBeaver,社区版本功能强大,完全免费)
执行SQL脚本就可以了
得到了目标表单
1.2.3-arm架构系统Linux
笔者在之前玩软路由的时候买了一台 NanoPi R5S,并且刷入了Ubuntu系统,笔者希望使用这个现成的硬件来部署Nacos作为注册中心,并且配合位于上海的阿里云轻量服务器使用FRP进行内网穿透,对外提供服务,客观原因是Nacos运行起来比较消耗性能,而手上的阿里云服务器是2核2G,且已经部署了博客和汐落服务,即使是创建了2G的交换内存,再运行Nacos也会比较吃力,所以考虑之后决定使用闲置的4核4G的R5S
在这里贴一下R5S官方的说明
R5S开发板实物图
笔者购入的是有金属外壳的版本
这里需要特别声明的是,R5S使用的芯片是Rockchip RK3568B2,和我们的电脑不同,这是ARMV8架构的芯片,所以不能直接运行常规发行版本的docker镜像
不过我们可以在Nacos的官方文档里面看到官方其实明确支持arm架构的设备
点我跳转问答链接
也就是说,我们需要使用后缀为slim的镜像文件
此处可以点击下面的链接跳转到Nacos官方发布在DockerHub的镜像
Nacos官方Docker镜像

在Tags中可以看到官方伴随着最新版镜像的发布,还会额外发布一个slim版本的镜像
可以看到最新版本其实也是存在slim镜像的,所以我们是可以在R5S上部署最新版的Nacos的,所以创建数据库的步骤和x86架构是一样的
选择对应的版本
在下面的Assets中下载zip文件
解压zip可以在目录中得到我们需要的sql文件
点进来就可以看到创建表的语句
接下来创建数据库
(这里推荐一下数据库管理工具 DBeaver,社区版本功能强大,完全免费)
执行SQL脚本就可以了
得到了目标表单
1.3-Nacos容器创建
x86和arm架构的版本选择已经在上文简述过,这里不在赘述,接下来统一以arm架构的视角操作
1.3.1-镜像拉取
首先拉取需要的镜像
1.3.2-更改Nacos配置
在和初始化SQL脚本相同文件夹内有一个nacos的运行配置文件
打开application.properties
可以看到里面有数据库配置的示例
将所需位置取消注释,更改为实际参数
保存后关闭文件
这里的MySQL链接配置需要注意一点,要加上&allowPublicKeyRetrieval=TRUE
db.url.0=jdbc:mysql://ip:3306/nacos?characterEncoding=utf8&allowPublicKeyRetrieval=TRUE&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=root
db.password.0=password
使用服务器工具上传application.properties文件到root目录
1.3.3-运行Nacos容器
运行命令
docker run --name nacos-standalone -e MODE=standalone -v ./application.properties:/home/nacos/conf/application.properties -p 8848:8848 -d -p 9848:9848 --restart=always nacos/nacos-server:v2.5.1-slim
docker指令解析:
这个命令会启动一个名为nacos-standalone的Nacos服务器容器,使用单机模式,将配置文件从本地挂载到容器中,暴露两个端口(8848和9848),并设置为自动重启。
命令解析:
docker run
: 基本的运行Docker容器的命令--name nacos-standalone
: 为容器命名为"nacos-standalone"-e MODE=standalone
: 设置环境变量MODE为standalone,表示Nacos将以单机模式运行-v ./application.properties:/home/nacos/conf/application.properties
: 将本地root目录下的application.properties文件挂载到容器中的配置目录(这里如果想要改变本地配置文件映射位置,可以参考下面这条命令 docker run --name nacos-standalone -e MODE=standalone -v /path/application.properties:/home/nacos/conf/application.properties -p 8848:8848 -d -p 9848:9848 nacos/nacos-server:latest)-p 8848:8848
: 将容器的8848端口映射到主机的8848端口,这是Nacos的默认端口-d
: 以分离(后台)模式运行容器-p 9848:9848
: 将容器的9848端口映射到主机的9848端口,这是Nacos的gRPC通信端口--restart=always
: 设置容器在停止后总是自动重启nacos/nacos-server:v2.5.1-slim
: 使用的Docker镜像是nacos/nacos-server,版本为v2.5.1-slim(精简版)
最后我们在日志等到Completed initialization的提示,就可以正常使用ip:8848/nacos访问nacos了
1.4-验证效果
访问效果
接下来尝试创建配置
可以看到已经顺利发布
可以在数据库看到已经发布的配置,这样再也不用担心容器损坏导致配置文件丢失了
嗯,天童爱丽丝确实是最可爱的
2-容器间的互相通信
如果你在linux中部署MySQL使用的是docker,Nacos也是docker,希望可以通过容器名来互相通信,那么你可以采取以下步骤
-
创建一个共享容器网络:docker network create nacos-shared-net
-
将MySQL容器连接到这个网络:docker network connect nacos-shared-net mysql(这个mysql是你实际的容器名
-
将Nacos容器连接到这个网络:docker network connect my-shared-network nacos-standalone
db.url.0=jdbc:mysql://1Panel-mysql-8CFx:3306/nacos?characterEncoding=utf8&allowPublicKeyRetrieval=TRUE&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=root
db.password.0=password
本文不赘述Frp内网穿透的配置,如果有需求可以去看我写的Frp的文章( •̀ ω •́ )
封笔于2025.4.20晚20:00
评论