微服务时代,我们需要生产一个连续的友好的序列号,例如订单号等。变得比较麻烦。
这里我提供了两种业界常用的解决方案来实现这个分布式序列号生成组件。
(1)使用集中式存储功能取步长进行分配。目前支持数据库(Mysql)、Redis
(2)使用雪花算法获取连续序列号,保证多服务器集群不重复
组件存在的目的就是屏蔽序列号底层实现,支持多样化的算法。让用户开箱即用。方便开发。
<dependency>
<groupId>com.xuanner</groupId>
<artifactId>xsequence-core</artifactId>
<version>1.6</version>
</dependency>
#### 升级日志
v1.0
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();
(4)UUID工具类使用
UUIDUtils.uuid()
#### 联系方式
1. 姓名:徐安
2. 邮箱:javaandswing@163.com
3. QQ:349309307
4. 个人博客:xuanner.com
5. QQ交流群:813221731