广东品牌网站建设平台,服装购物网站策划书,开发网站的意义,vs 网站开发教程文章目录 一、部署Nacos二、部署Mysql三、Seata准备工作1. 记住nacos、mysql、宿主机的ip2. 建立数据库3. Nacos远程配置文件 四、部署Seata五、初步检验Seata部署情况六、微服务使用Seata1.引入依赖2. application.yml配置 七、遇到的坑1. Nacos显示Seata服务的ip为容器内网ip… 文章目录 一、部署Nacos二、部署Mysql三、Seata准备工作1. 记住nacos、mysql、宿主机的ip2. 建立数据库3. Nacos远程配置文件 四、部署Seata五、初步检验Seata部署情况六、微服务使用Seata1.引入依赖2. application.yml配置 七、遇到的坑1. Nacos显示Seata服务的ip为容器内网ip导致微服务无法访问2. 使用host宿主机网络3. seata The distribute lock table is not config, please create the target table and config it 系统环境 docker desktop for windows v4.23.0 nacos、mysql、seata三者都在bridge网络中
一、部署Nacos
docker run -itd \-e MODEstandalone -e NACOS_SERVER_PORT8848 -p 8848:8848 --namenacos_standalone nacos/nacos-server:v2.3.0二、部署Mysql
docker run -itd \-e MYSQL_ROOT_PASSWORD1009-p 3306:3306--namemysql_itcastmysql:5.7三、Seata准备工作
1. 记住nacos、mysql、宿主机的ip
$ docker network inspect bridge假设这里nacos是172.17.0.3mysql是172.17.0.2
ipconfig /all这里假设宿主机ip为192.168.1.102 之后遇到上述三个ip记得写成自己的 2. 建立数据库
在mysql_itcast中新建seata数据库然后导入以下脚本
-- -------------------------------- The script used when storeMode is db --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS global_table
(xid VARCHAR(128) NOT NULL,transaction_id BIGINT,status TINYINT NOT NULL,application_id VARCHAR(32),transaction_service_group VARCHAR(32),transaction_name VARCHAR(128),timeout INT,begin_time BIGINT,application_data VARCHAR(2000),gmt_create DATETIME,gmt_modified DATETIME,PRIMARY KEY (xid),KEY idx_status_gmt_modified (status , gmt_modified),KEY idx_transaction_id (transaction_id)
) ENGINE InnoDBDEFAULT CHARSET utf8mb4;-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS branch_table
(branch_id BIGINT NOT NULL,xid VARCHAR(128) NOT NULL,transaction_id BIGINT,resource_group_id VARCHAR(32),resource_id VARCHAR(256),branch_type VARCHAR(8),status TINYINT,client_id VARCHAR(64),application_data VARCHAR(2000),gmt_create DATETIME(6),gmt_modified DATETIME(6),PRIMARY KEY (branch_id),KEY idx_xid (xid)
) ENGINE InnoDBDEFAULT CHARSET utf8mb4;-- the table to store lock data
CREATE TABLE IF NOT EXISTS lock_table
(row_key VARCHAR(128) NOT NULL,xid VARCHAR(128),transaction_id BIGINT,branch_id BIGINT NOT NULL,resource_id VARCHAR(256),table_name VARCHAR(32),pk VARCHAR(36),status TINYINT NOT NULL DEFAULT 0 COMMENT 0:locked ,1:rollbacking,gmt_create DATETIME,gmt_modified DATETIME,PRIMARY KEY (row_key),KEY idx_status (status),KEY idx_branch_id (branch_id),KEY idx_xid (xid)
) ENGINE InnoDBDEFAULT CHARSET utf8mb4;CREATE TABLE IF NOT EXISTS distributed_lock
(lock_key CHAR(20) NOT NULL,lock_value VARCHAR(20) NOT NULL,expire BIGINT,primary key (lock_key)
) ENGINE InnoDBDEFAULT CHARSET utf8mb4;INSERT INTO distributed_lock (lock_key, lock_value, expire) VALUES (AsyncCommitting, , 0);
INSERT INTO distributed_lock (lock_key, lock_value, expire) VALUES (RetryCommitting, , 0);
INSERT INTO distributed_lock (lock_key, lock_value, expire) VALUES (RetryRollbacking, , 0);
INSERT INTO distributed_lock (lock_key, lock_value, expire) VALUES (TxTimeoutCheck, , 0);3. Nacos远程配置文件
访问Nacos网页一般是http://localhost:8848/nacos/新建一个配置seataServer.properties 具体内容如下
store.modedb
#-----db-----
store.db.datasourcedruid
store.db.dbTypemysql
# 需要根据mysql的版本调整driverClassName
# mysql8及以上版本对应的drivercom.mysql.cj.jdbc.Driver
# mysql8以下版本的drivercom.mysql.jdbc.Driver
store.db.driverClassNamecom.mysql.jdbc.Driver
store.db.urljdbc:mysql://172.17.0.2:3306/seata?useUnicodetruecharacterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseSSLfalse
store.db.user root
store.db.password1009
# 数据库初始连接数
store.db.minConn1
# 数据库最大连接数
store.db.maxConn20
# 获取连接时最大等待时间 默认5000单位毫秒
store.db.maxWait5000
# 全局事务表名 默认global_table
store.db.globalTableglobal_table
# 分支事务表名 默认branch_table
store.db.branchTablebranch_table
# 全局锁表名 默认lock_table
store.db.lockTablelock_table
store.db.distributedLockTabledistributed_lock
# 查询全局事务一次的最大条数 默认100
store.db.queryLimit100# undo保留天数 默认7天,log_status1附录3和未正常清理的undo
server.undo.logSaveDays7
# undo清理线程间隔时间 默认86400000单位毫秒
server.undo.logDeletePeriod86400000
# 二阶段提交重试超时时长 单位ms,s,m,h,d,对应毫秒,秒,分,小时,天,默认毫秒。默认值-1表示无限重试
# 公式: timeoutnow-globalTransactionBeginTime,true表示超时则不再重试
# 注: 达到超时时间后将不会做任何重试,有数据不一致风险,除非业务自行可校准数据,否者慎用
server.maxCommitRetryTimeout-1
# 二阶段回滚重试超时时长
server.maxRollbackRetryTimeout-1
# 二阶段提交未完成状态全局事务重试提交线程间隔时间 默认1000单位毫秒
server.recovery.committingRetryPeriod1000
# 二阶段异步提交状态重试提交线程间隔时间 默认1000单位毫秒
server.recovery.asynCommittingRetryPeriod1000
# 二阶段回滚状态重试回滚线程间隔时间 默认1000单位毫秒
server.recovery.rollbackingRetryPeriod1000
# 超时状态检测重试线程间隔时间 默认1000单位毫秒检测出超时将全局事务置入回滚会话管理器
server.recovery.timeoutRetryPeriod1000四、部署Seata
宿主机新建一个application.yml文件内容如下
server:port: 7091spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${user.home}/logs/seataextend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstashconsole:user:username: seatapassword: seataseata:config:# support: nacos, consul, apollo, zk, etcd3type: nacosnacos:server-addr: 172.17.0.3:8848namespace:group: DEFAULT_GROUPusername: nacospassword: nacosdata-id: seataServer.propertiesregistry:# support: nacos, eureka, redis, zk, consul, etcd3, sofatype: nacosnacos:application: seata-tc-serverserver-addr: 172.17.0.3:8848group: DEFAULT_GROUPnamespace:# tc集群名称cluster: SHusername: nacospassword: nacos# server:# service-port: 8091 #If not configured, the default is ${server.port} 1000security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login然后用以下命令运行seata容器
docker run --name seata-server \-itd \-p 8091:8091 \-p 7091:7091 \-e STORE_MODEdb \-e SEATA_IP192.168.1.102 \-e SEATA_PORT8091 \-v path/to/application.yml:/seata-server/resources/application.yml \seataio/seata-server:2.0.0五、初步检验Seata部署情况
访问Seata网页这里是http://192.168.1.102:7091/输入两个seata后进入系统。 Nacos网页上查看Seata服务详情ip为宿主机ip不要是docker容器内网ip就行。
六、微服务使用Seata
1.引入依赖 !--seata--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactIdexclusions!--版本较低1.3.0因此排除--exclusionartifactIdseata-spring-boot-starter/artifactIdgroupIdio.seata/groupId/exclusion/exclusions/dependency!--seata starter 采用2.0.0版本--dependencygroupIdio.seata/groupIdartifactIdseata-spring-boot-starter/artifactIdversion2.0.0/version/dependency2. application.yml配置
seata:registry:type: nacosnacos: # tcserver-addr: localhost:8848namespace: group: DEFAULT_GROUPapplication: seata-tc-server # tc服务在nacos中的服务名称cluster: SHusername: nacospassword: nacostx-service-group: seata-demo # 事务组根据这个获取tc服务的cluster名称service:vgroup-mapping: # 事务组与TC服务cluster的映射关系seata-demo: SH启动微服务后除了可以看微服务的日志外还可以看Seata容器日志出现类似以下日志即为正常
2023-12-30 21:37:35 digestseata-demo,192.168.222.1,1703943453643
2023-12-30 21:37:35 timestamp1703943453643
2023-12-30 21:37:35 authVersionV4
2023-12-30 21:37:35 vgroupseata-demo
2023-12-30 21:37:35 ip192.168.222.1
2023-12-30 21:37:35 },channel:[id: 0x7f82356a, L:/172.17.0.4:8091 - R:/172.17.0.1:35092],client version:2.0.0
2023-12-30 21:37:36 21:37:36.389 INFO --- [rverHandlerThread_1_6_500] [rocessor.server.RegRmProcessor] [ onRegRmMessage] [] : RM register success,message:RegisterRMRequest{resourceIdsjdbc:mysql://localhost:3306/seata_demo, version2.0.0, applicationIdorder-service, transactionServiceGroupseata-demo, extraDatanull},channel:[id: 0x3a9f4e29, L:/172.17.0.4:8091 - R:/172.17.0.1:35096],client version:2.0.0七、遇到的坑
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时要多加一行
store.db.distributedLockTabledistributed_lock这点在官网文档都没有提及。