# saas-sequence
**Repository Path**: phial3/saas-sequence
## Basic Information
- **Project Name**: saas-sequence
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-07-16
- **Last Updated**: 2024-07-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Generate Id And Sequence Easier!!!
> 注:另一个分布式 ID 生成器:[CosId](https://cosid.ahoo.me/)
# EasySequence 序列生成器
-----
## 分布式ID
----
代码入口
```java
package com.openquartz.sequence.core.uid;
/**
* @author svnee
**/
public interface UidProvider {
/**
* nextId
*
* @return id
*/
long nextId();
/**
* nextId
*
* @param key biz-key
* @return key
*/
long nextId(String key);
/**
* 反解析uid
*
* @param uid uid
* @return 解析结果
*/
default String parseUid(long uid) {
return String.valueOf(uid);
}
/**
* 反解析uid
*
* @param key key
* @param uid uid
* @return 解析结果
*/
default String parseUid(String key, long uid) {
return String.valueOf(uid);
}
}
```
类关系图

### 雪花ID
雪花算法分布式ID生成。入口:`com.openquartz.sequence.core.uid.snowflake.SnowflakeIdProvider.nextId()`
如果开启了雪花算法,可以直接从工厂中取出。
开启雪花算法`easysequence.uid.snowflake.enabled=true`
```properties
easysequence.uid.snowflake.enabled=true
easysequence.uid.snowflake.type=cache
easysequence.uid.snowflake.worker-id.min=0
easysequence.uid.snowflake.worker-id.max=32
easysequence.uid.snowflake.worker-id.default-val=0
easysequence.uid.snowflake.default-group=default
```
雪花算法目前支持两种算法实现。
1、**标准版本**;
2、**Cache模式** 采用百度的 [UidGenerator](https://github.com/baidu/uid-generator) 实现
> 相较于标准版本的实现CacheUidGenerator 性能更高。 具体的选择可以自己根据实际场景进行切换选择。用户可以实现一键配置`easysequence.uid.snowflake.type`自定义切换。
>
> `default`: 表示标准版本;`cache`: 表示百度的CacheUidGenerator实现。
- 1、**标准模式** 使用`dataCenterId+workerId` 模式构成。所以最大`workerId`范围在[0,32)。用户也可在这个范围内进行缩小
- 2、**Cache模式** 的`workerId` 使用 workerId模式构成。`workerId`最大范围在[0,1024)
目前雪花算法的`workerId` 支持三种分配方式:**随机分配**、**Zookeeper分配**、**DB分配**。
#### WorkerId-机器ID
##### 随机分配
设置配置:`easysequence.uid.snowflake.worker-assigner-type=random`
不支持不重复
##### Zookeeper分配
需要设置配置 `easysequence.uid.snowflake.worker-assigner-type=zookeeper` 同时 需要依赖`Zookeeper`组件.需要引入相关依赖
```properties
easysequence.uid.snowflake.zookeeper.url=
easysequence.uid.snowflake.zookeeper.worker-heartbeat-interval=3000
easysequence.uid.snowflake.zookeeper.worker-pid-port=-1
easysequence.uid.snowflake.zookeeper.worker-pid-home=/data/pids/
```
##### DB 分配(推荐)
支持使用Jdbc等的关系型数据库。
DB分配实现基于LOOP模式的下的分配。以当前机器IP下优先准则,其次依次LOOP进行分配workerId
需要设置`easysequence.uid.snowflake.worker-assigner-type=db`
配置
```properties
easysequence.uid.snowflake.db.worker-expire-interval=5000
easysequence.uid.snowflake.db.worker-heartbeat-interval=50000
```
同时执行SQL:
```sql
CREATE TABLE `es_snowflake_worker_node`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`group` varchar(50) NOT NULL DEFAULT '' COMMENT 'group',
`worker_id` int(5) NOT NULL DEFAULT 0 COMMENT 'workerId',
`uid` varchar(50) NOT NULL DEFAULT '' COMMENT '本次启动唯一id',
`process_id` varchar(50) NOT NULL DEFAULT '' COMMENT '进程ID',
`ip` varchar(50) NOT NULL DEFAULT '' COMMENT 'ip address',
`last_expire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下次失效时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_group_worker` (`group`,`worker_id`),
UNIQUE KEY `uniq_group_ip` (`group`,`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='雪花算法WorkNode';
```
### LeafID
基于`Meituan`的 [`LeafId`](https://github.com/Meituan-Dianping/Leaf) 的实现。可是自动装配。更好的集成到项目中。默认不开启。 如需开启可以启用配置
```properties
easysequence.uid.leaf.enabled=true
easysequence.uid.leaf.default-key=leaf-segment-test
```
并且设置默认的key.
需要执行SQL
```sql
CREATE TABLE `es_leaf_alloc`
(
`biz_tag` varchar(128) NOT NULL DEFAULT '',
`max_id` bigint(20) NOT NULL DEFAULT 1,
`step` int(11) NOT NULL,
`description` varchar(256) DEFAULT NULL,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`biz_tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='LeafId分配';
```
并且配置默认的分组key.
使用LeafId入口方法为`com.openquartz.sequence.core.uid.leaf.LeafIdGenerator`
## 自定义序列号
----
### 环境配置
#### 1、执行SQL脚本
```sql
CREATE TABLE es_sequence_assign_register
(
id INT (11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
register_code VARCHAR(50) NOT NULL DEFAULT '' COMMENT '注册码',
register_desc VARCHAR(50) NOT NULL DEFAULT '' COMMENT '描述',
`cycle` INT (11) NOT NULL DEFAULT -1 COMMENT '周期',
cycle_unit VARCHAR(50) NOT NULL DEFAULT '' COMMENT '周期单位',
init_value BIGINT (20) NOT NULL DEFAULT -1 COMMENT '初始值',
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '序列号注册器';
CREATE TABLE es_sequence_next_assign
(
id BIGINT (20) NOT NULL AUTO_INCREMENT COMMENT 'id',
unique_key VARCHAR(50) NOT NULL DEFAULT '' COMMENT '唯一key',
next_value BIGINT (15) NOT NULL DEFAULT -1 COMMENT '下一次值',
last_assign_time DATETIME NOT NULL COMMENT '下一次生成时间',
`cycle` INT (10) NOT NULL DEFAULT -1 COMMENT '循环',
cycle_unit VARCHAR(50) NOT NULL DEFAULT '' COMMENT '循环单位',
init_value BIGINT (20) NOT NULL DEFAULT -1 COMMENT '初始值',
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '序列下一次生成';
CREATE TABLE es_sequence_template
(
id BIGINT (20) NOT NULL AUTO_INCREMENT COMMENT 'id',
register_code VARCHAR(50) NOT NULL DEFAULT '' COMMENT '唯一key',
`expression` varchar(512) NOT NULL DEFAULT '' COMMENT '表达式',
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '序列号生成模板';
```
#### 2、配置数据源链接
```yaml
easysequence:
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/easysequence?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
username: root
password: 123456
```
### 使用
#### 1、配置表达式
表达式支持串接、嵌套。 多个表达式使用`{ }`进行分隔
##### 表达式分类
###### 常量
语法:`{const 固定常量前缀}`
###### 时间
语法:`{time 时间格式}`
时间格式目前支持:`yyyyMMddHHmmss`
###### 序列
语法:`{seq 序列号标识}`
需要配置到:`es_sequence_assign_register`中
###### 长度补齐
语法:`{fix 字符串 补齐长度 填充字符}`
###### 自定义环境参数传递
语法:`{env 环境标识}`
例如:`{const DEMO}{fix {env w} 4}{time yyyyMMdd}{fix {seq DEMO_GENERATOR {env w}} 5}`
###### 随机字母字符串
语法:`{rand_c 长度 随机范围类型}`
随机范围类型可选值为:`type1`,`type2`,`type3`,`type4`
**`type1`**: `'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z'`
`
**`type2`**: `'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z'`
**`type3`**: ` 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z'`
**`type4`**: ` '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'`
###### 随机数字字符串
语法:`{rand_n 长度}`
#### 2、使用表达式
使用序列号生成代码入口:`com.openquartz.sequence.core.expr.SequenceGenerateService`
#### 3、启用序列池
由于性能考虑不会每次都从DB中加载,做了池化缓存一定的序列。可以配置启用或关闭。 针对不同的序列的注册码的缓存的数量可以自定义配置。也可以直接配置对应的默认配置
针对不用的序列号可以设置不同的 `池化缓存数`(pre-count) 与 加载的`低水位数`(water-level-threshold)。\
配置格式为:\
`easysequence.sequence.pool.custom-property.{seq-code}.pre-count`、\
`easysequence.sequence.pool.custom-property.{seq-code}.water-level-threshold`
```properties
###sequence-pool
easysequence.sequence.pool.enable=true
easysequence.sequence.pool.wait-fetch-timeout=5000
easysequence.sequence.pool.default-property.pre-count=50
easysequence.sequence.pool.default-property.water-level-threshold=5
easysequence.sequence.pool.custom-property.TEST1.pre-count=50
easysequence.sequence.pool.custom-property.TEST1.water-level-threshold=5
```