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 日

相关推荐

  • 实战指南:理解 ThreadLocal 原理并用于Java 多线程上下文管理

    目录 一、ThreadLocal基本知识回顾分析 (一)ThreadLocal原理 (二)既然ThreadLocalMap的key是弱引用,GC之后key是否为null? (三)ThreadLocal中的内存泄漏问题及JDK处理方法 (四)部分核心源码回顾 ThreadLocal.set()方法源码详解 ThreadLocalMap.get()方法详解 Th…

    2024 年 12 月 28 日
    40700
  • 如何做好软件架构师

    本文以个人视野聊下软件架构师的工作以及软件架构设计知识。做开发工作接近10年了,期间主要做Windows应用开发。在成熟的“华南区最大WPF团队”希沃白板呆了较长一段时间、后面从0到1构建Windows技术栈以及会议屏软件集,在软件设计这块自己成长了很多。之前整理过如何做好技术经理 – 唐宋元明清2188 – 博客园,这里梳理下自己的设计思维,算是自己阶段性…

    未分类 2025 年 1 月 12 日
    41400
  • 基于Java的不固定长度字符集在指定宽度和自适应模型下图片绘制生成实战

    目录 前言 一、需求介绍 1、指定宽度生成 2、指定列自适应生成 二、Java生成实现 1、公共方法 2、指定宽度生成 3、指定列自适应生成 三、总结 前言 在当今数字化与信息化飞速发展的时代,图像的生成与处理技术正日益成为众多领域关注的焦点。从创意设计到数据可视化,从游戏开发到人工智能辅助创作,高效、精准且具有高度适应性的图像生成方案有着广泛而迫切的需求。…

    未分类 2025 年 5 月 12 日
    29800
  • 『玩转Streamlit』–上传下载文件

    在Web应用中,文件的上传下载 是交互中不可缺少的功能。 因为在业务功能中,一般不会只有文字的交互,资料或图片的获取和分发是很常见的需求。 比如,文件上传 可让用户向服务器提交数据,如上传图片分享生活、提交文档用于工作协作等,丰富应用功能。 而文件下载 则使用户能获取服务器端的资源,像下载软件、报告等,提升用户对应用内容的获取能力,增强用户体验和应用实用性。…

    2024 年 12 月 30 日
    51700
  • JavaScript 延迟加载的方法( 7种 )

    JavaScript脚本的延迟加载(也称为懒加载)是指在网页的主要内容已经加载并显示给用户之后,再加载或执行额外的JavaScript代码。这样做可以加快页面的初始加载速度,改善用户体验,并减少服务器的压力。 以下是几种常见的延迟加载JavaScript的方法: defer 属性: 使用 async 属性: async 属性告诉浏览器立即开始下载脚本,并且在…

    2025 年 1 月 19 日
    46800

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信