# id-generator **Repository Path**: cao_a_wei/id-generator ## Basic Information - **Project Name**: id-generator - **Description**: 全局唯一ID生成服务 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2020-07-16 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # id-generator #### 介绍 全局唯一ID生成服务 #### 安装 docker 安装 环境: mac ##### 方式一(docker pull) 0.请您先安装并运行 zookeeper 1.镜像获取: docker pull caoawei/id-service:2.0 2.配置文件 在您的本地创建application.yml 配置文件,并按照后文所给方式进行配置 3.运行 docker run -it --name id-service -p 6601:9010 -v /yourspath:/opt/app/id-service/config caoawei/id-service:2.0 ##### 方式二(docker-compose,推荐次方式) 创建并编辑docker-compose.yml 文件 ```` version: "3.8" ## 适用于docker 19.03.0+以上的engine services: zookeeper: image: zookeeper:latest container_name: zookeeper ports: - "2181:2181" networks: id-subnet: ipv4_address: 172.45.0.10 id-service-6601: image: caoawei/id-service:2.0 container_name: id-service-6601 ports: - "6601:9010" networks: id-subnet: ipv4_address: 172.45.0.20 volumes: - "/Users/dasouche/docker-image/id-service/config:/opt/app/id-service/config" id-service-6602: image: caoawei/id-service:2.0 container_name: id-service-6602 ports: - "6602:9010" networks: id-subnet: ipv4_address: 172.45.0.21 volumes: - "/Users/dasouche/docker-image/id-service/config:/opt/app/id-service/config" id-service-6603: image: caoawei/id-service:2.0 container_name: id-service-6603 ports: - "6603:9010" networks: id-subnet: ipv4_address: 172.45.0.22 volumes: - "/Users/dasouche/docker-image/id-service/config:/opt/app/id-service/config" id-service-6604: image: caoawei/id-service:2.0 container_name: id-service-6604 ports: - "6604:9010" networks: id-subnet: ipv4_address: 172.45.0.23 volumes: - "/Users/dasouche/docker-image/id-service/config:/opt/app/id-service/config" networks: id-subnet: external: true ```` 按照后文所示application.yml文件模版在您的本地创建此文件,并根据您的配置做相应修改 创建网络 ```` docker network create --subnet=172.45.0.0/16 id-subnet 根据您自己的配置对上述docker-compose.yml文件做适当修改 ```` 运行 ```` docker-compose -f up -d ```` application.yml 配置文件模版 ```` ## web 接口 server: port: 9010 dubbo: application: name: ${spring.application.name} provider: export: true protocol: dubbo consumer: check: false timeout: 10000 retries: -1 registry: address: zookeeper://172.45.0.10 port: 2181 protocol: name: dubbo port: 20880 scan: base-packages: com.generator.** election: timeout: 5000 ## 序列号配置 sequence: ## 表示 序列号区间剩余的百分比,用于触发申请新的区间 remain: percent: 20 ## 每次申请时区间大小 apply: interval: 5000000 ## 协调器相关配置(这里指zookeeper) coordinator: address: ${zk.address} port: 2181 connection: timeout: 5000 session: timeout: 10000 retry: times: 3 interval: 1000 ## epoch 占用位数 epoch: bits: 31 spring: application: name: id-service ## 根据您的网络配置进行调整 zk: address: 172.45.0.10 ```` #### 软件架构 系统架构如下 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0716/174302_d02336ca_7484859.png "id-generator (1).png") IDService: 对外部应用提供获取id服务,其内部维护者zk监听器和向leader申请序列号区间的线程 SequenceApplyRpc: 负责集群中follower和leader的通信,follower通过此接口向leader申请序列号区间,同时其内部维护着zk监听器和epoch的管理. LeaderService: 负责集群leader选举和epoch管理 zookeeper service: 负责和zookeeepr的交互 #### 时许图 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0716/173954_b36aa612_7484859.png "id-generator时许图.png") #### 原理介绍 全局唯一ID的原理比较简单 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0716/175047_b3aef23f_7484859.png "id-generator原理.png") 如图所示: 红色位表示 符号位(1位) 蓝色区域表示 epoch(周期) (31位) 黑色表示 sequence number (序列号) (32位) 集群内除了Leader节点负责维护epoch的更新之外,集群节点无其他状态信息, 集群中任意一个节点均可对外部提供服务。在通常的情况下,获取next id 的操作为内存操作。 31位的周期值, 即使每天发生10000此的leader变更, 也可运行半个世纪 #### 计算id的公式为: nextId = (epoch << 31) | sequenceNumber #### epoch 更新时机 - Leader变更时, 则epoch 加 1 - epoch 周期内sequenceNumber使用完,进入下一个epoch #### sequenceNumber 更新时机 - Leader变更时, epoch更新为后,sequenceNumber 重置为0 - epoch 周期内sequenceNumber使用完,重置为0 - Follower节点向Leader申请序列号区间 #### 存在问题 当集群中大部分follower同时向leader申请序列区间时,leader节点可能成为瓶颈, 各follower节点可通过调整获取的序列区间来降低这种情况的发生。 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)