一、本文通過微服務 feign調用的模式,集成seata和nacos 以及具體使用
下載已有開源代碼(包含已經實現的接口,看效果即可)
1. 接口實現調用方式如下:
2. 源碼下載地址
https://github.com/YunaiV/SpringBoot-Labs 裏面的 labx-17 代碼
二、創建數據庫
# Order
DROP DATABASE IF EXISTS seata_order;
CREATE DATABASE seata_order;
CREATE TABLE seata_order.orders
(
id INT(11) NOT NULL AUTO_INCREMENT,
user_id INT(11) DEFAULT NULL,
product_id INT(11) DEFAULT NULL,
pay_amount DECIMAL(10, 0) DEFAULT NULL,
add_time DATETIME DEFAULT CURRENT_TIMESTAMP,
last_update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
CREATE TABLE seata_order.undo_log
(
id BIGINT(20) NOT NULL AUTO_INCREMENT,
branch_id BIGINT(20) NOT NULL,
xid VARCHAR(100) NOT NULL,
context VARCHAR(128) NOT NULL,
rollback_info LONGBLOB NOT NULL,
log_status INT(11) NOT NULL,
log_created DATETIME NOT NULL,
log_modified DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY ux_undo_log (xid, branch_id)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
# Product
DROP DATABASE IF EXISTS seata_product;
CREATE DATABASE seata_product;
CREATE TABLE seata_product.product
(
id INT(11) NOT NULL AUTO_INCREMENT,
stock INT(11) DEFAULT NULL,
last_update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
INSERT INTO seata_product.product (id, stock) VALUES (1, 10); # 插入一條產品的庫存
CREATE TABLE seata_product.undo_log
(
id BIGINT(20) NOT NULL AUTO_INCREMENT,
branch_id BIGINT(20) NOT NULL,
xid VARCHAR(100) NOT NULL,
context VARCHAR(128) NOT NULL,
rollback_info LONGBLOB NOT NULL,
log_status INT(11) NOT NULL,
log_created DATETIME NOT NULL,
log_modified DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY ux_undo_log (xid, branch_id)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
# Account
DROP DATABASE IF EXISTS seata_account;
CREATE DATABASE seata_account;
CREATE TABLE seata_account.account
(
id INT(11) NOT NULL AUTO_INCREMENT,
balance DOUBLE DEFAULT NULL,
last_update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
CREATE TABLE seata_account.undo_log
(
id BIGINT(20) NOT NULL AUTO_INCREMENT,
branch_id BIGINT(20) NOT NULL,
xid VARCHAR(100) NOT NULL,
context VARCHAR(128) NOT NULL,
rollback_info LONGBLOB NOT NULL,
log_status INT(11) NOT NULL,
log_created DATETIME NOT NULL,
log_modified DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY ux_undo_log (xid, branch_id)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
INSERT INTO seata_account.account (id, balance) VALUES (1, 10);
三、修改三個服務中的配置yaml文件,修改爲你自己的數據庫和nacos配置,我的是修改後的配置,供參考,可覆蓋使用
server:
port: 8083
spring:
application:
name: account-service
datasource:
url: jdbc:mysql://192.168.28.134:3306/seata_account?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
cloud:
# Nacos 作爲註冊中心的配置項
nacos:
discovery:
server-addr: 192.168.28.134:8848
# Seata 配置項,對應 SeataProperties 類
seata:
application-id: account-service # Seata 應用編號,默認爲 ${spring.application.name}
tx-service-group: my_test_tx_group # Seata 事務組編號,用於 TC 集羣名
# Seata 服務配置項,對應 ServiceProperties 類
config:
type: nacos
nacos:
group: SEATA_GROUP
namespace:
server-addr: 192.168.28.134:8848
service:
# 虛擬組和分組的映射
vgroup-mapping:
my_test_tx_group: default
# Seata 註冊中心配置項,對應 RegistryProperties 類
registry:
type: nacos # 註冊中心類型,默認爲 file
nacos:
cluster: default # 使用的 Seata 分組
namespace: # Nacos 命名空間
serverAddr: 192.168.28.134:8848 # Nacos 服務地址
enabled: true
注意上面的seata配置裏面, tx-service-group: my_test_tx_group , my_test_tx_group這裏要和nacos中的值保持一致,對應
的nacos seata配置key爲 :service.vgroupMapping.my_test_tx_group
不一致會報錯。
四、 具體演示效果請參考
http://www.iocoder.cn/Spring-Cloud-Alibaba/Seata/?self 下 3. AT 模式 + Feign
特此記錄demo運行過程中碰到的問題和成功步驟。