Sign inSign up

activeclub/uid-service

By activeclub

•Updated over 2 years ago

A distributed id infrastructure service based on the Snowflake

Image
0

402

activeclub/uid-service repository overview

⁠云原生雪花改进型分布式id服务

⁠1,概述

​ 一个基于雪花改进型分布式id基础服务

image-20231113163601177

⁠1.1,入参样例:

请求路径:GET http://{url}:{port}/web/uuid/get

入参说明:

字段字段名说明
url对外暴露的ip或者域名本地启动一般为127.0.0.1或者localhost
port对外暴露的端口信息
/web/uuid/get获取唯一id的请求路径
⁠1.2,反参样例:
{
    "code":"0",
    "msg":"1",
    "data":15969077833633829
}

反参说明:

字段字段名类型意义
code标识码string0表示反参正常
msg运行节点的workIdstring这个id是由那个工作容器节点产生
data全局唯一的id(长整型)integer 64全局唯一的id

⁠2,用法

⁠2.1,jar程序
java -jar app.jar

备注:使用jdk21

测试:直接在浏览器请求 http://127.0.0.1:8080/web/uuid/get⁠

⁠2.2,Docker

docker.io镜像

# jvm模式运行
docker run -it -d -p 8080:8080 activeclub/uid-service:v1.0.0-jvm-2023-11-12
# native模式运行
docker run -it -d -p 8080:8080 activeclub/uid-service:v1.0.0-native-2023-11-12

阿里云mirror镜像:

# jvm模式运行
docker run -it -d -p 8080:8080 registry.cn-shanghai.aliyuncs.com/activeclub/uid-service:v1.0.0-jvm-2023-11-12
# native模式运行
docker run -it -d -p 8080:8080 registry.cn-shanghai.aliyuncs.com/activeclub/uid-service:v1.0.0-native-2023-11-12

测试:直接在浏览器请求 http://127.0.0.1:8080/web/uuid/get⁠

⁠2.3,K8s

Stateful.yaml部署

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: uid-service
spec:
  serviceName: uid-service
  replicas: 3
  selector:
    matchLabels:
      app: uid-service
  template:
    metadata:
      labels:
        app: uid-service
    spec:
      containers:
        - name: uidserver
          imagePullPolicy: IfNotPresent
          image:  activeclub/uid-service:v1.0.0-native-2023-11-12
          livenessProbe:
            httpGet:
              path: /actuator/health/liveness
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /actuator/health/readiness
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 10

---
apiVersion: v1
kind: Service
metadata:
  name: uid-service
spec:
  selector:
    app: uid-service
  ports:
    - name: uid-port
      port: 8080
      targetPort: 8080
      protocol: TCP

备注:

1,修改replicas,可以调整节点个数

2,设置健康检查,确保服务的可用性与自愈性

image-20231113200623345

⁠3,底层逻辑

  1. k8s-stateful部署时,运行程序的主机名称格式为(xxx-n),其中n为1~m的不重复数值,m<=n,n为节点个数;因此程序使用主机名称的节点后缀设置为workId
  2. 每个服务内部使用原子类AtomicLong用于确保生产id的唯一性和性能
  3. 使用seata改进型雪花算法来确保每个节点产生的id唯一性
  4. 底层打包使用GraalVM native-image,来确保docker容器只有160MB,其中80MB是程序运行,以及启动速度700ms

⁠4,性能

类别JVMNative
启动耗时(s)2.5490.090
资源包压缩后大小(MB)269.6855.38
资源包大小(MB)601.62160.72
前1s,并发性能(QPS)8441.011577.4
运行30s后,并发性能(QPS)15692.115240.0

测试请求并发线程数:16

资源包压缩后大小(MB):

image-20231113183607968

资源包大小(MB):

image-20231113195227057

⁠5,证书

Apache License 2.0⁠

⁠6,关联知识

  1. java
    1. 原子类
    2. GraalVM-native-image
    3. AOT、JIT
  2. Kubernetes
    1. Stateful
    2. 健康检查探针
    3. helm
    4. docker build
  3. 雪花分布式id算法
    1. 时间回溯

    2. 自增性

⁠6,参考链接

  1. Seata改进型雪花分布式ID算法-java实现⁠
  2. java算法(4)---静态内部类实现雪花算法⁠
  3. Seata基于改良版雪花算法的分布式UUID生成器分析⁠
  4. 关于新版雪花算法的答疑⁠
  5. Leaf 美团点评分布式ID生成系统⁠
  6. JIT与AOT⁠
  7. JIT Performance: Ahead-Of-Time versus Just-In-Time⁠
  8. 语义化版本 2.0.0⁠
  9. 1配置存活、就绪和启动探针⁠

Tag summary

Content type

Image

Digest

sha256:273bbada3…

Size

269.7 MB

Last updated

over 2 years ago

docker pull activeclub/uid-service