今天介绍一个开源项目:id-maker,主要功能是在分布式环境下生成唯一ID。上周停了一周,也是用来开发和测试这个项目的相关代码。美团有一个开源项目叫Leaf,是用Java开发的。本项目基于此思路,使用Go开发实现。项目整体代码量不多。不管你是想在实际生产环境中使用,还是找个项目实践,我觉得都是不错的选择。项目背景全局唯一ID是大多数系统的强烈要求。比如快递、外卖、电影等,都需要生成一个唯一的ID来保证trackingnumber的唯一性。业务系统对身份证号码有什么要求?全球唯一:不能出现重复的ID号。既然是唯一标识,这是最基本的要求。增加趋势:聚簇索引用于MySQLInnoDB引擎。由于大多数RDBMS使用B-tree数据结构来存储索引数据,因此我们在选择主键时应尽量使用有序的主键来保证写入性能。单调递增:保证下一个ID必须大于上一个ID,比如交易版本号、IM增量消息、排序等特殊需求。信息安全:如果ID是连续的,很容易被恶意用户窃取作品,直接按顺序下载指定的URL即可;如果是订单号,那就更危险了,竞争对手可以直接知道我们每天的订单量。因此,在某些应用场景中,需要有不规则、不规则的ID。在这种情况下,拥有一个高度可用的唯一ID生成系统非常重要。有两种方法可以为项目生成ID:从数据库生成ID。ID是根据雪花算法生成的。接口调用方式有两种:HTTP方式gRPC方式HTTP方式1.健康检查:curlhttp://127.0.0.1:8080/ping2。获取ID:获取被测试标??签的ID:curlhttp://127.0.0.1:8080/v1/id/test3。获取snowID:curlhttp://127.0.0.1:8080/v1/snowidgRPC方法一、获取ID:grpcurl-plaintext-d'{"tag":"test"}'-import-path$HOME/src/id-maker/internal/controller/rpc/proto-protosegment.protolocalhost:50051proto.Gid/GetId2,获取雪花ID:grpcurl-plaintext-import-path$HOME/src/id-maker/internal/controller/rpc/proto-protosegment.protolocalhost:50051proto.Gid/GetSnowIdLocaldevelopment#RunMySQL$makecompose-up#Runappwithmigrations$makerun项目架构项目使用go-clean-template架构模板开发,目录结构如下:下面是对每个目录进行make简单说明:cmd:程序入口config:配置文件docs:生成的项目文档integration-test:集成测试internal:业务代码pkg:部分调用包借用官方两张图:整体层次关系如下,最里面是模型,其中定义了我们的表结构,中间是业务l逻辑层。业务逻辑层会提供调用最外层API的接口。最外层是一些工具和调用入口。这样做最大的好处就是解耦。无论最外层如何变化,只要在业务逻辑层实现了相应的接口,核心代码可能根本不需要改动。因此,它们之间的调用关系是这样的:HTTP>usecaseusecase>repository(Postgres)usecase
