|
| 1 | + |
| 2 | +uid-generator-spring-boot |
| 3 | +========================== |
| 4 | + |
| 5 | +UidGenerator是Java实现的, 基于[Snowflake](https://github.com/twitter/snowflake)算法的唯一ID生成器。 |
| 6 | + |
| 7 | +基与 [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) |
| 8 | + |
| 9 | + |
| 10 | +* 更改了打包结构,抽出了Worker node id的生成接口, 使其可以自定义实现分配 Worker node id的方法, 本项目中实现了两种数据库存储的方法: |
| 11 | +* 支持 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) |
| 16 | + |
| 17 | +你以可以根据[接口包](https://github.com/cooperlyt/uid-generator-spring-boot/tree/master/uid-generator-api)自己实现Worker node分配的实现 |
| 18 | + |
| 19 | +## 原理和性能 |
| 20 | + |
| 21 | +请参见[Snowflake](https://github.com/twitter/snowflake)和[百度UidGenerator](https://github.com/baidu/uid-generator) |
| 22 | + |
| 23 | +## 使用 |
| 24 | + |
| 25 | +### Maven |
| 26 | + |
| 27 | +### spring boot autoconfig 方式 |
| 28 | +```xml |
| 29 | +<dependency> |
| 30 | + <groupId>uid-generator-spring-boot-starter</groupId> |
| 31 | + <artifactId>uid</artifactId> |
| 32 | + <version>1.0.3.RELEASE</version> |
| 33 | +</dependency> |
| 34 | + |
| 35 | +<!-- 选择一种 worker node 分配方式 --> |
| 36 | + |
| 37 | +<!-- jdbc --> |
| 38 | + |
| 39 | +<dependency> |
| 40 | + <groupId>cooperlyt.github.io</groupId> |
| 41 | + <artifactId>uid-worker-id-jdbc-spring-boot-starter</artifactId> |
| 42 | + <version>1.0.1.BATE</version> |
| 43 | +</dependency> |
| 44 | + |
| 45 | + <!-- 选择你的数据库jdbc驱动 --> |
| 46 | +<dependency> |
| 47 | + <groupId>org.mariadb.jdbc</groupId> |
| 48 | + <artifactId>mariadb-java-client</artifactId> |
| 49 | +</dependency> |
| 50 | + |
| 51 | +<!-- r2dbc --> |
| 52 | + |
| 53 | +<dependency> |
| 54 | + <groupId>io.github.cooperlyt</groupId> |
| 55 | + <artifactId>uid-worker-id-r2dbc-spring-boot-starter</artifactId> |
| 56 | + <version>1.0.1.BATE</version> |
| 57 | +</dependency> |
| 58 | + |
| 59 | + <!-- 选择你的数据库据r2dbc驱动 --> |
| 60 | +<dependency> |
| 61 | + <groupId>org.mariadb</groupId> |
| 62 | + <artifactId>r2dbc-mariadb</artifactId> |
| 63 | + <version>1.1.3</version> |
| 64 | +</dependency> |
| 65 | + |
| 66 | +``` |
| 67 | +### spring方式 请参见 [百度UidGenerator](https://github.com/baidu/uid-generator) |
| 68 | + |
| 69 | +### 数据库(可选) |
| 70 | +如使用数据库实现的Worker node id分配器,需要先建立表 WORKER_NODE, 脚本: |
| 71 | +```sql |
| 72 | +DROP TABLE IF EXISTS WORKER_NODE; |
| 73 | +CREATE TABLE WORKER_NODE |
| 74 | +( |
| 75 | +ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id', |
| 76 | +HOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name', |
| 77 | +PORT VARCHAR(64) NOT NULL COMMENT 'port', |
| 78 | +TYPE INT NOT NULL COMMENT 'node type: CONTAINER(1), ACTUAL(2), FAKE(3)', |
| 79 | +LAUNCH_DATE DATE NOT NULL COMMENT 'launch date', |
| 80 | +MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time', |
| 81 | +CREATED TIMESTAMP NOT NULL COMMENT 'created time', |
| 82 | +PRIMARY KEY(ID) |
| 83 | +) COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB; |
| 84 | +``` |
| 85 | + |
| 86 | +### spring boot 配置 |
| 87 | + |
| 88 | +#### ID 生成 配置 |
| 89 | +```yml |
| 90 | +uid: |
| 91 | + timeBits: 30 # 时间位, 默认:30 |
| 92 | + workerBits: 16 # 机器位, 默认:16 |
| 93 | + seqBits: 7 # 序列号, 默认:7 |
| 94 | + epochStr: "2019-02-20" # 初始时间, 默认:"2019-02-20" |
| 95 | + enableBackward: true # 是否容忍时钟回拨, 默认:true |
| 96 | + maxBackwardSeconds: 1 # 时钟回拨最长容忍时间(秒), 默认:1 |
| 97 | + CachedUidGenerator: # CachedUidGenerator相关参数 |
| 98 | + boostPower: 3 # RingBuffer size扩容参数, 可提高UID生成的吞吐量, 默认:3 |
| 99 | + paddingFactor: 50 # 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50 |
| 100 | + #scheduleInterval: 60 # 默认:不配置此项, 即不使用Schedule线程. 如需使用, 请指定Schedule线程时间间隔, 单位:秒 |
| 101 | +``` |
| 102 | + |
| 103 | +#### jdbc 配置 |
| 104 | + |
| 105 | +```yml |
| 106 | +mybatis: |
| 107 | + configuration: |
| 108 | + default-fetch-size: 100 |
| 109 | + default-statement-timeout: 30 |
| 110 | + map-underscore-to-camel-case: true |
| 111 | +spring: |
| 112 | + datasource: |
| 113 | + driver-class-name: org.mariadb.jdbc.Driver |
| 114 | + url: jdbc:mariadb://127.0.0.1:3306/database? |
| 115 | + username: root |
| 116 | + password: **** |
| 117 | +``` |
| 118 | +
|
| 119 | +#### r2dbc 配置 |
| 120 | +
|
| 121 | +```yml |
| 122 | + |
| 123 | +r2dbc: |
| 124 | + mybatis: |
| 125 | + mapper-locations: classpath:mapper/*.xml |
| 126 | + map-underscore-to-camel-case: true |
| 127 | +spring: |
| 128 | + r2dbc: |
| 129 | + mybatis: |
| 130 | + r2dbc-url: r2dbc:mysql://127.0.0.1:3306/database |
| 131 | + username: root |
| 132 | + password: **** |
| 133 | + pool: |
| 134 | + max-idle-time: PT3M |
| 135 | + validation-query: SELECT 1 FROM DUAL |
| 136 | + initial-size: 1 |
| 137 | + max-size: 3 |
| 138 | + acquire-retry: 3 |
| 139 | + validation-depth: REMOTE |
| 140 | + max-create-connection-time: PT30S |
| 141 | + |
| 142 | +``` |
| 143 | + |
| 144 | +#### 自定义 拒绝策略 |
| 145 | + |
| 146 | +```java |
| 147 | + @Bean |
| 148 | + RejectedPutBufferHandler customPutHandler() { |
| 149 | + return (r, i) -> { |
| 150 | + do your |
| 151 | + }; |
| 152 | + } |
| 153 | + |
| 154 | + @Bean |
| 155 | + RejectedTakeBufferHandler customTakeHandler() { |
| 156 | + return (r, i) -> { |
| 157 | + do your |
| 158 | + }; |
| 159 | + } |
| 160 | + |
| 161 | +``` |
0 commit comments