原文连贯: 开源我的项目|Go 开发的一款分布式惟一 ID 生成零碎

明天跟大家介绍一个开源我的项目:id-maker,次要性能是用来在分布式环境下生成惟一 ID。上周停更了一周,也是用来开发和测试这个我的项目的相干代码。

美团有一个开源我的项目叫 Leaf,应用 Java 开发。本我的项目就是在此思路的根底上,应用 Go 开发实现的。

我的项目整体代码量并不多,不论是想要在理论生产环境中应用,还是想找个我的项目练手,我感觉都是一个不错的抉择。

我的项目背景

在大部分零碎中,全局惟一 ID 都是一个强需要。比方快递,外卖,电影等,都须要生成惟一 ID 来保障单号惟一。

那业务系统对 ID 号的要求有哪些呢?

  1. 全局唯一性:不能呈现反复的 ID 号,既然是惟一标识,这是最根本的要求。
  2. 趋势递增:在 MySQL InnoDB 引擎中应用的是汇集索引,因为少数 RDBMS 应用 B-tree 的数据结构来存储索引数据,在主键的抉择下面咱们应该尽量应用有序的主键保障写入性能。
  3. 枯燥递增:保障下一个 ID 肯定大于上一个 ID,例如事务版本号、IM 增量音讯、排序等非凡需要。
  4. 信息安全:如果 ID 是间断的,歹意用户的扒取工作就非常容易做了,间接依照程序下载指定 URL 即可;如果是订单号就更危险了,竞对能够间接晓得咱们一天的单量。所以在一些利用场景下,会须要 ID 无规则、不规则。

在此背景下,有一个高可用的惟一 ID 生成零碎就很重要了。

我的项目应用

生成 ID 分两种形式:

  1. 依据数据库生成 ID。
  2. 依据雪花算法生成 ID。

应用上提供两种形式来调用接口:

  1. HTTP 形式
  2. gRPC 形式

HTTP 形式

1、健康检查:

curl http://127.0.0.1:8080/ping

2、获取 ID:

获取 tag 是 test 的 ID:

curl http://127.0.0.1:8080/v1/id/test

3、获取雪花 ID:

curl http://127.0.0.1:8080/v1/snowid

gRPC 形式

1、获取 ID:

grpcurl -plaintext -d '{"tag":"test"}' -import-path $HOME/src/id-maker/internal/controller/rpc/proto -proto segment.proto localhost:50051 proto.Gid/GetId

2、获取雪花 ID:

grpcurl -plaintext -import-path $HOME/src/id-maker/internal/controller/rpc/proto -proto segment.proto localhost:50051 proto.Gid/GetSnowId

本地开发

# Run MySQL
$ make compose-up

# Run app with migrations
$ make run

我的项目架构

我的项目应用 go-clean-template 架构模板开发,目录构造如下:

上面对各目录做一个简要阐明:

  • cmd:程序入口
  • config:配置文件
  • docs:生成的我的项目文档
  • integration-test:整合测试
  • internal:业务代码
  • pkg:一些调用的包

借用官网的两张图:

整体的档次关系是这样的,最外面是 models,定义咱们的表构造,而后两头是业务逻辑层,业务逻辑层会提供接口,给最外层的 API 来调用,最外层就是一些工具和调用入口。

这样做的最大益处就是解耦,不论最外层如何变动,只有在业务逻辑层实现对应接口即可,外围代码可能基本不须要扭转。

所以,它们之间的调用关系看起来是这样的:

HTTP > usecase
       usecase > repository (Postgres)
       usecase < repository (Postgres)
HTTP < usecase

以上就是本我的项目的全部内容,如果大家感兴趣的话,欢送给我留言交换,要是能给个 star 那就太好了。

我的项目地址:id-maker

往期文章:

  • 据说,99% 的 Go 程序员都被 defer 坑过
  • 测试小姐姐问我 gRPC 怎么用,我间接把这篇文章甩给了她
  • gRPC,爆赞
  • 应用 grpcurl 通过命令行拜访 gRPC 服务
  • 举荐三个实用的 Go 开发工具

举荐浏览:

  • go-clean-template
  • hwholiday/gid
  • Leaf——美团点评分布式ID生成零碎