diff --git a/douyu-live-id-generate-interface/pom.xml b/douyu-live-id-generate-interface/pom.xml new file mode 100644 index 0000000..c1426fb --- /dev/null +++ b/douyu-live-id-generate-interface/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + com.douyu + douyu-live-app + 1.0-SNAPSHOT + + + douyu-live-id-generate-interface + + + 17 + 17 + UTF-8 + + + \ No newline at end of file diff --git a/douyu-live-id-generate-interface/src/main/java/com/douyu/live/id/generate/interfaces/IdBuilderRpc.java b/douyu-live-id-generate-interface/src/main/java/com/douyu/live/id/generate/interfaces/IdBuilderRpc.java new file mode 100644 index 0000000..5f9b476 --- /dev/null +++ b/douyu-live-id-generate-interface/src/main/java/com/douyu/live/id/generate/interfaces/IdBuilderRpc.java @@ -0,0 +1,23 @@ +package com.douyu.live.id.generate.interfaces; + +/** + * id 生成接口 + * @author luiguanyi + * * @date 2024/12/29 + */ +public interface IdBuilderRpc { + + /** + * 获取有序ID + * @param id + * @return + */ + Long getSeqId(Integer id); + + /** + * 获取无序ID + * @param id + * @return + */ + Long getUnSeqId(Integer id); +} diff --git a/douyu-live-id-generate-provider/pom.xml b/douyu-live-id-generate-provider/pom.xml new file mode 100644 index 0000000..e7d785f --- /dev/null +++ b/douyu-live-id-generate-provider/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + com.douyu + douyu-live-app + 1.0-SNAPSHOT + + + douyu-live-id-generate-provider + + + 3.5.3 + 3.2.0-beta.3 + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + org.apache.dubbo + dubbo-spring-boot-starter + ${dubbo.version} + + + org.springframework.boot + spring-boot-starter-web + + + log4j-to-slf4j + org.apache.logging.log4j + + + + + mysql + mysql-connector-java + ${qiyu-mysql.version} + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.douyu + douyu-live-id-generate-interface + 1.0-SNAPSHOT + compile + + + + \ No newline at end of file diff --git a/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/dao/mapper/IdBuilderMapper.java b/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/dao/mapper/IdBuilderMapper.java new file mode 100644 index 0000000..7332726 --- /dev/null +++ b/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/dao/mapper/IdBuilderMapper.java @@ -0,0 +1,33 @@ +package com.douyu.live.id.generate.provider.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.douyu.live.id.generate.provider.dao.po.IdBuilderPO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +/** + * id 生成器配置表持久层 + * @author luiguanyi + * * @date 2024/12/31 + */ +@Mapper +public interface IdBuilderMapper extends BaseMapper { + + /** + * 更新当前阈值 开始 以及版本 + */ + @Update("UPDATE t_id_builder_config set next_threshold=#{nextThreshold},current_start=#{currentStart},vers ion=version+1 " + + "where id=#{id} and version=#{version}") + Integer updateCurrentThreshold(@Param("nextThreshold") long nextThreshold, @Param("currentStart") long currentStart, + @Param("id") int id, @Param("version") int version); + + /** + * 查询所有配置 + */ + @Select("select * from t_id_builder_config") + List selectAll(); +} diff --git a/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/dao/po/IdBuilderPO.java b/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/dao/po/IdBuilderPO.java new file mode 100644 index 0000000..f62fc92 --- /dev/null +++ b/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/dao/po/IdBuilderPO.java @@ -0,0 +1,59 @@ +package com.douyu.live.id.generate.provider.dao.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import java.util.Date; + +/** + * id生成器配置表 + * @author luiguanyi + * * @date 2024/12/31 + */ +@TableName("t_id_builder_config") +@Data +public class IdBuilderPO { + @TableId(type = IdType.AUTO) + private Integer id; + /** + * id 备注描述 + */ + private String remark; + /** + * 初始化值 + */ + private long initNum; + /** + * 步长 + */ + private int step; + /** + * 是否是有序的id + */ + private int isSeq; + /** + * 当前id 所在阶段的开始值 + */ + private long currentStart; + /** + * 当前id 所在阶段的阈值 + */ + private long nextThreshold; + /** + * 业务代码前缀 + */ + private String idPrefix; + /** + * 乐观锁版本号 + */ + private int version; + /** + * 创建时间 + */ + private Date createTime; + /** + * 更新时间 + */ + private Date updateTime; +} diff --git a/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/rpc/IdBuilderRpcImpl.java b/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/rpc/IdBuilderRpcImpl.java new file mode 100644 index 0000000..bea005d --- /dev/null +++ b/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/rpc/IdBuilderRpcImpl.java @@ -0,0 +1,22 @@ +package com.douyu.live.id.generate.provider.rpc; + +import com.douyu.live.id.generate.interfaces.IdBuilderRpc; +import org.apache.dubbo.config.annotation.DubboService; + +/** + * id 生成 rpc 实现 + * @author luiguanyi + * * @date 2024/12/29 + */ +@DubboService +public class IdBuilderRpcImpl implements IdBuilderRpc { + @Override + public Long getSeqId(Integer id) { + return null; + } + + @Override + public Long getUnSeqId(Integer id) { + return null; + } +} diff --git a/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/service/IdGenerateService.java b/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/service/IdGenerateService.java new file mode 100644 index 0000000..74a6087 --- /dev/null +++ b/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/service/IdGenerateService.java @@ -0,0 +1,23 @@ +package com.douyu.live.id.generate.provider.service; + +/** + * id生成服务 + * @author luiguanyi + * * @date 2024/12/29 + */ +public interface IdGenerateService { + /** + * 生成有序id + * + * @param code + * @return + */ + Long getSeqId(Integer code); + /** + * 生成无序id + * + * @param code + * @return + */ + Long getUnSeqId(Integer code); +} diff --git a/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/service/bo/LocalSeqIdBO.java b/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/service/bo/LocalSeqIdBO.java new file mode 100644 index 0000000..e5c5ff9 --- /dev/null +++ b/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/service/bo/LocalSeqIdBO.java @@ -0,0 +1,25 @@ +package com.douyu.live.id.generate.provider.service.bo; + +import lombok.Data; + +import java.util.concurrent.atomic.AtomicLong; + +/** + * 本地id生成的一个具体策略 + * @author luiguanyi + * * @date 2024/12/29 + */ +@Data +public class LocalSeqIdBO { + + /** + * 业务ID + */ + private int id; + + + /** + * 在内存中记录的当前的值 + */ + private AtomicLong currentNum; +} diff --git a/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/service/impl/IdGenerateServiceImpl.java b/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/service/impl/IdGenerateServiceImpl.java new file mode 100644 index 0000000..ff19c65 --- /dev/null +++ b/douyu-live-id-generate-provider/src/main/java/com/douyu/live/id/generate/provider/service/impl/IdGenerateServiceImpl.java @@ -0,0 +1,70 @@ +package com.douyu.live.id.generate.provider.service.impl; + +import com.douyu.live.id.generate.provider.dao.mapper.IdBuilderMapper; +import com.douyu.live.id.generate.provider.dao.po.IdBuilderPO; +import com.douyu.live.id.generate.provider.service.IdGenerateService; +import com.douyu.live.id.generate.provider.service.bo.LocalSeqIdBO; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; + +/** + * id生成服务实现 + * @author luiguanyi + * * @date 2024/12/29 + */ +@Service +@Slf4j +public class IdGenerateServiceImpl implements IdGenerateService { + + @Resource + private IdBuilderMapper idBuilderMapper; + + private static final Map localSeqIdMap = new ConcurrentHashMap<>(); + + + + @Override + public Long getSeqId(Integer id) { + if(id == null){ + log.error("[getSeqId] id is error"); + return null; + } + LocalSeqIdBO localSeqIdBO = localSeqIdMap.get(id); + if(localSeqIdBO == null){ + log.error("[getSeqId] localSeqIdBo is null ,id is {}",id); + return null; + } + return localSeqIdBO.getCurrentNum().getAndIncrement(); + } + + @Override + public Long getUnSeqId(Integer code) { + return null; + } + + /** + * 初始化我们的localSeqIdMap + */ + @PostConstruct + public void init(){ + List idBuilderPOS = idBuilderMapper.selectAll(); + idBuilderPOS.forEach(idBuilderPO -> { + // 进行更新数据库中当前id 的配置 就是修改表中当前的id段 往后面挪一个步长 + Integer updateResult = idBuilderMapper.updateCurrentThreshold(idBuilderPO.getNextThreshold(), idBuilderPO.getNextThreshold() + idBuilderPO.getStep(), idBuilderPO.getId(), idBuilderPO.getVersion()); + if (updateResult == 0){ + IdBuilderPO newIdBuilderPO = idBuilderMapper.selectById(idBuilderPO.getId()); + } + LocalSeqIdBO localSeqIdBO = new LocalSeqIdBO(); + localSeqIdBO.setId(idBuilderPO.getId()); + localSeqIdBO.setCurrentNum(new AtomicLong(idBuilderPO.getCurrentStart())); + localSeqIdMap.put(idBuilderPO.getId(),localSeqIdBO); + }); + } +} diff --git a/douyu-live-id-generate-provider/src/main/resources/application.yaml b/douyu-live-id-generate-provider/src/main/resources/application.yaml new file mode 100644 index 0000000..993eea0 --- /dev/null +++ b/douyu-live-id-generate-provider/src/main/resources/application.yaml @@ -0,0 +1,18 @@ +spring: + application: + name: douyu-live-id-generate-provider + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + #访问主库 + url: jdbc:mysql://127.0.0.1:3306/douyu_live_common?useUnicode=true&characterEncoding=utf8 + username: root + password: root + +dubbo: + application: + name: ${spring.application.name} + registry: + address: nacos://127.0.0.1:8848?namespace=douyu-live-test&&username=nacos&&password=nacos + protocol: + name: dubbo + port: 9098 \ No newline at end of file diff --git a/douyu-live-id-generate-provider/src/main/resources/bootstrap.yml b/douyu-live-id-generate-provider/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..dfbd13e --- /dev/null +++ b/douyu-live-id-generate-provider/src/main/resources/bootstrap.yml @@ -0,0 +1,8 @@ +spring: + cloud: + nacos: + username: nacos + password: nacos + discovery: + server-addr: 127.0.0.1:8848 + namespace: douyu-live-test \ No newline at end of file diff --git a/pom.xml b/pom.xml index f2f9e1c..23953d7 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,8 @@ douyu-live-api douyu-live-common-interface douyu-live-framework + douyu-live-id-generate-interface + douyu-live-id-generate-provider