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 日

相关推荐

  • 【Java】:lambda 表达式

    📃个人主页:island1314 🔥个人专栏:java学习 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 1. 背景 🚀 🔥 Lambda 表达式 是JDK8新增的特性,Lambda 表达式 可以取代大部分匿名内部类,写出更优雅的Java代码,尤其在集合的遍历和其他集合操作中,可以将函数作为一个方法的参数,也就是函数作为参数传递到方法中,极大地优化代…

    2024 年 12 月 30 日
    47100
  • Java程序员必读的10本豆瓣高分经典书籍PDF

    要想成为一名优秀的Java程序员,不仅需要精通Java语言本身,还需要扎实的计算机基础、良好的编码习惯以及对软件开发全局的理解。掌握了这些基础知识,就像拥有了九阳神功和乾坤大挪移一样,再学习其它各门各派功夫直接手到擒来! 以下是从计算机基础、编程思想、Java语言、架构设计等方面精选的10本豆瓣高分经典书籍,它们能够帮助Java程序员全面提升编程能力和职业素…

    2025 年 1 月 14 日
    45400
  • 电商用户流失预测新思路:Java大数据与机器学习融合实战

    🌟亲爱的技术爱好者们,诚挚欢迎来到【云端技术社区】!在这个数据驱动的时代,我们致力于打造一个技术交流的优质平台。这里汇聚前沿技术解析与实践经验,期待您的真知灼见,让我们共同探索技术创新的无限可能!🌟全网平台(微信公众号/CSDN/抖音/华为/支付宝/微博):云端技术一、加入【技术精英社群】快速通道1:【云端技术精英圈】快速通道2:【CSDN技术创作营】二、核…

    2025 年 5 月 19 日
    32900
  • 用 Cursor 写出第一个程序

    大家好,我是汤师爷 最近几个月,Cursor迅速走红,成为一款强大的编程助手。Cursor不仅使用简单,而且通过集成各种大模型技术,编程能力一流。 Cursor是什么? Cursor是一个类似VSCode的编辑器,集成了GPT-4、Claude 3.5等LLM模型。它本质上是在VSCode的基础上添加了AI辅助编程功能。 从界面布局到操作方式都与VSCode…

    2024 年 12 月 30 日
    45500
  • 2025年蓝桥杯Java B组赛题深度剖析与解题策略

    作为一名连续两年参与蓝桥杯软件类Java B组竞赛的选手,我深刻体会到这项赛事对参赛者算法功底和临场应变能力的全面考验。今年的题目延续了蓝桥杯”夯实基础、鼓励创新”的命题风格,每道试题都像精心设计的思维迷宫,等待着选手用代码这把钥匙来开启。本文将系统梳理本届Java B组的典型赛题,通过全新的视角解析解题思路,分享编程实践中遇到的典型问题及其解决方案。这些内…

    未分类 2025 年 5 月 15 日
    30100

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信