Explorar el Código

feat: 实现和使用分库分表

seamew hace 2 años
padre
commit
4416d15643

+ 3 - 0
lottery-domain/pom.xml

@@ -18,6 +18,7 @@
     </properties>
 
     <dependencies>
+        <!-- spring -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
@@ -26,6 +27,8 @@
             <groupId>org.springframework</groupId>
             <artifactId>spring-tx</artifactId>
         </dependency>
+
+        <!-- 三方工具类 -->
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>

+ 4 - 1
lottery-infrastructure/pom.xml

@@ -22,7 +22,10 @@
             <groupId>org.mybatis.spring.boot</groupId>
             <artifactId>mybatis-spring-boot-starter</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>com.seamew</groupId>
+            <artifactId>db-router-spring-boot-starter</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.seamew</groupId>
             <artifactId>lottery-domain</artifactId>

+ 32 - 0
lottery-infrastructure/src/main/java/com/seamew/lottery/infrastructure/dao/IUserStrategyExportDao.java

@@ -0,0 +1,32 @@
+package com.seamew.lottery.infrastructure.dao;
+
+import com.seamew.lottery.infrastructure.po.UserStrategyExport;
+import com.seamew.middleware.db.router.annotation.DBRouter;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Author: seamew
+ * @Title: IUserStrategyExportDao
+ * @CreateTime: 2023年02月22日 16:01:00
+ * @Description: 用户策略计算结果表DAO
+ * @Version: 1.0
+ */
+@Mapper
+public interface IUserStrategyExportDao {
+    /**
+     * 新增数据
+     *
+     * @param userStrategyExport 用户策略
+     */
+    @DBRouter(splitTable = true)
+    void insert(UserStrategyExport userStrategyExport);
+
+    /**
+     * 查询数据
+     *
+     * @param uId 用户ID
+     * @return 用户策略
+     */
+    @DBRouter(splitTable = true)
+    UserStrategyExport queryUserStrategyExportByUId(String uId);
+}

+ 23 - 0
lottery-infrastructure/src/main/java/com/seamew/lottery/infrastructure/dao/IUserTakeActivityDao.java

@@ -0,0 +1,23 @@
+package com.seamew.lottery.infrastructure.dao;
+
+import com.seamew.lottery.infrastructure.po.UserTakeActivity;
+import com.seamew.middleware.db.router.annotation.DBRouter;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Author: seamew
+ * @Title: IUserTakeActivityDao
+ * @CreateTime: 2023年02月22日 16:04:00
+ * @Description: 用户领取活动表DAO
+ * @Version: 1.0
+ */
+@Mapper
+public interface IUserTakeActivityDao {
+    /**
+     * 插入用户领取活动信息
+     *
+     * @param userTakeActivity 入参
+     */
+    @DBRouter
+    void insert(UserTakeActivity userTakeActivity);
+}

+ 84 - 0
lottery-infrastructure/src/main/java/com/seamew/lottery/infrastructure/po/UserStrategyExport.java

@@ -0,0 +1,84 @@
+package com.seamew.lottery.infrastructure.po;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @Author: seamew
+ * @Title: UserStrategyExport
+ * @CreateTime: 2023年02月22日 15:59:00
+ * @Description: 用户策略计算结果表
+ * @Version: 1.0
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserStrategyExport {
+    /**
+     * 自增ID
+     */
+    private Long id;
+    /**
+     * 用户ID
+     */
+    private String uId;
+    /**
+     * 活动ID
+     */
+    private Long activityId;
+    /**
+     * 订单ID
+     */
+    private Long orderId;
+    /**
+     * 策略ID
+     */
+    private Long strategyId;
+    /**
+     * 策略方式(1:单项概率、2:总体概率)
+     */
+    private Integer strategyMode;
+    /**
+     * 发放奖品方式(1:即时、2:定时[含活动结束]、3:人工)
+     */
+    private Integer grantType;
+    /**
+     * 发奖时间
+     */
+    private Date grantDate;
+    /**
+     * 发奖状态
+     */
+    private Integer grantState;
+    /**
+     * 发奖ID
+     */
+    private String awardId;
+    /**
+     * 奖品类型(1:文字描述、2:兑换码、3:优惠券、4:实物奖品)
+     */
+    private Integer awardType;
+    /**
+     * 奖品名称
+     */
+    private String awardName;
+    /**
+     * 奖品内容「文字描述、Key、码」
+     */
+    private String awardContent;
+    /**
+     * 防重ID
+     */
+    private String uuid;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+}

+ 60 - 0
lottery-infrastructure/src/main/java/com/seamew/lottery/infrastructure/po/UserTakeActivity.java

@@ -0,0 +1,60 @@
+package com.seamew.lottery.infrastructure.po;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @Author: seamew
+ * @Title: UserTakeActivity
+ * @CreateTime: 2023年02月22日 16:00:00
+ * @Description: 用户领取活动表
+ * @Version: 1.0
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserTakeActivity {
+    /**
+     * 自增ID
+     */
+    private Long id;
+    /**
+     * 用户ID
+     */
+    private String uId;
+    /**
+     * 活动领取ID
+     */
+    private Long takeId;
+    /**
+     * 活动ID
+     */
+    private Long activityId;
+    /**
+     * 活动名称
+     */
+    private String activityName;
+    /**
+     * 活动领取时间
+     */
+    private Date takeDate;
+    /**
+     * 领取次数
+     */
+    private Integer takeCount;
+    /**
+     * 防重ID
+     */
+    private String uuid;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+}

+ 28 - 8
lottery-interfaces/pom.xml

@@ -18,11 +18,36 @@
     </properties>
 
     <dependencies>
+        <!-- spring -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
 
+        <!-- mysql -->
+        <dependency>
+            <groupId>com.seamew</groupId>
+            <artifactId>db-router-spring-boot-starter</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.mybatis.spring.boot</groupId>
             <artifactId>mybatis-spring-boot-starter</artifactId>
@@ -32,6 +57,7 @@
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
 
+        <!-- dubbo -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo</artifactId>
@@ -49,6 +75,7 @@
             <artifactId>curator-recipes</artifactId>
         </dependency>
 
+        <!-- 三方工具包 -->
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
@@ -57,19 +84,13 @@
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
         </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
 
-
+        <!-- 业务包 -->
         <dependency>
             <groupId>com.seamew</groupId>
             <artifactId>lottery-infrastructure</artifactId>
@@ -123,5 +144,4 @@
             </plugin>
         </plugins>
     </build>
-
 </project>

+ 2 - 1
lottery-interfaces/src/main/java/com/seamew/lottery/LotteryApplication.java

@@ -4,6 +4,7 @@ import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.beans.factory.annotation.Configurable;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 /**
@@ -13,7 +14,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
  * @Description: LotteryApplication
  * @Version: 1.0
  */
-@SpringBootApplication
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
 @Configurable
 @EnableDubbo
 @EnableTransactionManagement

+ 21 - 6
lottery-interfaces/src/main/resources/application.yaml

@@ -1,12 +1,27 @@
 server:
   port: 8080
 
-spring:
-  datasource:
-    username: root
-    password: MKcloud123
-    url: jdbc:mysql://180.76.231.231:6033/lottery?useUnicode=true&characterEncoding=UTF-8
-    driver-class-name: com.mysql.cj.jdbc.Driver
+mini-db-router:
+  jdbc:
+    datasource:
+      dbCount: 2
+      tbCount: 4
+      master:
+        driver-class-name: com.mysql.cj.jdbc.Driver
+        url: jdbc:mysql://180.76.231.231:6033/lottery?useUnicode=true&characterEncoding=UTF-8
+        username: root
+        password: MKcloud123
+      slave:
+        db01:
+          driver-class-name: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://180.76.231.231:6033/lottery_01?useUnicode=true&characterEncoding=UTF-8
+          username: root
+          password: MKcloud123
+        db02:
+          driver-class-name: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://180.76.231.231:6033/lottery_02?useUnicode=true&characterEncoding=UTF-8
+          username: root
+          password: MKcloud123
 
 mybatis:
   mapper-locations: classpath:/mybatis/mapper/*.xml

+ 1 - 1
lottery-interfaces/src/main/resources/log4j.properties

@@ -6,7 +6,7 @@ log4j.appender.console = org.apache.log4j.ConsoleAppender
 log4j.appender.console.Target = System.out
 log4j.appender.console.Threshold=DEBUG
 log4j.appender.console.layout = org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
+log4j.appender.console.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] [%t] [%c] %m%n
 
 #日志输出级别
 log4j.logger.org.mybatis=DEBUG

+ 37 - 0
lottery-interfaces/src/main/resources/mybatis/mapper/UserStrategyExport_Mapper.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.seamew.lottery.infrastructure.dao.IUserStrategyExportDao">
+
+    <insert id="insert" parameterType="com.seamew.lottery.infrastructure.po.UserStrategyExport">
+        INSERT INTO user_strategy_export
+        (u_id, activity_id, order_id, strategy_id, strategy_mode,
+         grant_type, grant_date, grant_state, award_id, award_type,
+         award_name, award_content, uuid, create_time, update_time)
+        VALUES (#{uId}, #{activityId}, #{orderId}, #{strategyId}, #{strategyMode},
+                #{grantType}, #{grantDate}, #{grantState}, #{awardId}, #{awardType},
+                #{awardName}, #{awardContent}, #{uuid}, now(), now())
+    </insert>
+
+    <select id="queryUserStrategyExportByUId" parameterType="java.lang.String"
+            resultType="com.seamew.lottery.infrastructure.po.UserStrategyExport">
+        SELECT id,
+               u_id,
+               activity_id,
+               order_id,
+               strategy_id,
+               strategy_mode,
+               grant_type,
+               grant_date,
+               grant_state,
+               award_id,
+               award_type,
+               award_name,
+               award_content,
+               uuid,
+               create_time,
+               update_time
+        FROM user_strategy_export
+        WHERE u_id = #{uId}
+    </select>
+
+</mapper>

+ 13 - 0
lottery-interfaces/src/main/resources/mybatis/mapper/UserTakeActivity_Mapper.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.seamew.lottery.infrastructure.dao.IUserTakeActivityDao">
+
+
+    <insert id="insert" parameterType="com.seamew.lottery.infrastructure.po.UserTakeActivity">
+        INSERT INTO user_take_activity
+        (u_id, take_id, activity_id, activity_name, take_date,
+         take_count, uuid, create_time, update_time)
+        VALUES (#{uId}, #{takeId}, #{activityId}, #{activityName}, #{takeDate},
+                #{takeCount}, #{uuid}, now(), now())
+    </insert>
+</mapper>

+ 60 - 0
lottery-interfaces/src/test/java/com/seamew/lottery/test/dao/UserStrategyExportDaoTest.java

@@ -0,0 +1,60 @@
+package com.seamew.lottery.test.dao;
+
+import com.alibaba.fastjson2.JSON;
+import com.seamew.lottery.common.Constants;
+import com.seamew.lottery.domain.support.ids.IIdGenerator;
+import com.seamew.lottery.infrastructure.dao.IUserStrategyExportDao;
+import com.seamew.lottery.infrastructure.po.UserStrategyExport;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @Author: seamew
+ * @Title: UserStrategyExportDaoTest
+ * @CreateTime: 2023年02月22日 16:08:00
+ * @Description:
+ * @Version: 1.0
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@Slf4j
+public class UserStrategyExportDaoTest {
+    @Resource
+    private IUserStrategyExportDao userStrategyExportDao;
+
+    @Resource
+    private Map<Constants.Ids, IIdGenerator> idGeneratorMap;
+
+    @Test
+    public void test_insert() {
+        UserStrategyExport userStrategyExport = new UserStrategyExport();
+        userStrategyExport.setUId("Uhdgkw766120d");
+        userStrategyExport.setActivityId(idGeneratorMap.get(Constants.Ids.ShortCode).nextId());
+        userStrategyExport.setOrderId(idGeneratorMap.get(Constants.Ids.SnowFlake).nextId());
+        userStrategyExport.setStrategyId(idGeneratorMap.get(Constants.Ids.RandomNumeric).nextId());
+        userStrategyExport.setStrategyMode(Constants.StrategyMode.SINGLE.getCode());
+        userStrategyExport.setGrantType(1);
+        userStrategyExport.setGrantDate(new Date());
+        userStrategyExport.setGrantState(1);
+        userStrategyExport.setAwardId("1");
+        userStrategyExport.setAwardType(Constants.AwardType.DESC.getCode());
+        userStrategyExport.setAwardName("IMac");
+        userStrategyExport.setAwardContent("奖品描述");
+        userStrategyExport.setUuid(String.valueOf(userStrategyExport.getOrderId()));
+
+        userStrategyExportDao.insert(userStrategyExport);
+    }
+
+    @Test
+    public void test_select() {
+        UserStrategyExport userStrategyExport = userStrategyExportDao.queryUserStrategyExportByUId("Uhdgkw766120d");
+        log.info("测试结果:{}", JSON.toJSONString(userStrategyExport));
+    }
+}

+ 41 - 0
lottery-interfaces/src/test/java/com/seamew/lottery/test/dao/UserTakeActivityDaoTest.java

@@ -0,0 +1,41 @@
+package com.seamew.lottery.test.dao;
+
+import com.seamew.lottery.infrastructure.dao.IUserTakeActivityDao;
+import com.seamew.lottery.infrastructure.po.UserTakeActivity;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+/**
+ * @Author: seamew
+ * @Title: UserTakeActivityDaoTest
+ * @CreateTime: 2023年02月22日 16:07:00
+ * @Description:
+ * @Version: 1.0
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@Slf4j
+public class UserTakeActivityDaoTest {
+    @Resource
+    private IUserTakeActivityDao userTakeActivityDao;
+
+    @Test
+    public void test_insert() {
+        UserTakeActivity userTakeActivity = new UserTakeActivity();
+        userTakeActivity.setUId("Uhdgkw766120d"); // 1库:Ukdli109op89oi 2库:Ukdli109op811d
+        userTakeActivity.setTakeId(121019889410L);
+        userTakeActivity.setActivityId(100001L);
+        userTakeActivity.setActivityName("测试活动");
+        userTakeActivity.setTakeDate(new Date());
+        userTakeActivity.setTakeCount(10);
+        userTakeActivity.setUuid("Uhdgkw766120d");
+
+        userTakeActivityDao.insert(userTakeActivity);
+    }
+}

+ 7 - 4
pom.xml

@@ -37,10 +37,6 @@
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-        </dependency>
     </dependencies>
 
     <dependencyManagement>
@@ -85,6 +81,13 @@
                 <artifactId>fastjson</artifactId>
                 <version>2.0.23</version>
             </dependency>
+
+            <!-- 分库分表插件 -->
+            <dependency>
+                <groupId>com.seamew</groupId>
+                <artifactId>db-router-spring-boot-starter</artifactId>
+                <version>1.1-SNAPSHOT</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>