改良版雪花算法,分布式唯一ID神器!

本期项目概览:

  • IdGenerator:唯一 ID 生成器

  • JNotepad:跨平台文本编辑器

  • Fury:高性能多语言序列化框架

  • x-easypdf:快速生成 PDF 文档

  • Jarboot:可视化 Java 进程管理平台

IdGenerator:唯一 ID 生成器

项目介绍

  • 和 UidGenerator、Leaf 一样,IdGenerator 也是一款基于 Snowflake(雪花算法)的唯一 ID 生成器。

  • IdGenerator 生成的唯一 ID 更短,速度更快,兼容所有雪花算法(号段模式或经典模式),且不依赖外部存储系统。

  • IdGenerator 解决了时间回拨问题,支持手工插入新 ID

  • IdGenerator 原生支持 C#/Java/Go/C/Rust/Python/Node.js/PHP(C 扩展)/SQL/ 等语言,并提供多线程安全调用动态库(FFI)。

  • 默认配置下,IdGenerator 生成的 ID 可用 71000 年不重复。

IdGenerator 生成的唯一 ID 组成

图片

IdGenerator 生成的 ID 组成

  • timestamp (位数不固定):时间差,是生成 ID 时的系统时间减去 BaseTime(基础时间,也称基点时间、原点时间、纪元时间,默认值为 2020 年) 的总时间差(毫秒单位)。初始为 5bits,随着运行时间而增加。如果觉得默认值太老,你可以重新设置,不过要注意,这个值以后最好不变。

  • worker id (默认 6 bits):机器 id,机器码,最重要参数,是区分不同机器或不同应用的唯一 ID,最大值由 WorkerIdBitLength(默认 6)限定。如果一台服务器部署多个独立服务,需要为每个服务指定不同的 WorkerId。

  • sequence (默认 6 bits):序列数,是每毫秒下的序列数,由参数中的 SeqBitLength(默认 6)限定。增加 SeqBitLength 会让性能更高,但生成的 ID 也会更长。

相关地址

  • 项目地址:https://github.com/yitter/IdGenerator

  • Java 语言使用示例:https://github.com/yitter/idgenerator/tree/master/Java

JNotepad:跨平台文本编辑器

项目介绍 :基于 JavaFX 开发的文本编辑器,供了完善的文本编辑和查看功能,支持 Mac / Windows / Linux。

效果展示

目前还是处于玩具项目的阶段,bug 挺多,体验也比较差。

图片

相关地址 :

  • 项目地址:https://gitee.com/jcnc-org/JNotepad

  • JNotepad 开发者指南:https://gitee.com/jcnc-org/docs/blob/master/CN/Dev-Guide/JNotepad-Dev-Guide/JNotepad-Dev-Guide.md

Fury:高性能多语言序列化框架

项目介绍

  • Fury 是一个基于 JIT 动态编译和零拷贝的多语言序列化框架,支持 Java/Python/Golang/JavaScript/C++ 等语言,提供极致的性能和易用性。

  • Fury 可以用于替代 JDK、Kryo、Hessian 等序列化框架,无需修改任何代码。

图片

详细介绍可以查看这篇文章:比 JDK 最高快 170 倍,蚂蚁开源的这款序列化框架有点厉害!!

性能对比

Fury 与其他常见序列化框架的性能对比如下图所示。

图片

图片

图片

更多 benchmark 数据请参考 Fury Github 官方文档:https://github.com/alipay/fury/tree/main/docs/benchmarks

x-easypdf:快速生成 PDF 文档

项目介绍:基于 pdfbox/fop 二次封装的框架,分为 pdfbox 模块(主打 pdf 编辑功能)和 fop 模块(主打 pdf 导出功能)。两个模块均可单独使用,也可以结合使用,帮助开发者快速生成 pdf 文档。

软件架构

图片

使用效果

创建 PDF:

// 定义pdf输出路径
String outputPath = "E:\\pdf\\test\\pdfbox\\test.pdf";
// 构建文档
XEasyPdfHandler.Document.build().addPage(
    // 构建页面
    XEasyPdfHandler.Page.build(
        // 构建组件
        XEasyPdfHandler.Text.build("文本内容")
    )
// 保存文档并关闭
).save(outputPath).close();

编辑 PDF:

// 定义pdf输出路径
String sourcePath = "E:\\pdf\\test\\pdfbox\\test.pdf";
// 定义pdf输出路径
String outputPath = "E:\\pdf\\test\\pdfbox\\output.pdf";
// 读取文档
XEasyPdfDocument document = XEasyPdfHandler.Document.load(sourcePath);
// 获取页面
XEasyPdfPage page = document.getPageList().get(0);
// 创建文本组件
XEasyPdfText text = XEasyPdfHandler.Text.build("test");
// 将组件添加到页面
page.addComponent(text);
// 保存文档并关闭
document.save(outputPath).close();

相关地址

  • 项目地址:https://x-easypdf.cn/

  • 官网:https://gitee.com/dromara/x-easypdf

Jarboot:可视化 Java 进程管理平台

项目介绍

  • Jarboot 是一款对业务代码无侵入的可视化 Java 进程管理平台,支持 Java 进程启停、诊断、监控。

  • Jarboot 支持开发者使用调试命令对其启动的进程进行调试,有些命令是 Arthas 中的命令,用法大致相同。

效果预览

服务配置

图片

在线诊断:

图片

jad 反编译:

图片

系统实时数据面板:

图片

原理

Jarboot 具体的技术原理是通过 JavaAgent + ASM 来往目标 Java 进程注入代码:

  • JavaAgent 可以在加载 Java 文件之前对字节码进行修改,也可以在运行期间对已经加载的类的字节码进行修改。

  • ASM 是一个 Java 字节码操作框架,可以帮助我们操作 Java 字节码。

市面上绝大部分的 Java 诊断/分析工具的原理都类似,只是具体使用的字节码操作框架的不一样。

Jarboot 基于 Vue3(前端) + SpringBoot(后端),通过 WebSocket 向前端界面实时推送进程的相关信息,同时与启动的 Java 进程维持一个长连接,以监控其状态。

类似于 Arthas,Jarboot 也提供了一些开箱即用的命令(如获取 JVM 信息、 监控线程状态、获取线程栈信息等),并且,你还可以通过 SPI 扩展(支持 JDK 和 Spring 的 SPI)机制来实现自己的命令。

相关地址

  • Gitee 地址:https://gitee.com/majz0908/jarboot

  • 文档:https://www.yuque.com/jarboot

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
雪花算法是种生成分布式ID的算法,它可以生成一个64位的ID,其中包含了时间戳、数据中心ID和机器ID等信息。下面是雪花算法生成分布式ID的软件设计模型: 1. 定义一个Snowflake类,该类包含以下属性: - datacenter_id: 数据中心ID,占5位,取值围为0~31。 - worker_id: 机器ID,占5位,取值范围为0~31。 - sequence: 序列号,占12位,取值范围为0~4095。 - last_timestamp: 上一次生成ID的时间戳。 2. 实现Snowflake类的构造函数,初始化datacenter_id和worker_id属性。 3. 实现一个next_id方法,该方法用于生成下一个ID。具体实现如下: - 获取当前时间戳,单位为毫秒。 - 如果当前时间戳小于上一次生成ID的时间戳,则说明系统时钟回退过,抛出异常。 - 如果当前时间戳等于上一次生成ID的时间戳,则将序列号加1。 - 如果当前时间戳大于上一次生成ID的时间戳,则将序列号重置为0,并将last_timestamp属性更新为当前时间戳。 - 将datacenter_id、worker_id、时间戳和序列号按照一定的位数组合成一个64位的ID。 - 返回生成的ID。 4. 在分布式系统中,每个节点都需要创建一个Snowflake实例,并指定不同的datacenter_id和worker_id。每个节点生成的ID都是唯一的,且具有时间顺序。 下面是一个Python实现的雪花算法生成分布式ID的代码示例: ```python import time class Snowflake: def __init__(self, datacenter_id, worker_id): self.datacenter_id = datacenter_id self.worker_id = worker_id self.sequence = 0 self.last_timestamp = -1 def next_id(self): timestamp = int(time.time() * 1000) if timestamp < self.last_timestamp: raise Exception("Clock moved backwards. Refusing to generate id") if timestamp == self.last_timestamp: self.sequence = (self.sequence + 1) & 4095 if self.sequence == 0: timestamp = self.wait_next_millis(self.last_timestamp) else: self.sequence = 0 self.last_timestamp = timestamp return ((timestamp - 1288834974657) << 22) | (self.datacenter_id << 17) | (self.worker_id << 12) | self.sequence def wait_next_millis(self, last_timestamp): timestamp = int(time.time() * 1000) while timestamp <= last_timestamp: timestamp = int(time.time() * 1000) return timestamp ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值