项目介绍
微服务时代,我们需要生产一个连续的友好的序列号,例如订单号等。变得比较麻烦。
这里我提供了两种业界常用的解决方案来实现这个分布式序列号生成组件。
使用集中式存储功能取步长进行分配。目前支持数据库(Mysql)、Redis
使用雪花算法获取连续序列号,保证多服务器集群不重复
组件存在的目的就是屏蔽序列号底层实现,支持多样化的算法。让用户开箱即用。方便开发。
Maven支持
<dependency> <groupId>com.xuanner</groupId> <artifactId>xsequence-core</artifactId> <version>1.4</version> </dependency>
升级说明
v1.4
感谢一些网友给我留言,jar无法下载的问题,后来发现是我上传的有问题。目前1.4可以正常下载使用了。而且如果想自己修改一些源码编译,现在也可以下载源码install到本地仓库了。
再次感谢:
@郑勇
还有给我提Issues的@穹奇
简单使用
(1)使用DB获取区间方式
public class DbTest_Api extends BaseTest { private Sequence sequence; @Before public void setup() { //数据源 DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl("xxx"); dataSource.setUsername("xxx"); dataSource.setPassword("xxx"); dataSource.setMaxActive(300); dataSource.setMinIdle(50); dataSource.setInitialSize(2); dataSource.setMaxWait(500); /** * 参数说明如下: * dataSource:数据库的数据源 * bizName:具体某中业务的序列号 * step:[可选] 默认1000,即每次取redis获取步长值,根据具体业务吞吐量来设置,越大性能越好,但是序列号断层的风险也就越大 */ sequence = DbSeqBuilder.create().dataSource(dataSource).bizName("userId").build(); } @Test public void test() { long start = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { System.out.println("++++++++++id:" + sequence.nextValue()); } System.out.println("interval time:" + (System.currentTimeMillis() - start)); } }
(2)使用Redis获取区间方式
/** * 参数说明如下: * ip:redis连接ip * port:redis连接port * auth:如果redis设置了密码权限需要设置,没有就可以不用设置 * bizName:具体某中业务的序列号 * step:[可选] 默认1000,即每次取redis获取步长值,根据具体业务吞吐量来设置,越大性能越好,但是序列号断层的风险也就越大 */ sequence = RedisSeqBuilder.create().ip("xxx").port(6379).auth("xxx").step(1000).bizName( "userId").build();
(3)使用雪花算法方式
/** * 参数说明如下: * datacenterId: 一般可以设置机房标志,值只能设置[0-31]之间 * workerId: 一般设置主机编号,值只能设置[0-31]之间 * 只用这来那个值保证服务器唯一就可以 */ sequence = SnowflakeSeqBuilder.create().datacenterId(1).workerId(2).build();
GIT主页地址