版本
- Docker v24.x
- Nacos v2.4
- Sentinel v1.8
- Seata v1.8
- Dubbo v3.0.9
问题 01 : Nacos 启动失败 jdbc.properties error
错误信息
解决
1. 创建一个用于存储 Nacos 持久化配置的数据库
CREATE DATABASE nacos_config CHARACTER SET utf8 COLLATE utf8_general_ci;
2. 指定建表SQL
位于 Nacos 安装目录的 /conf/ 下的
mysql-schema.sql有建表的 SQL 文件
3. 进入 MySQL 执行建表 SQL
mysql -u [用户名] -p [密码] nacos_config < mysql-schema.sql
4. 确认建表情况
5.访问 Nacos
问题 02: 解决 Seata 容器启动注册到 Nacos 失败- UnknownHostException: nacos-standalone
错误信息
解决 - 创建 Docker 自定义网络
docker network create [自定义网络名称 比如: seata-network]
1. 更新 Nacos 容器
docker run -d \
--name nacos-standalone \
--network seata-network \
-e PREFER_HOST_MODE=ip \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=<your-mysql-host> \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=<your-database \
-e MYSQL_SERVICE_USER=<your-username> \
-e MYSQL_SERVICE_PASSWORD=<your-password> \
-e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true" \
-p 8848:8848 \
-v /root/service/nacos/logs:/home/nacos/logs \
-v /root/service/nacos/data:/home/nacos/data \
nacos/nacos-server:v2.4.0
2. 更新 Seata 容器
docker run --name seata-server \
--network seata-network \ ## 和 Nacos 加入到同一自定义容器网络内
-p 8091:8091 \
-p 7091:7091 \
-e SEATA_IP=[] \ ## 指定ip地址,NettyClientChannelManager可通过外网ip访问
-e SEATA_PORT=8091 \
-v /root/service/seata/config/application.yml:/seata-server/resources/application.yml \
--name seataio/seata-server
3. 重启 Seata 和 Nacos
启动日志
Docker 容器进行
Nacos 服务列表
问题 03: Seata 配置自定义事务组失败
参考文献:
错误信息
与云服务器连接时报错: can not get cluster name in registry config 'service.vgroupMapping.[xxxx-GROUP]', please make sure registry config correct
解决
1. 在 application.yml 文件内的 seata 配置项
seata:
service:
vgroup-mapping:
[xxx-Group]: default
2. Nacos 注册中心 配置管理 面板添加配置
如果是以 Nacos 作为注册中心
需要通过 Nacos 控制面板添加配置,参考 yml 配置
如果 yaml 配置如下:
seata:
service:
vgroup-mapping:
seata-service-group: default
Nacos 中需要增加一个 Data Id 为 service.vgroupMapping.seata-service-group 并且配置内容为 default 的配置项。
扩展 - 一键将 Nacos 所有与 Seata 相关的配置项通过脚本导入 Nacos
进入 \seata\script\config-center\nacos 目录下找到 nacos-config.sh
执行指令
sh nacos-config.sh -h 127.0.0.1 -p 8848 -g SEATA_GROUP -t xxxx -u username -w password
参数:
- h nacos服务IP
- p nacos服务端口
- u nacos登录名
- w nacos登录密码
- g nacos 配置的分组名称,默认设置SEATA_GROUP
- t 上面配置的命名空间ID
控制台输出
进入 Nacos 配置管理面板,所有可配置项导入
问题 04: 本地 Nacos Client 无法连接到服务器内的 Nacos, Nacos Client 报错 Caused by: com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING
参考文档
错误信息
解决方法
1. 重新配置 Nacos 容器,添加端口映射 8848,9848,7848,7849
docker run -d \
--name nacos-standalone \
--network seata-network \
-e PREFER_HOST_MODE=ip \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=[Server ip] \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=[username] \
-e MYSQL_SERVICE_PASSWORD=[password] \
-e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true" \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
-p 7848:7848 \
-p 7849:7849 \
-v /root/service/nacos/logs:/home/nacos/logs \
-v /root/service/nacos/data:/home/nacos/data \
nacos/nacos-server:v2.4.0
2. 重启容器
3. 放行安全组
后端项目再次启动 Nacos Client 成功连接
问题 05: 后端项目启动后无法注册到 Seata Server
参考文献
错误信息
解决方法
1. 重新配置拉取 Seata Docker 镜像;增加 8091 和 7091端口映射
docker run --name seata-server \
--network seata-network \
-p 8091:8091 \
-p 7091:7091 \
-v /root/service/seata/config/application.yml:/seata-server/resources/application.yml \
-e SEATA_IP=[IP] \ # 服务器 IP 这行注释要删掉否则指令格式不正确!!!!
-e SEATA_PORT=8091 \
--name seataio/seata-server
2. 重启 Seata 容器
查看 seata server 服务注册 IP
修改后端项目 application.yml 配置 - grouplist 更新与 seata server 注册的 IP:Port 一致
修改为 Seata Server 注册成功后显示的 IP
配置安全组-放行 Seata Server 所需端口
放开端口
# 放行 8091 端口
firewall-cmd --zone=public --add-port=8091/tcp --permanent
# 刷新规则
firewall-cmd --reload
重启后注册成功
问题 06: 如何配置多环境打包 JAR
参考文档
解决方法
资源目录结构
1. 仅在 application.yml加入配置变量的形式
spring:
profiles:
active: '@env@'
2. 项目根目录下 pom.xml添加配置
<!--配置不同的profile,对应不同的生产环境-->
<profiles>
<profile>
<!--开发-->
<id>dev</id>
<activation>
<!--默认开发环境-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- 自定义的变量名称env作为标签,标签内是我们配置文件不同环境的后缀 -->
<env>dev</env>
</properties>
</profile>
<profile>
<!--生产-->
<id>prod</id>
<properties>
<env>pro</env>
</properties>
</profile>
<profile>
<!--测试-->
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
</profiles>
pom.xml底部添加
<build>
<plugins>
<plugin>
<!-- springboot使用maven打包的插件 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<!-- 指定配置文件的位置 -->
<directory>src/main/resources</directory>
<includes>
<!-- 读取resources下的所有文件,include表示指定文件内的,相对的还有excludes ,排除其下的文件 -->
<include>**/*</include>
</includes>
<!-- 开启替换标签,比如我们的'@env'就是通过这个替换的 -->
<filtering>true</filtering>
</resource>
</resources>
</build>
刷新后点击查看右上方 Maven 面板出现了控制项
选中 prod 后尝试完成打包
若出现测试不通过,可跳过测试打包
mvn clean package -DskipTests