Docker单点部署Seata(2.0.0) + Nacos(v2.3.0) + Mysql(5.7)
系统环境docker desktop for windows v4.23.0
nacos
、mysql
、seata
三者都在bridge
网络中
一、部署Nacos
1 | docker run -itd \ |
二、部署Mysql
1 | docker run -itd \ |
三、Seata准备工作
1. 记住nacos、mysql、宿主机的ip
1 | $ docker network inspect bridge |
假设这里nacos
是172.17.0.3
,mysql
是172.17.0.2
1 | ipconfig /all |
这里假设宿主机ip为192.168.1.102
之后遇到上述三个ip,记得写成自己的
2. 建立数据库
在mysql_itcast
中新建seata
数据库,然后导入以下脚本
1 | -- -------------------------------- The script used when storeMode is 'db' -------------------------------- |
3. Nacos远程配置文件
访问Nacos网页,一般是http://localhost:8848/nacos/
,新建一个配置seataServer.properties
具体内容如下:
1 | store.mode=db |
四、部署Seata
宿主机新建一个application.yml
文件,内容如下
1 | server: |
然后用以下命令运行seata
容器
1 | docker run --name seata-server \ |
五、初步检验Seata部署情况
访问Seata
网页,这里是http://192.168.1.102:7091/
,输入两个seata后进入系统。
Nacos
网页上查看Seata
服务详情,ip为宿主机ip,不要是docker
容器内网ip就行。
六、微服务使用Seata
1.引入依赖
1 | <!--seata--> |
2. application.yml配置
1 | seata: |
启动微服务后,除了可以看微服务的日志外,还可以看Seata
容器日志,出现类似以下日志即为正常
1 | 2023-12-30 21:37:35 digest=seata-demo,192.168.222.1,1703943453643 |
七、遇到的坑
1. Nacos显示Seata服务的ip为容器内网ip导致微服务无法访问
网上看到以下各种方法均无效
- 使用
host
网络 application.yml
指定spring.cloud.nacos.discovery.ip
以下方法有效
- 容器创建时使用
-e SEATA_IP="宿主机ip"
2. 使用host宿主机网络
一开始为了图方便,给Nacos用过host网络,结果容器程序运行正常,打不开网页,玄学的一批。
也给Seata使用host网络,为了配置文件里面不用自己手动查询nacos和mysql的ip,结果然并卵。
3. seata The distribute lock table is not config, please create the target table and config it
这个是因为很多文档,都只有3张表,少了一张。
官方文档说store.db.distributedLockTable
是 1.5.1
版本新增的参数。
https://seata.io/zh-cn/docs/user/configurations
但是很多文档和博客,都只有3张表,第4张在哪里呢?
在这里
https://seata.io/zh-cn/docs/ops/deploy-by-docker-compose.html
里面写到nacos注册中心,db存储
时会提供 [建表脚本]
以及最后最重要的是,要在Nacos配置中心配置seataServer.properties
时,要多加一行
1 | store.db.distributedLockTable=distributed_lock |
这点在官网文档都没有提及。
4. 高版本中BusinessActionContextParameter和TwoPhaseBusinessAction推荐都放在实现类中,接口上的做法后续将会废除
具体参考这个Issue
2.0.0 TCC模式@BusinessActionContextParameter修饰的参数失效,无法在BusinessActionContext获取