From 368f3fd10fe1402674d765fc00d95d1626b5db9a Mon Sep 17 00:00:00 2001 From: hfwangyl Date: Tue, 20 Apr 2021 11:01:43 +0800 Subject: [PATCH] seata --- kernel-d-seata/README.md | 1 + kernel-d-seata/db/db.sql | 111 +++++++++++++++++ kernel-d-seata/doc/seata使用手册.docx | Bin 0 -> 13507 bytes kernel-d-seata/pom.xml | 33 +++++ kernel-d-seata/seata-demo-order/pom.xml | 41 +++++++ .../seata/order/consumer/StorageConsumer.java | 13 ++ .../seata/order/consumer/WalletConsumer.java | 13 ++ .../order/controller/OrderController.java | 26 ++++ .../kernel/seata/order/entity/Order.java | 116 ++++++++++++++++++ .../seata/order/mapper/OrderMapper.java | 16 +++ .../order/mapper/mapping/OrderMapper.xml | 38 ++++++ .../seata/order/service/OrderService.java | 9 ++ .../order/service/impl/OrderServiceImpl.java | 41 +++++++ kernel-d-seata/seata-demo-storage-api/pom.xml | 17 +++ .../roses/kernel/seata/api/StorageApi.java | 16 +++ kernel-d-seata/seata-demo-wallet-api/pom.xml | 17 +++ .../kernel/seata/wallet/api/WalletApi.java | 16 +++ pom.xml | 3 + 18 files changed, 527 insertions(+) create mode 100644 kernel-d-seata/README.md create mode 100644 kernel-d-seata/db/db.sql create mode 100644 kernel-d-seata/doc/seata使用手册.docx create mode 100644 kernel-d-seata/pom.xml create mode 100644 kernel-d-seata/seata-demo-order/pom.xml create mode 100644 kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/consumer/StorageConsumer.java create mode 100644 kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/consumer/WalletConsumer.java create mode 100644 kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/controller/OrderController.java create mode 100644 kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/entity/Order.java create mode 100644 kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/mapper/OrderMapper.java create mode 100644 kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/mapper/mapping/OrderMapper.xml create mode 100644 kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/service/OrderService.java create mode 100644 kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/service/impl/OrderServiceImpl.java create mode 100644 kernel-d-seata/seata-demo-storage-api/pom.xml create mode 100644 kernel-d-seata/seata-demo-storage-api/src/main/java/cn/stylefeng/roses/kernel/seata/api/StorageApi.java create mode 100644 kernel-d-seata/seata-demo-wallet-api/pom.xml create mode 100644 kernel-d-seata/seata-demo-wallet-api/src/main/java/cn/stylefeng/roses/kernel/seata/wallet/api/WalletApi.java diff --git a/kernel-d-seata/README.md b/kernel-d-seata/README.md new file mode 100644 index 000000000..aff0b4426 --- /dev/null +++ b/kernel-d-seata/README.md @@ -0,0 +1 @@ +分布式事务Seata模块 diff --git a/kernel-d-seata/db/db.sql b/kernel-d-seata/db/db.sql new file mode 100644 index 000000000..dbd4925a7 --- /dev/null +++ b/kernel-d-seata/db/db.sql @@ -0,0 +1,111 @@ + +-- ---------------------------- +-- 订单库 +-- ---------------------------- +DROP DATABASE IF EXISTS `order`; +CREATE DATABASE IF NOT EXISTS `order` DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; + +USE `order`; + +DROP TABLE IF EXISTS `order_info`; +CREATE TABLE `order_info` ( + `order_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单ID', + `product_id` bigint(20) NOT NULL COMMENT '商品ID', + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `prod_price` double(8, 2) NOT NULL COMMENT '商品单价', + `prod_number` int(11) NOT NULL COMMENT '商品数量', + `total_amount` double(10, 2) NOT NULL COMMENT '总价', + `pay_status` int(11) NOT NULL COMMENT '支付状态:1待支付,2已支付,3支付失败,已取消', + `create_user` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint(20) NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`order_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '订单表' ROW_FORMAT = Dynamic; + +DROP TABLE IF EXISTS `undo_log`; +CREATE TABLE `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 COMMENT = 'seata事务记录'; + + +-- ---------------------------- +-- 仓储库 +-- ---------------------------- +DROP DATABASE IF EXISTS `storage`; +CREATE DATABASE IF NOT EXISTS `storage` DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; + +USE `storage`; + +DROP TABLE IF EXISTS `product_info`; +CREATE TABLE `product_info` ( + `prod_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '商品ID', + `prod_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商品名称', + `inventory` int(11) NOT NULL COMMENT '库存数量', + `prod_price` double(8, 2) NOT NULL COMMENT '商品单价', + `prod_status` int(11) NOT NULL COMMENT '上架状态:1上架,2下架', + `create_user` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint(20) NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`prod_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '商品表' ROW_FORMAT = Dynamic; + +DROP TABLE IF EXISTS `undo_log`; +CREATE TABLE `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 COMMENT = 'seata事务记录'; + + +-- ---------------------------- +-- 用户库 +-- ---------------------------- +DROP DATABASE IF EXISTS `member`; +CREATE DATABASE IF NOT EXISTS `member` DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; + +USE `member`; + +DROP TABLE IF EXISTS `member_wallet`; +CREATE TABLE `member_wallet` ( + `member_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '会员ID', + `member_balance` double(8, 2) DEFAULT '0.00' COMMENT '会员余额', + `member_integral` double(8, 2) DEFAULT '0.00' COMMENT '会员积分', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_user` bigint(20) NULL DEFAULT NULL COMMENT '更新者', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`member_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户钱包' ROW_FORMAT = Dynamic; + +DROP TABLE IF EXISTS `undo_log`; +CREATE TABLE `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 COMMENT = 'seata事务记录'; diff --git a/kernel-d-seata/doc/seata使用手册.docx b/kernel-d-seata/doc/seata使用手册.docx new file mode 100644 index 0000000000000000000000000000000000000000..9b129bfc03fedf2d2b623abe05e42062c27ffe71 GIT binary patch literal 13507 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 H-$DNaLzr43 literal 0 HcmV?d00001 diff --git a/kernel-d-seata/pom.xml b/kernel-d-seata/pom.xml new file mode 100644 index 000000000..cf5b61599 --- /dev/null +++ b/kernel-d-seata/pom.xml @@ -0,0 +1,33 @@ + + + + cn.stylefeng.roses + roses-kernel + 7.0.2 + ../pom.xml + + 4.0.0 + + kernel-d-seata + + pom + + seata-demo-wallet-api + seata-demo-storage-api + seata-demo-order + + + + + + + cn.stylefeng.roses + kernel-a-rule + 7.0.2 + + + + + diff --git a/kernel-d-seata/seata-demo-order/pom.xml b/kernel-d-seata/seata-demo-order/pom.xml new file mode 100644 index 000000000..1c6503889 --- /dev/null +++ b/kernel-d-seata/seata-demo-order/pom.xml @@ -0,0 +1,41 @@ + + + + cn.stylefeng.roses + kernel-d-seata + 7.0.2 + ../pom.xml + + 4.0.0 + + seata-demo-order + + jar + + + org.springframework.cloud + spring-cloud-openfeign-core + 2.2.6.RELEASE + + + cn.stylefeng.roses + seata-demo-storage-api + 7.0.2 + compile + + + cn.stylefeng.roses + seata-demo-wallet-api + 7.0.2 + compile + + + io.seata + seata-all + 1.3.0 + + + + diff --git a/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/consumer/StorageConsumer.java b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/consumer/StorageConsumer.java new file mode 100644 index 000000000..acf94aa9f --- /dev/null +++ b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/consumer/StorageConsumer.java @@ -0,0 +1,13 @@ +package cn.stylefeng.roses.kernel.seata.order.consumer; + +import cn.stylefeng.roses.kernel.seata.api.StorageApi; +import org.springframework.cloud.openfeign.FeignClient; + +/** + * 仓储api + * @author wangyl + * @Date 2021-04-10 9:25:13 + */ +@FeignClient(name = "seata-demo-storage") +public interface StorageConsumer extends StorageApi { +} diff --git a/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/consumer/WalletConsumer.java b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/consumer/WalletConsumer.java new file mode 100644 index 000000000..09031948d --- /dev/null +++ b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/consumer/WalletConsumer.java @@ -0,0 +1,13 @@ +package cn.stylefeng.roses.kernel.seata.order.consumer; + +import cn.stylefeng.roses.kernel.seata.wallet.api.WalletApi; +import org.springframework.cloud.openfeign.FeignClient; + +/** + * 用户钱包api + * @author wangyl + * @Date 2021-04-10 9:25:13 + */ +@FeignClient(name = "seata-demo-wallet") +public interface WalletConsumer extends WalletApi { +} diff --git a/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/controller/OrderController.java b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/controller/OrderController.java new file mode 100644 index 000000000..00059c054 --- /dev/null +++ b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/controller/OrderController.java @@ -0,0 +1,26 @@ +package cn.stylefeng.roses.kernel.seata.order.controller; + +import cn.stylefeng.roses.kernel.seata.order.entity.Order; +import cn.stylefeng.roses.kernel.seata.order.service.OrderService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * 订单接口 + * @author wangyl + * @Date 2021-04-10 9:25:13 + */ +public class OrderController { + + @Autowired + OrderService orderService; + + /** + * 创建订单 + */ + @GetMapping("/create") + Order create(String userId, String commodityCode, int orderCount){ + return orderService.create(userId,commodityCode,orderCount); + } + +} diff --git a/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/entity/Order.java b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/entity/Order.java new file mode 100644 index 000000000..36ecb95cf --- /dev/null +++ b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/entity/Order.java @@ -0,0 +1,116 @@ +package cn.stylefeng.roses.kernel.seata.order.entity; + +import java.io.Serializable; +import java.util.Date; + +public class Order implements Serializable { + + private Long orderId; + private Long productId; + private Long userId; + private Integer prodPrice; + private Integer prodNumber; + private Integer totalAmount; + private Integer payStatus; + private Long createUser; + private Date createTime; + private Long updateUser; + private Date updateTime; + private String remark; + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getProductId() { + return productId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getProdPrice() { + return prodPrice; + } + + public void setProdPrice(Integer prodPrice) { + this.prodPrice = prodPrice; + } + + public Integer getProdNumber() { + return prodNumber; + } + + public void setProdNumber(Integer prodNumber) { + this.prodNumber = prodNumber; + } + + public Integer getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Integer totalAmount) { + this.totalAmount = totalAmount; + } + + public Integer getPayStatus() { + return payStatus; + } + + public void setPayStatus(Integer payStatus) { + this.payStatus = payStatus; + } + + public Long getCreateUser() { + return createUser; + } + + public void setCreateUser(Long createUser) { + this.createUser = createUser; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(Long updateUser) { + this.updateUser = updateUser; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } +} diff --git a/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/mapper/OrderMapper.java b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/mapper/OrderMapper.java new file mode 100644 index 000000000..edd600268 --- /dev/null +++ b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/mapper/OrderMapper.java @@ -0,0 +1,16 @@ +package cn.stylefeng.roses.kernel.seata.order.mapper; + +import cn.stylefeng.roses.kernel.seata.order.entity.Order; + +/** + * 数据层 + * + * @author wangyl + */ +public interface OrderMapper { + + void insertOrder(Order order); + + Order selectById(Long orderId); + +} diff --git a/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/mapper/mapping/OrderMapper.xml b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/mapper/mapping/OrderMapper.xml new file mode 100644 index 000000000..192054e36 --- /dev/null +++ b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/mapper/mapping/OrderMapper.xml @@ -0,0 +1,38 @@ + + + + + + insert into order( + product_id, + user_id, + prod_price, + prod_number, + total_amount, + pay_status, + create_user, + create_time + update_user, + update_time, + remark, + )values( + #{productId}, + #{userId}, + #{prodPrice}, + #{prodNumber}, + #{totalAmount}, + #{payStatus}, + #{createUser}, + #{createTime} + #{updateUser}, + #{updateTime}, + #{remark}, + ) + + + + + diff --git a/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/service/OrderService.java b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/service/OrderService.java new file mode 100644 index 000000000..78d2f299c --- /dev/null +++ b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/service/OrderService.java @@ -0,0 +1,9 @@ +package cn.stylefeng.roses.kernel.seata.order.service; + +import cn.stylefeng.roses.kernel.seata.order.entity.Order; + +public interface OrderService { + + Order create(String userId, String commodityCode, int orderCount); + +} diff --git a/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/service/impl/OrderServiceImpl.java b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/service/impl/OrderServiceImpl.java new file mode 100644 index 000000000..90ef8510e --- /dev/null +++ b/kernel-d-seata/seata-demo-order/src/main/java/cn/stylefeng/roses/kernel/seata/order/service/impl/OrderServiceImpl.java @@ -0,0 +1,41 @@ +package cn.stylefeng.roses.kernel.seata.order.service.impl; + +import cn.stylefeng.roses.kernel.seata.order.consumer.StorageConsumer; +import cn.stylefeng.roses.kernel.seata.order.consumer.WalletConsumer; +import cn.stylefeng.roses.kernel.seata.order.entity.Order; +import cn.stylefeng.roses.kernel.seata.order.mapper.OrderMapper; +import cn.stylefeng.roses.kernel.seata.order.service.OrderService; +import io.seata.spring.annotation.GlobalTransactional; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class OrderServiceImpl implements OrderService { + + @Autowired + private StorageConsumer storageConsumer; + @Autowired + private WalletConsumer walletConsumer; + @Autowired + private OrderMapper orderMapper; + + /** + * 分布式事务跨库操作,起始位置,使用@GlobalTransactional注解修饰 + * @param userId + * @param commodityCode + * @param orderCount + * @return + */ + @GlobalTransactional(rollbackFor = Exception.class) + @Override + public Order create(String userId, String commodityCode, int orderCount) { + Order order = new Order(); + //保存订单 + orderMapper.insertOrder(order); + //扣减商品库存 + storageConsumer.deduct(commodityCode,orderCount); + //扣用户钱 + walletConsumer.debit(userId,order.getTotalAmount()); + return order; + } +} diff --git a/kernel-d-seata/seata-demo-storage-api/pom.xml b/kernel-d-seata/seata-demo-storage-api/pom.xml new file mode 100644 index 000000000..8bfb389a4 --- /dev/null +++ b/kernel-d-seata/seata-demo-storage-api/pom.xml @@ -0,0 +1,17 @@ + + + + cn.stylefeng.roses + kernel-d-seata + 7.0.2 + ../pom.xml + + 4.0.0 + + seata-demo-storage-api + + jar + + diff --git a/kernel-d-seata/seata-demo-storage-api/src/main/java/cn/stylefeng/roses/kernel/seata/api/StorageApi.java b/kernel-d-seata/seata-demo-storage-api/src/main/java/cn/stylefeng/roses/kernel/seata/api/StorageApi.java new file mode 100644 index 000000000..f45a7b30a --- /dev/null +++ b/kernel-d-seata/seata-demo-storage-api/src/main/java/cn/stylefeng/roses/kernel/seata/api/StorageApi.java @@ -0,0 +1,16 @@ +package cn.stylefeng.roses.kernel.seata.api; + +/** + * 仓储api + * + * @author wangyl + * @date 2021-04-11 9:52:31 + */ +public interface StorageApi { + + /** + * 扣除存储数量 + */ + void deduct(String commodityCode, int count); + +} diff --git a/kernel-d-seata/seata-demo-wallet-api/pom.xml b/kernel-d-seata/seata-demo-wallet-api/pom.xml new file mode 100644 index 000000000..6bae3c51b --- /dev/null +++ b/kernel-d-seata/seata-demo-wallet-api/pom.xml @@ -0,0 +1,17 @@ + + + + cn.stylefeng.roses + kernel-d-seata + 7.0.2 + ../pom.xml + + 4.0.0 + + seata-demo-wallet-api + + jar + + diff --git a/kernel-d-seata/seata-demo-wallet-api/src/main/java/cn/stylefeng/roses/kernel/seata/wallet/api/WalletApi.java b/kernel-d-seata/seata-demo-wallet-api/src/main/java/cn/stylefeng/roses/kernel/seata/wallet/api/WalletApi.java new file mode 100644 index 000000000..c7caa0ae7 --- /dev/null +++ b/kernel-d-seata/seata-demo-wallet-api/src/main/java/cn/stylefeng/roses/kernel/seata/wallet/api/WalletApi.java @@ -0,0 +1,16 @@ +package cn.stylefeng.roses.kernel.seata.wallet.api; + +/** + * 用户钱包api + * + * @author wangyl + * @date 2021-04-10 8:56:48 + */ +public interface WalletApi { + + /** + * 从用户账户中借出 + */ + void debit(String userId, int money); + +} diff --git a/pom.xml b/pom.xml index 6004ce866..2f053ec18 100644 --- a/pom.xml +++ b/pom.xml @@ -94,6 +94,9 @@ kernel-s-system + + kernel-d-seata +