diff --git a/README.md b/README.md
index 98d7b9d75..85d5d4a88 100644
--- a/README.md
+++ b/README.md
@@ -82,10 +82,10 @@ TODO 此处应有一个架构图的装逼 JPG 图。
| `admin-application` | 管理员 HTTP 服务 | HTTP 18083 | [接口文档](http://api.shop.iocoder.cn:18099/admin-api/doc.html) |
| `user-application` | 用户 HTTP 服务 | HTTP 18082 | [接口文档](http://api.shop.iocoder.cn:18099/user-api/doc.html) |
| `product-application` | 商品 HTTP 服务 | HTTP 18081 | [接口文档](http://api.shop.iocoder.cn:18099/product-api/doc.html) |
-| `pay-application` | 支付 HTTP 服务 | HTTP 18084 | |
-| `promotion-application` | 促销 HTTP 服务 | HTTP 18085 | |
-| `search-application` | 搜索 HTTP 服务 | HTTP 18086 | |
-| `order-application` | 订单 HTTP 服务 | HTTP 18088 | |
+| `pay-application` | 支付 HTTP 服务 | HTTP 18084 | [接口文档](http://api.shop.iocoder.cn:18099/pay-api/doc.html) |
+| `promotion-application` | 促销 HTTP 服务 | HTTP 18085 | [接口文档](http://api.shop.iocoder.cn:18099/promotion-api/doc.html) |
+| `search-application` | 搜索 HTTP 服务 | HTTP 18086 | [接口文档](http://api.shop.iocoder.cn:18099/search-api/doc.html) |
+| `order-application` | 订单 HTTP 服务 | HTTP 18088 | [接口文档](http://api.shop.iocoder.cn:18099/order-api/doc.html) |
-------
diff --git a/pay/pay-application/src/main/resources/application-test.yaml b/pay/pay-application/src/main/resources/application-test.yaml
new file mode 100644
index 000000000..fe7f43541
--- /dev/null
+++ b/pay/pay-application/src/main/resources/application-test.yaml
@@ -0,0 +1,6 @@
+swagger:
+ enable: true
+ title: 支付子系统
+ description: 支付子系统
+ version: 1.0.0
+ base-package: cn.iocoder.mall.pay.application.controller
diff --git a/pay/pay-application/src/main/resources/application.yaml b/pay/pay-application/src/main/resources/application.yaml
index 8b3774d8e..689842999 100644
--- a/pay/pay-application/src/main/resources/application.yaml
+++ b/pay/pay-application/src/main/resources/application.yaml
@@ -9,7 +9,4 @@ server:
context-path: /pay-api/
swagger:
- title: 支付子系统
- description: 支付子系统
- version: 1.0.0
- base-package: cn.iocoder.mall.pay.application.controller
+ enable: false
diff --git a/pay/pay-service-impl/pom.xml b/pay/pay-service-impl/pom.xml
index 0d900e7f3..65aedbc29 100644
--- a/pay/pay-service-impl/pom.xml
+++ b/pay/pay-service-impl/pom.xml
@@ -54,6 +54,15 @@
mybatis-plus-boot-starter
+
+ io.seata
+ seata-spring
+
+
+ io.seata
+ seata-dubbo
+
+
org.apache.dubbo
diff --git a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/config/DatabaseConfiguration.java b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/config/DatabaseConfiguration.java
index b98b2998c..c8636d211 100644
--- a/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/config/DatabaseConfiguration.java
+++ b/pay/pay-service-impl/src/main/java/cn/iocoder/mall/pay/biz/config/DatabaseConfiguration.java
@@ -1,14 +1,48 @@
package cn.iocoder.mall.pay.biz.config;
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
+import io.seata.rm.datasource.DataSourceProxy;
+import io.seata.spring.annotation.GlobalTransactionScanner;
import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.context.annotation.Primary;
import org.springframework.transaction.annotation.EnableTransactionManagement;
+import javax.sql.DataSource;
+
@Configuration
@MapperScan("cn.iocoder.mall.pay.biz.dao") // 扫描对应的 Mapper 接口
@EnableTransactionManagement(proxyTargetClass = true) // 启动事务管理。为什么使用 proxyTargetClass 参数,参见 https://blog.csdn.net/huang_550/article/details/76492600
public class DatabaseConfiguration {
- // 数据源,使用 Druid
+ @Value("${spring.application.name}")
+ private String applicationId;
+ @Value("${seata.tx-service-group}")
+ private String txServiceGroup;
+
+ @Bean("druidDataSource")
+ @ConfigurationProperties("spring.datasource.druid")
+ public DruidDataSource druidDataSource(){
+ return DruidDataSourceBuilder.create().build();
+ }
+
+ @ConfigurationProperties(prefix = "spring.datasource")
+ @Primary
+ @Bean("dataSource")
+ @DependsOn("druidDataSource") // 解决多数据源,循环依赖的问题。主要发生点在 DataSourceInitializerInvoker
+ public DataSource dataSource() {
+ DruidDataSource druidDataSource = druidDataSource();
+ return new DataSourceProxy(druidDataSource);
+ }
+
+ @Bean
+ public GlobalTransactionScanner globalTransactionScanner() {
+ return new GlobalTransactionScanner(applicationId, txServiceGroup);
+ }
}
diff --git a/pay/pay-service-impl/src/main/resources/config/application.yaml b/pay/pay-service-impl/src/main/resources/config/application.yaml
index 2acaa6315..c32231710 100644
--- a/pay/pay-service-impl/src/main/resources/config/application.yaml
+++ b/pay/pay-service-impl/src/main/resources/config/application.yaml
@@ -35,3 +35,7 @@ rocketmq:
name-server: 127.0.0.1:9876
producer:
group: pay-producer-group
+
+# seata
+seata:
+ tx-service-group: my_test_tx_group
diff --git a/pay/pay-service-impl/src/main/resources/file.conf b/pay/pay-service-impl/src/main/resources/file.conf
new file mode 100644
index 000000000..8b60b29c3
--- /dev/null
+++ b/pay/pay-service-impl/src/main/resources/file.conf
@@ -0,0 +1,69 @@
+transport {
+ # tcp udt unix-domain-socket
+ type = "TCP"
+ #NIO NATIVE
+ server = "NIO"
+ #enable heartbeat
+ heartbeat = true
+ #thread factory for netty
+ thread-factory {
+ boss-thread-prefix = "NettyBoss"
+ worker-thread-prefix = "NettyServerNIOWorker"
+ server-executor-thread-prefix = "NettyServerBizHandler"
+ share-boss-worker = false
+ client-selector-thread-prefix = "NettyClientSelector"
+ client-selector-thread-size = 1
+ client-worker-thread-prefix = "NettyClientWorkerThread"
+ # netty boss thread size,will not be used for UDT
+ boss-thread-size = 1
+ #auto default pin or 8
+ worker-thread-size = 8
+ }
+}
+
+service {
+ #vgroup->rgroup
+ vgroup_mapping.my_test_tx_group = "default"
+ #only support single node
+ default.grouplist = "180.167.213.26:8091"
+ #degrade current not support
+ enableDegrade = false
+ #disable
+ disable = false
+}
+
+client {
+ async.commit.buffer.limit = 10000
+ lock {
+ retry.internal = 10
+ retry.times = 30
+ }
+}
+## transaction log store
+store {
+ ## store mode: file、db
+ mode = "file"
+
+ ## file store
+ file {
+ dir = "file_store/data"
+
+ # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
+ max-branch-session-size = 16384
+ # globe session size , if exceeded throws exceptions
+ max-global-session-size = 512
+ # file buffer size , if exceeded allocate new buffer
+ file-write-buffer-cache-size = 16384
+ # when recover batch read size
+ session.reload.read_size = 100
+ }
+
+ ## database store
+ db {
+ driver_class = ""
+ url = ""
+ user = ""
+ password = ""
+ }
+}
+
diff --git a/pay/pay-service-impl/src/main/resources/registry.conf b/pay/pay-service-impl/src/main/resources/registry.conf
new file mode 100644
index 000000000..f73989514
--- /dev/null
+++ b/pay/pay-service-impl/src/main/resources/registry.conf
@@ -0,0 +1,14 @@
+registry {
+ type = "file"
+
+ file {
+ name = "file.conf"
+ }
+
+ zk {
+ cluster = "default"
+ serverAddr = "192.168.88.10:2181"
+ session.timeout = 6000
+ connect.timeout = 2000
+ }
+}