当前位置: 首页>后端>正文

springboot 生成6位流水号 spring生成uuid

原框架springboot,为解决使用java的UUId在高并发下出现id重复的问题

源码Git地址

Git地址:https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md


参考demo地址:https://gitee.com/zhangbw666/uid-generator-boot 感谢大佬的分享~

介绍

UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 从而适用于docker等虚拟化环境下实例自动重启、漂移等场景。 在实现上, UidGenerator通过借用未来时间来解决sequence天然存在的并发限制; 采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费, 同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题. 最终单机QPS可达600万。

依赖版本:Java8及以上版本, MySQL(内置WorkerID分配器, 启动阶段通过DB进行分配; 如自定义实现, 则DB非必选依赖)

整合过程重点

我的项目模块目录如下:

springboot 生成6位流水号 spring生成uuid,springboot 生成6位流水号 spring生成uuid_springboot 生成6位流水号,第1张

1、修改配置

修改数据库连接;uid模块中pom.xml文件中的父级模块、dp-modules中加入uid模块;执行SQL文件生成WORKER_NODE表

2、question模块修改

1)spring方式配置的mybatis-spring.xml文件:包扫描、数据源等

2)加入config配置【解决了UidGenService 文件中无法注入UidGenerator 文件的文件】

在question的模块加载cached-uid-spring.xml文件,才能注入UidGenerator

在question模块下的config部分:

@Configuration
@ImportResource(locations = { "classpath:uid/cached-uid-spring.xml" })
public class UidConfig {
}

前提:先在question的resource文件夹下放置cached-uid-spring.xml文件

controller:

@Autowired
private UidGenService uidGenService;

@GetMapping("/uidGenerator")
public String UidGenerator() {
    return String.valueOf(uidGenService.getUid());
}

service:

@Service
public class UidGenService {

    @Resource(name = "cachedUidGenerator")
    private UidGenerator uidGenerator;

    public long getUid() {
        return uidGenerator.getUID();
    }

}

UidGenerator 文件被DefaultUidGenerator 文件实现,CachedUidGenerator 文件又继承了DefaultUidGenerator 文件,在高并发情况下,建议使用CachedUidGenerator

2)在启动类上加入对uid模块的mapper扫描

@MapperScan({……,"com.baidu.fsg.uid"})
@SpringBootApplication
@ServletComponentScan
@EnableScheduling
public class QuestionApplication {
    public static void main(String[] args) {
        SpringApplication.run(QuestionApplication.class, args);
    }
}

application-dev.xml

mybatis:
#配置mybatis扫描的文件路径
mapper-locations: classpath:mapper/**/*Mapper.xml
#配置mybatis结果映射的包
type-aliases-package: …… com.baidu.fsg.uid
#mybatis返回值是HasMap如果值是空不过滤key
configuration.call-setters-on-nulls: true

3、uid模块修改

DisposableWorkerIdAssigner类无法注入WorkerNodeMapper

解决方式:

在question模块下加入WorkerNodeMapper.xml 【复制uid模块下的此文件】,于是WorkerNodeMapper 文件有2个对应的xml文件,一个在uid模块一个在question模块【不理解……】

过程中遇到的主要问题

1、question模块中:UidGenService 文件中无法注入UidGenerator 文件的文件

因为没有将cached-uid-spring.xml配置bean的文件加载到配置

2、uid模块中:DisposableWorkerIdAssigner类无法注入WorkerNodeMapper

要在question模块也加入WorkerNodeMapper.xml



https://www.xamrdz.com/backend/3gh1944610.html

相关文章: