{"id":16998479,"url":"https://github.com/cooperlyt/uid-reactive-generator-spring","last_synced_at":"2026-04-30T02:37:28.786Z","repository":{"id":65936023,"uuid":"600324228","full_name":"cooperlyt/uid-reactive-generator-spring","owner":"cooperlyt","description":"Distributed unique ID generator","archived":false,"fork":false,"pushed_at":"2023-09-24T14:40:43.000Z","size":271,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-22T07:26:50.805Z","etag":null,"topics":["autoconfig","id","r2dbc","reactive","snowflake","springbootstarter","uid","uidgenerator","uuid"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cooperlyt.png","metadata":{"files":{"readme":"README.cn.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-02-11T06:01:27.000Z","updated_at":"2024-03-28T05:58:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"e25a909b-e5f8-4525-9fc5-c4327088921e","html_url":"https://github.com/cooperlyt/uid-reactive-generator-spring","commit_stats":{"total_commits":39,"total_committers":1,"mean_commits":39.0,"dds":0.0,"last_synced_commit":"7f7f23503b267b9bcf33b04eece4f8ce0716dbfe"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/cooperlyt/uid-reactive-generator-spring","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cooperlyt%2Fuid-reactive-generator-spring","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cooperlyt%2Fuid-reactive-generator-spring/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cooperlyt%2Fuid-reactive-generator-spring/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cooperlyt%2Fuid-reactive-generator-spring/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cooperlyt","download_url":"https://codeload.github.com/cooperlyt/uid-reactive-generator-spring/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cooperlyt%2Fuid-reactive-generator-spring/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259627218,"owners_count":22886808,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["autoconfig","id","r2dbc","reactive","snowflake","springbootstarter","uid","uidgenerator","uuid"],"created_at":"2024-10-14T04:05:22.006Z","updated_at":"2026-04-30T02:37:23.765Z","avatar_url":"https://github.com/cooperlyt.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\nuid-reactive-generator-spring\n==========================\n\nUidReactiveGenerator是Java实现的, 基于[Snowflake](https://github.com/twitter/snowflake)算法的支持响应式编程分布式唯一ID生成器。\n\n基与 [雪花算法](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)\n\n\n* 更改了打包结构，抽出了Worker node id的生成接口， 使其可以自定义实现分配 Worker node id的方法， 本项目中实现了四种数据库存储的方法。\n* 支持 Spring boot Autoconfigure \n* 支持响应式编程，返回`Mono\u003cLong\u003e`, \n  * 在CachedUidGenerator：消耗速度高于填充速度时，等待填充完成后以非阻塞的方式通知订阅者。\n  * 在DefaultUidGenerator不允许使用未来时间（未到达的时间）状态：当前时间ID耗尽等待下一秒后非阻塞的方式通知订阅者\n* 支持 mybatis jdbc, mybatis r2bc , jap jdbc ,jap r2dbc 四种数据库连接方式\n* 支持通过Spring发现服务生成WorkerNodeID（不需要数据库）\n\n你以可以根据[接口包](https://github.com/cooperlyt/uid-generator-spring-boot/tree/master/uid-generator-api)自己实现Worker node分配的实现\n\n## 原理和性能\n\n请参见[Snowflake](https://github.com/twitter/snowflake)和[百度UidGenerator](https://github.com/baidu/uid-generator)\n\n## 使用\n\n|project-version|spring-boot|\n|:--|:--|\n|`1.1.x`|`\u003c=2.7.x`|\n|`1.2.x`|`\u003e=3`|\n\n#### spring boot autoconfig 方式\n\n#### Worker node ID by Spring Discover service(不需要数据库)\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.github.cooperlyt\u003c/groupId\u003e\n  \u003cartifactId\u003euid-reactive-generator-spring-cloud-starter-discovery\u003c/artifactId\u003e\n  \u003cversion\u003e1.2.1\u003c/version\u003e\n\u003c/dependency\u003e\n\n... \n```\nNOTE: 仅在Consul下测试，其它发现服务器没有进行测试。\n\n#### Worker node ID by DB\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.github.cooperlyt\u003c/groupId\u003e\n  \u003cartifactId\u003euid-reactive-generator-db-spring-boot-starter\u003c/artifactId\u003e\n  \u003cversion\u003e1.2.1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n* Mybatis JDBC:\n```xml\n        \u003cdependency\u003e\n            \u003cgroupId\u003eorg.mybatis.spring.boot\u003c/groupId\u003e\n            \u003cartifactId\u003emybatis-spring-boot-starter\u003c/artifactId\u003e\n            \u003cversion\u003e2.3.0\u003c/version\u003e\n        \u003c/dependency\u003e\n```\n* Mybatis R2DBC (从1.2版本以后移除)\n\n  参见 [reactive-mybatis-support](https://github.com/chenggangpro/reactive-mybatis-support)\n  \n* JPA JDBC:\n```xml\n                \u003cdependency\u003e\n                    \u003cgroupId\u003eorg.springframework.boot\u003c/groupId\u003e\n                    \u003cartifactId\u003espring-boot-starter-data-jpa\u003c/artifactId\u003e\n                \u003c/dependency\u003e\n```\n* JPA R2DBC\n```xml\n        \u003cdependency\u003e\n            \u003cgroupId\u003eorg.springframework.boot\u003c/groupId\u003e\n            \u003cartifactId\u003espring-boot-starter-data-r2dbc\u003c/artifactId\u003e\n        \u003c/dependency\u003e\n```\n\n\n\n### 数据库（可选）\n如果使用数据库实现的Worker node id分配器,需要先建立表 WORKER_NODE, 脚本：\n```sql\nDROP TABLE IF EXISTS WORKER_NODE;\nCREATE TABLE WORKER_NODE\n(\nID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',\nHOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name',\nPORT VARCHAR(64) NOT NULL COMMENT 'port',\nTYPE INT NOT NULL COMMENT 'node type: CONTAINER(1), ACTUAL(2), FAKE(3)',\nLAUNCH_DATE DATE NOT NULL COMMENT 'launch date',\nMODIFIED TIMESTAMP NOT NULL COMMENT 'modified time',\nCREATED TIMESTAMP NOT NULL COMMENT 'created time',\nPRIMARY KEY(ID)\n) COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB;\n```\n\n#### 自定义 CachedUidGenerator 拒绝策略 \n\n```java\n  // 生成一批ID后由于buffer环已满无法填充时的处理方式, 默认为丢弃并打印日志\n  @Bean\n  RejectedPutBufferHandler customPutHandler() {\n      return (buffer, id) -\u003e {\n      do your\n      };\n  }\n\n  // 由于消耗过快使用到了未来时间（未到达的时间）时的处理方式, 默认为允许并打印日志\n  @Bean\n  TimeIsFutureHandler customFutureTimeHandler() {\n      return (futureTime, currentTime) -\u003e {\n      do your\n      };\n  }\n  \n```\n\n#### ID 生成配置， 如应用在生产环境请确认以下参数，并确保你已经理解每个参数的意义。\n```yml\nuid:\n  timeBits: 30             # 时间位, 默认:30\n  workerBits: 16           # 机器位, 默认:16\n  seqBits: 7               # 序列号, 默认:7\n  epochStr: \"2023-02-17\"   # 初始时间, 默认:\"2019-02-20\"\n  enableFutureTime: false # 允许使用未来时间生成ID,可以使用多少未来时间由 maxBackwardSeconds 控制， 默认: false\n  maxBackwardSeconds: 1    # 系统时钟回拨和使用未来时间最长容忍时间（秒）, 默认:1\n  CachedUidGenerator:     # CachedUidGenerator相关参数\n    boostPower: 3          # RingBuffer size扩容参数, 可提高UID生成的吞吐量, 默认:3\n    paddingFactor: 50      # 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50\n    #scheduleInterval: 60    # 默认:不配置此项, 即不使用Schedule线程定时填充buffer环. 如需使用, 请指定Schedule线程时间间隔, 单位:秒\n```\n\n### 使用\n\n#### \n\n```java\n//实时生成\n//@Resource\n//private UidGenerator defaultUidGenerator;\n\n//生成一次id之后，按序列号+1生成一批id，缓存，供之后请求 \n@Resource\nprivate UidGenerator cachedUidGenerator;\n\n\n\n@Test\npublic void testSerialGenerate() {\n    // Generate UID\n    Mono\u003cLong\u003e uid = cachedUidGenerator.getUID();\n\n    // Parse UID into [Timestamp, WorkerId, Sequence]\n    // {\"UID\":\"450795408770\",\"timestamp\":\"2019-02-20 14:55:39\",\"workerId\":\"27\",\"sequence\":\"2\"}\n    System.out.println(cachedUidGenerator.parseUID(uid));\n\n}\n```\n\n#### 策略选择\n\n\n* CachedUidGenerator:\n  \n  适合**持续高消耗量**的ID分发，也会保持证生成ID排序准确性，此方式会一定程度上的增加内存和CPU缓存占用。\n\n* enableFutureTime 为true时的 DefaultUidGenerator:\n\n  适合**偶然突发的消费增加后持续保持低消耗量**的ID分发，此方式在突发高消费时的性能要比CachedUidGenerator还要高，但不应该持续保持高消耗(可消耗的未来时间由maxBackwardSeconds控制，超出后抛出异常)，因为过度使用未来时间有可能会造成服务重启后生成重复ID和短时间内的ID排序不精确。\n\n* enableFutureTime 为false时的 DefaultUidGenerator:\n  \n  适合**低消耗量实时**的ID分发，此方式可以保正ID中的时间精确，可满足高精确性的ID排序，一但消耗量高于当前时间的发号量时会返回一个等待响应，等待下一可用时间后发出ID（此方式在消费量大于当前时间可生成ID数量后性能最低），最大等待时间由maxBackwardSeconds控制，超出后抛出异常。\n\n对于发号性能的测式可使用此 [测试用例](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)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcooperlyt%2Fuid-reactive-generator-spring","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcooperlyt%2Fuid-reactive-generator-spring","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcooperlyt%2Fuid-reactive-generator-spring/lists"}