22uid-generator-spring-boot
33==========================
44
5- UidGenerator是Java实现的, 基于[ Snowflake] ( https://github.com/twitter/snowflake ) 算法的唯一ID生成器 。
5+ UidGenerator是Java实现的, 基于[ Snowflake] ( https://github.com/twitter/snowflake ) 算法的分布式唯一ID生成器 。
66
77基与 [ Snowflake] ( https://github.com/twitter/snowflake ) ,[ 百度UidGenerator] ( https://github.com/baidu/uid-generator ) ,[ uid-generator-spring-boot-starter] ( https://github.com/wujun234/uid-generator-spring-boot-starter )
88
99
1010* 更改了打包结构,抽出了Worker node id的生成接口, 使其可以自定义实现分配 Worker node id的方法, 本项目中实现了两种数据库存储的方法:
1111* 支持 Spring boot Autoconfigure
12- * 支持 jdbc 和 r2dbc 两种数据库连接方式
13-
14- * mybatis jdbc 实现 [ uid-worker-id-jdbc-spring-boot-starter ] ( https://github.com/cooperlyt/uid-generator-spring-boot/tree/master/uid-worker-id-jdbc-spring-boot-starter )
15- * mybatis r2dbc 实现 [ uid-worker-id- r2dbc-spring-boot-start ] ( https://github.com/cooperlyt/uid-generator-spring-boot/tree/master/uid-worker-id-r2dbc-spring-boot-starter )
12+ * 支持响应式编程,返回 ` Mono<Long> ` ,
13+ * 在CachedUidGenerator:消耗速度高于填充速度时,等待填充完成后以非阻塞的方式通知订阅者。
14+ * 在DefaultUidGenerator不允许使用未来时间(未到达的时间)状态:当前时间ID耗尽等待下一秒后非阻塞的方式通知订阅者
15+ * 支持 mybatis jdbc, mybatis r2bc , jap jdbc ,jap r2dbc 四种数据库连接方式
1616
1717你以可以根据[ 接口包] ( https://github.com/cooperlyt/uid-generator-spring-boot/tree/master/uid-generator-api ) 自己实现Worker node分配的实现
1818
@@ -26,45 +26,56 @@ UidGenerator是Java实现的, 基于[Snowflake](https://github.com/twitter/snowf
2626
2727#### spring boot autoconfig 方式
2828``` xml
29- <dependency >
30- <groupId >uid-generator-spring-boot-starter</groupId >
31- <artifactId >uid</artifactId >
32- <version >1.0.3.RELEASE</version >
33- </dependency >
3429
35- <!-- 选择一种 worker node 分配方式 -->
30+ <!-- 根据你的项目环境 选择一种 worker node 分配方式 -->
3631
37- <!-- jdbc -->
32+ <!-- 以下仅选一种即可,多了会冲突 -->
3833
34+ <!-- mybatis jdbc -->
3935<dependency >
4036 <groupId >cooperlyt.github.io</groupId >
41- <artifactId >uid-worker-id -jdbc-spring-boot-starter</artifactId >
42- <version >1.0.1.BATE </version >
37+ <artifactId >uid-generator-mybatis -jdbc-spring-boot-starter</artifactId >
38+ <version >${uid.version} </version >
4339</dependency >
4440
45- <!-- 选择你的数据库jdbc驱动 -->
41+ <!-- mybatis r2dbc -->
4642<dependency >
47- <groupId >org.mariadb.jdbc</groupId >
48- <artifactId >mariadb-java-client</artifactId >
43+ <groupId >cooperlyt.github.io</groupId >
44+ <artifactId >uid-generator-mybatis-r2dbc-spring-boot-starter</artifactId >
45+ <version >${uid.version}</version >
4946</dependency >
5047
51- <!-- r2dbc -->
5248
49+ <!-- jpa jdbc -->
50+ <dependency >
51+ <groupId >cooperlyt.github.io</groupId >
52+ <artifactId >uid-generator-jap-jdbc-spring-boot-starter</artifactId >
53+ <version >${uid.version}</version >
54+ </dependency >
55+
56+ <!-- jpa r2dbc -->
5357<dependency >
54- <groupId >io .github.cooperlyt </groupId >
55- <artifactId >uid-worker-id -r2dbc-spring-boot-starter</artifactId >
56- <version >1.0.1.BATE </version >
58+ <groupId >cooperlyt .github.io </groupId >
59+ <artifactId >uid-generator-jpa -r2dbc-spring-boot-starter</artifactId >
60+ <version >${uid.version} </version >
5761</dependency >
5862
59- <!-- 选择你的数据库据r2dbc驱动 -->
63+ <!-- 选择相印的数据库驱动包 -->
64+ <!-- jdbc驱动 -->
65+ <dependency >
66+ <groupId >org.mariadb.jdbc</groupId >
67+ <artifactId >mariadb-java-client</artifactId >
68+ </dependency >
69+
70+ <!-- r2dbc驱动 -->
6071<dependency >
6172 <groupId >org.mariadb</groupId >
6273 <artifactId >r2dbc-mariadb</artifactId >
6374 <version >1.1.3</version >
6475</dependency >
6576
6677```
67-
78+ 由于开发时Mybatis官方还不支持r2dbc所以使用了 [ reactive-mybatis-support ] ( https://github.com/chenggangpro/reactive-mybatis-support )
6879
6980
7081### 数据库(可选)
@@ -86,22 +97,7 @@ PRIMARY KEY(ID)
8697
8798### spring boot 配置
8899
89- #### ID 生成 配置
90- ``` yml
91- uid :
92- timeBits : 30 # 时间位, 默认:30
93- workerBits : 16 # 机器位, 默认:16
94- seqBits : 7 # 序列号, 默认:7
95- epochStr : " 2019-02-20" # 初始时间, 默认:"2019-02-20"
96- enableBackward : true # 是否容忍时钟回拨, 默认:true
97- maxBackwardSeconds : 1 # 时钟回拨最长容忍时间(秒), 默认:1
98- CachedUidGenerator : # CachedUidGenerator相关参数
99- boostPower : 3 # RingBuffer size扩容参数, 可提高UID生成的吞吐量, 默认:3
100- paddingFactor : 50 # 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50
101- # scheduleInterval: 60 # 默认:不配置此项, 即不使用Schedule线程. 如需使用, 请指定Schedule线程时间间隔, 单位:秒
102- ```
103-
104- #### jdbc 配置
100+ #### jdbc 配置 (以mariadb为例)
105101
106102``` yml
107103mybatis :
@@ -128,7 +124,7 @@ r2dbc:
128124spring :
129125 r2dbc :
130126 mybatis :
131- r2dbc-url : r2dbc:mysql ://127.0.0.1:3306/database
127+ r2dbc-url : r2dbc:mariadb ://127.0.0.1:3306/database
132128 username : root
133129 password : ****
134130 pool :
@@ -142,30 +138,47 @@ spring:
142138
143139```
144140
145- #### 自定义 拒绝策略
141+ #### 自定义 CachedUidGenerator 拒绝策略
146142
147143``` java
144+ // 生成一批ID后由于buffer环已满无法填充时的处理方式, 默认为丢弃并打印日志
148145 @Bean
149146 RejectedPutBufferHandler customPutHandler() {
150- return (r, i ) - > {
147+ return (buffer, id ) - > {
151148 do your
152149 };
153150 }
154151
152+ // 由于消耗过快使用到了未来时间(未到达的时间), 默认为允许并打印日志
155153 @Bean
156- RejectedTakeBufferHandler customTakeHandler () {
157- return (r, i ) - > {
154+ TimeIsFutureHandler customFutureTimeHandler () {
155+ return (futureTime, currentTime ) - > {
158156 do your
159157 };
160158 }
161159
162160```
163161
162+ #### ID 生成配置, 如应用在生产环境请确认以下参数,并确保你已经理解每个参数的意义。
163+ ``` yml
164+ uid :
165+ timeBits : 30 # 时间位, 默认:30
166+ workerBits : 16 # 机器位, 默认:16
167+ seqBits : 7 # 序列号, 默认:7
168+ epochStr : " 2023-02-17" # 初始时间, 默认:"2019-02-20"
169+ enableFutureTime : false # 允许使用未来时间生成ID,可以使用多少未来时间由 maxBackwardSeconds 控制, 默认: false
170+ maxBackwardSeconds : 1 # 系统时钟回拨和使用未来时间最长容忍时间(秒), 默认:1
171+ CachedUidGenerator : # CachedUidGenerator相关参数
172+ boostPower : 3 # RingBuffer size扩容参数, 可提高UID生成的吞吐量, 默认:3
173+ paddingFactor : 50 # 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50
174+ # scheduleInterval: 60 # 默认:不配置此项, 即不使用Schedule线程定时填充buffer环. 如需使用, 请指定Schedule线程时间间隔, 单位:秒
175+ ```
176+
164177### 使用
165178
179+ ####
166180
167181``` java
168-
169182// 实时生成
170183// @Resource
171184// private UidGenerator defaultUidGenerator;
@@ -174,15 +187,33 @@ spring:
174187@Resource
175188private UidGenerator cachedUidGenerator;
176189
190+
191+
177192@Test
178193public void testSerialGenerate() {
179194 // Generate UID
180- long uid = cachedUidGenerator. getUID();
195+ Mono< Long > uid = cachedUidGenerator. getUID();
181196
182197 // Parse UID into [Timestamp, WorkerId, Sequence]
183198 // {"UID":"450795408770","timestamp":"2019-02-20 14:55:39","workerId":"27","sequence":"2"}
184199 System . out. println(cachedUidGenerator. parseUID(uid));
185200
186201}
187202```
188- ** defaultUidGenerator** 和 ** cachedUidGenerator** 的区别和选择方式请参见 [ 百度UidGenerator] ( https://github.com/baidu/uid-generator )
203+
204+ #### 策略选择
205+
206+
207+ * CachedUidGenerator:
208+
209+ 适合** 持续高消耗量** 的ID分发,此方式会一定程度上的增加内存和CPU缓存占用。
210+
211+ * enableFutureTime 为true时的 DefaultUidGenerator:
212+
213+ 适合** 偶然突发的消费增加后持续保持低消耗量** 的ID分发,此方式在突发高消费时的性能要比CachedUidGenerator还要高,但不应该持续保持高消耗(可消耗的未来时间由maxBackwardSeconds控制,超出后抛出异常),因为过度使用未来时间有可能会造成服务重启后生成重复ID。
214+
215+ * enableFutureTime 为false时的 DefaultUidGenerator:
216+
217+ 适合** 低消耗量实时** 的ID分发,此方式一但消耗量高于当前时间的发号量时会返回一个等待响应,等待下一可用时间后发出ID,最大等待时间由maxBackwardSeconds控制,超出后抛出异常。
218+
219+ 对于发号性能的测式可使用此 [ 测试用例] ( https://github.com/cooperlyt/uid-generator-spring-boot/tree/master/uid-generator-spring-boot-starter/src/test/java/io/github/cooperlyt/cloud/uid ) 进行测试,并参见[ 百度UidGenerator] ( https://github.com/baidu/uid-generator )
0 commit comments