新人用 Docker 镜像整合 Cloud Alibaba 组件踩坑 - [涉及:Nacos + Sentinel + Seata + Dubbo]

335 阅读5分钟

版本

  • 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 Idservice.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

参考文献

错误信息

image.png

解决方法

1. 重新配置拉取 Seata Docker 镜像;增加 80917091端口映射

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