diff --git a/README.md b/README.md index 3ef8c0f04..98d7b9d75 100644 --- a/README.md +++ b/README.md @@ -80,8 +80,8 @@ TODO 此处应有一个架构图的装逼 JPG 图。 | `admin-web` | 【前端】管理后台 | HTTP 8080 | | | `mobile-web` | 【前端】商城 H5 | HTTP 8000 | | | `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 | | +| `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 | | diff --git a/product/product-application/src/main/resources/application-test.yaml b/product/product-application/src/main/resources/application-test.yaml new file mode 100644 index 000000000..22be4ba61 --- /dev/null +++ b/product/product-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.product.application.controller diff --git a/product/product-application/src/main/resources/application.yaml b/product/product-application/src/main/resources/application.yaml index 4718d8c3e..67a4b43dd 100644 --- a/product/product-application/src/main/resources/application.yaml +++ b/product/product-application/src/main/resources/application.yaml @@ -9,7 +9,4 @@ server: context-path: /product-api/ swagger: - title: 商品子系统 - description: 商品子系统 - version: 1.0.0 - base-package: cn.iocoder.mall.product.application.controller + enable: false diff --git a/product/product-service-impl/pom.xml b/product/product-service-impl/pom.xml index 95498304c..961cd349f 100644 --- a/product/product-service-impl/pom.xml +++ b/product/product-service-impl/pom.xml @@ -44,6 +44,15 @@ mybatis-plus-boot-starter + + io.seata + seata-spring + + + io.seata + seata-dubbo + + org.apache.dubbo diff --git a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/config/DatabaseConfiguration.java b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/config/DatabaseConfiguration.java index b1020e51a..1532adc63 100644 --- a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/config/DatabaseConfiguration.java +++ b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/config/DatabaseConfiguration.java @@ -1,14 +1,48 @@ package cn.iocoder.mall.product.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.product.dao") // 扫描对应的 Mapper 接口 @EnableTransactionManagement(proxyTargetClass = true) // 启动事务管理。为什么使用 proxyTargetClass 参数,参见 https://blog.csdn.net/huang_550/article/details/76492600 public class DatabaseConfiguration { - // 数据源,使用 HikariCP + @Value("${spring.application.name}") + private String applicationId; + @Value("${seata.tx-service-group}") + private String txServiceGroup; -} \ No newline at end of file + @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/product/product-service-impl/src/main/resources/config/application.yaml b/product/product-service-impl/src/main/resources/config/application.yaml index a7d3cee8d..e4814b7bd 100644 --- a/product/product-service-impl/src/main/resources/config/application.yaml +++ b/product/product-service-impl/src/main/resources/config/application.yaml @@ -39,3 +39,7 @@ rocketmq: name-server: 127.0.0.1:9876 producer: group: product-producer-group + +# seata +seata: + tx-service-group: my_test_tx_group diff --git a/product/product-service-impl/src/main/resources/file.conf b/product/product-service-impl/src/main/resources/file.conf new file mode 100644 index 000000000..8b60b29c3 --- /dev/null +++ b/product/product-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/product/product-service-impl/src/main/resources/registry.conf b/product/product-service-impl/src/main/resources/registry.conf new file mode 100644 index 000000000..f73989514 --- /dev/null +++ b/product/product-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 + } +}