springboot~多节点应用里的雪花算法唯一性

雪花算法的唯一性,在单个节点中是可以保证的,对应kubernetes中的应用,如果是横向扩展后,进行多副本的情况下,可能出现重复的ID,这需要我们按着pod_name进行一个workId的生成,我还是建议通过不引入第三方组件和网络请求的前提下解决这个问题,所以我修改了kubernetes的yaml文件。

  • k8s的yaml配置

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: my-app
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: my-app
    template:
    metadata:
    labels:
    app: my-app
    spec:
    containers:
    - name: my-container
    image: my-image:latest
    env:
    - name: POD_NAME
    valueFrom:
    fieldRef:
    fieldPath: metadata.name # 获取当前 Pod 的名称

  • 字符串(0~1024)数字方法,通过掩码的方式

    ```
    public static int stringToNumber(String input) {
    // 使用CRC32计算字符串的哈希值
    CRC32 crc = new CRC32();
    byte[] bytes = input.getBytes(StandardCharsets.UTF_8);
    crc.update(bytes);

        // 获取哈希值并限制在0到1023之间
        long hashValue = crc.getValue();
        return (int) (hashValue % 1024);
    }
    

    ```

  • 获取服务器机器码

    ```
    /*
    * 获取机器码.
    * @return
    /
    public static String getUniqueMachineId() {
    StringBuilder uniqueId = new StringBuilder();

        try {
            // 获取本机的IP地址
            InetAddress localHost = InetAddress.getLocalHost();
            uniqueId.append(localHost.getHostAddress()).append("_");
    
            // 获取网络接口并获取MAC地址
            Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();
            while (networkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = networkInterfaces.nextElement();
                byte[] mac = networkInterface.getHardwareAddress();
                if (mac != null) {
                    for (int i = 0; i < mac.length; i++) {
                        uniqueId.append(String.format("%02X", mac[i]));
                        if (i < mac.length - 1) {
                            uniqueId.append("-");
                        }
                    }
                    uniqueId.append("_");
                }
            }
    
            // 添加系统信息作为补充
            String osName = System.getProperty("os.name");
            String osVersion = System.getProperty("os.version");
            String userName = System.getProperty("user.name");
            uniqueId.append(osName).append("_").append(osVersion).append("_").append(userName);
    
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    
        return uniqueId.toString();
    }
    

    ```

  • ID生成器的改进

    ```
    @Slf4j
    public class IdUtils {

    static SnowFlakeGenerator snowFlakeGenerator;
    
    public static String generateId() {
        if (snowFlakeGenerator == null) {
            long podNameCode = stringToNumber(Optional.ofNullable(System.getenv("POD_NAME")).orElse(stringToNumber(getUniqueMachineId())));
            log.debug("podNameCode:{}", podNameCode);
            snowFlakeGenerator = new SnowFlakeGenerator(podNameCode);
    
        }
        return snowFlakeGenerator.hexNextId();
    }
    

    ```

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/5012.html

(0)
LomuLomu
上一篇 2024 年 12 月 31 日 上午4:16
下一篇 2024 年 12 月 31 日

相关推荐

  • spring 事务失效的 12 种场景

    看这个:https://blog.csdn.net/hanjiaqian/article/details/120501741里面有12种失效场景以及如何解决。在 spring 中为了支持编程式事务,专门提供了一个类:TransactionTemplate,在它的 execute 方法中,就实现了事务的功能。 相较于@Transactional注解声明式事务,…

    2025 年 1 月 6 日
    61900
  • Spring Boot与WebSocket融合全攻略:从入门到高阶应用

    一、WebSocket基础概念与核心原理 1.1 WebSocket协议的本质内涵 WebSocket是一种在单一TCP连接上开展全双工通信的协议,它攻克了HTTP协议在实时通信方面的局限。不同于HTTP那种请求 – 响应的模式,WebSocket允许服务器主动向客户端推送数据,实现了真正意义上的双向交互。 传统HTTP通信的弊病所在: 每一次请求都得重新搭…

    未分类 2025 年 6 月 18 日
    1.1K00
  • o3 发布了,摔碎了码农的饭碗

    大家好,我是汤师爷~ 在 2024 年底,OpenAI 发布了最新推理模型 o3。o3模型相当炸裂,在世界级编程比赛中拿下第 175 名,打败 99.9% 的参赛者。AI 写代码都赶上顶级程序员了,程序员是不是要失业? 最近不少读者反馈,像 GitHub Copilot、Claude Sonnet 3.5、Cursor 等 AI 辅助编程工具,能让代码编写效…

    2025 年 1 月 12 日
    57400
  • Mysql

    MySQL 学习整理 MySQL 基础架构 最上层的客户端所包含的服务并不是 MySQL 独有的,大多数基于网络的客户端/服务器工具或服务器都有类似的服务,包括连接处理、身份验证、确保安全性等。 第二层包含了大多数 MySQL 的核心功能,包括查询解析、分析、优化、以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能也都在这一层实现:…

    2024 年 12 月 28 日
    48900
  • vue3 + pnpm 打造一个 monorepo 项目

    单一仓库与多仓库架构 单一仓库(Monorepo)架构是一种策略,它允许我们在一个单一的仓库中管理多个项目或包;而多仓库(Multirepo)架构则是将每个项目分别存放在不同的仓库中。 在Monorepo结构中,除了根目录下有一个公共的package.json文件外,每个子项目(sub-package)也有自己的package.json文件。 子项目之间可以…

    未分类 2024 年 12 月 24 日
    51400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信