笔者只想在云服务器打开 单机模式练习微服务养老,奈何受尽纳克斯的折磨,现将成功的关键要点简述如下:
🎯 核心:初始化数据库
意思就是,你要启动服务器,首先你得要有这个数据库:
把它下载下来(或者复制全文,新建文本保存,修改后缀为 .sql
)
把 nacos 服务跑通!
我重启服务器发现 nacos 挂了,反复挂空表、或者注入 sql 启动测试得知:
- nacos 只支持
utf-8
编码(即 utf-8mb3 两者等同)的数据库(不支持 utf-8mb4 编码,否则启动报错无数据源设置;可以在 navicat 中右键点击数据库名字 > 更改编码设置) - 数据库如果覆盖过用户密码表,nacos 网页需要清空缓存,才能用老密码访问。
(初始化,不是叫你删完所有的数据库,也不是谷歌搜到什么 mysql --initial
简直不要太吓人!😨
如果你要测试挂空表,记得先备份好数据)
官方手册 的内容很老(参数过时了),项目库的文档才是新的,而且提案 No DataSource set 80%原因就是首次启动要初始化数据库,它本身不会自动初始化。
数据库管理工具(可选):
- Navicat 软件
- 原生的 MySQL 命令:
# 备份
mysqldump -uroot -p {{database_name}} > {{new_database_name.sql}}
# 导入
create database <newdb>
use <newdb>
source /path/to/file.sql
show tables;
🐱👤 参考我的配置(半封装版)
完全封装版(一键拉取)看起来简单好用,但一旦不好用,那真是喊破喉咙也都没人救你。
好在 Nacos Docker 官方使用说明书 有 docker-files 这种半封装的,可以自己改好几个配置,再运行起来。
但觉得它的样例不够简单,特别对我 1 核 2G 的服务器来说,内存很吃紧,所以稍微优化了一下
# vim example/standalone-mysql-8.yaml
version: "2"
services:
nacos:
image: nacos/nacos-server:${NACOS_VERSION}
container_name: nacos
env_file:
- ../env/nacos-standlone-mysql.env
volumes:
- ./standalone-logs/:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
environment: # 设置环境变量,相当于docker run命令中的-e
# JVM调优参数
- JVM_XMS=64m #-Xms default :1g
- JVM_XMX=64m #-Xmx default :1g
- JVM_XMN=16m #-Xmn default :512g
- JVM_MS=8m #-XX:MetaspaceSize default :128m
- JVM_MMS=8m #-XX:MaxMetaspaceSize default :320
ports:
- "8848:8848"
depends_on:
- mysql
restart: always
mysql:
container_name: mysql
image: mysql:8.0.26
env_file:
- ../env/mysql.env
volumes:
- /mydata/mysql/log:/var/log/mysql
- /mydata/mysql/data:/var/lib/mysql
- /mydata/mysql/conf:/etc/mysql
- /home/mysql/mysql-files:/var/lib/mysql-files
ports:
- "3306:3306"
官方定制 MySQL 版本 8.0.16 ,版本不用卡那么死,其实 8+ 都是支持的(因为依赖项 java-mysql-connector.jar 只要满足 8+ 就行)。
挂载文件看喜好。
单机模式一个 8848 端口够用了。
配置中提到的两个运行环境文件也要修改一下:
# vim env/nacos-standlone-mysql.env
PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=admin
MYSQL_SERVICE_PASSWORD=mima
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
注意 :
MYSQL_SERVICE_HOST
=mysql 这里要写 mysql 服务的host,不能写 127.0.0.1 或者 localhost ;如果你测试能用(我跑通懒得测了),可以评论区告诉我修改。
这里参数不指定上海时区,也可以运行。(又一个奇怪的特性🙄)
MYSQL_DATABASE=nacos
MYSQL_USER=admin
MYSQL_PASSWORD=mima
MySQL 初始化的配置,不过你还需要满足条件:创建用户、赋予权限、创建数据库、导入空表等等
CREATE USER 'admin'@'%' IDENTIFIED BY 'mima';
grant all on nacos.* to 'admin'@'%' WITH GRANT OPTION;
create database nacos character set utf8mb4;
最后
# 启动
docker start nacos
# 查看进程
docker logs -f nacos
阿里云防火墙放行 8848 端口,通过 ip 就能访问 nacos 了,没必要用反向代理(如果用了,和 HTTPS 的转发冲突,搞晕你 😵):
# 没必要使用反向代理,但你也可以试试
server {
listen 8848;
location / {
return 301 http://$server_name$request_uri;
}
# Nacos
location /nacos {
proxy_pass http://localhost:8848; #反向代理地址+端口
proxy_set_header Host $http_host; #设置Host
proxy_set_header X-Real-Ip $remote_addr; #设置客户端远程地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
}
}
打开网页。
登陆,修改密码。
数据库工具,导入原来备份的数据。
刷新网页。
搞定。
如文章开头所示。
🥰 这样就能节省本地虚拟机的爆炸多的内存呢!而且还不担心关机掉线。
而且配置还能本地备份,甚至从数据库改参数(比如网页不能改的md5),不要太方便。
经过 JVM 性能调优,压缩了堆内存空间,现在的结果我是比较满意的:
🥴 测出来的奇怪特性
1)Ubuntu 本地服务 和 Doker 完全封装版(一键拉取) Nacos 不兼容
Ubuntu:20.04 LTS
MySQL:8.0.25 ,System.Service
Docker:20.10.8, build 3967b7d
nacos/nacos-server: 2.0.3
❯ systemctl status mysql.service
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2021-05-22 12:09:49 CST; 2 months 27 days ago
Main PID: 103154 (mysqld)
Status: "Server is operational"
Tasks: 43 (limit: 2318)
Memory: 361.6M
CGroup: /system.slice/mysql.service
└─103154 /usr/sbin/mysqld
May 22 12:09:48 Ubuntu systemd[1]: Starting MySQL Community Server...
May 22 12:09:49 Ubuntu systemd[1]: Started MySQL Community Server.
尝试过:
- 封装版,无参数。成功
- 封装版,运行加一堆连接数据库的参数。失败
- 封装版,运行加一堆连接数据库的参数,进入容器修改
application.properties
。失败 - 封装版,运行修改各种连接数据库的参数。失败
- 手动登陆MySQL查看表数据。正常
总之想持久化保存配置,用系统服务管理的,老不成功,索性备份数据库,卸载本地服务版 MySQL,改 Docker 版 MySQL。
为什么统一用 docker 管理呢,因为
2)CentOS8 配置 Docker 完全封装版(一键拉取)很简单
在虚拟机,用 Docker 管理 MySQL 和 nacos,用简单的封装版本,配置还算顺利
docker run -p 8848:8848 --name nacos \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=虚拟机ip \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=yonghuming \
-e MYSQL_SERVICE_PASSWORD=mima \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai" \
-v /mydata/nacos/logs:/home/nacos/logs \
-d nacos/nacos-server
最开始下载了 nacos 源码自己编译,才配置数据库,初始化数据库开始的。
第二天,重启电脑莫名其名网页打不开,看日志发现报错 No DataSource set ,感觉就是那种输出很多段 Cause By
, 但没有一个告诉你老板去哪了的保安。
谷歌发现 MySQL8+ 需要指定时区,进入容器修改 &serverTimezone=Asia/Shanghai
就修好了。
或者,像上面在运行时指定参数。
但同样的方法在 Ubuntu 失效。