• spring cloud微服务快速教程之(十二) 分布式ID解决方案(mybatis-plus篇)


    0-前言

      分布式系统中,分布式ID是个必须解决的问题点;

      雪花算法是个好方式,不过不能直接使用,因为如果直接使用的话,需要配置每个实例workerId和datacenterId,在微服务中,实例一般动态配置,直接指定具体实例的这两个参数是不现实的;

      所以,一般采用雪花算法的变种,主要是将这两个参数由手动配置改为动态生成,美团leaf、百度uid-generator都属于改良的变种算法,可以适当采用;

      不过这些算法都或多或少对其他存在一定依赖,不是非常方便,今天我们来说一种非常方便的分布式ID解决方案,那就是mybatis plus 内置的方式;

      项目中基本都会使用到MYSQL,ORM无疑mybatis plus是最好用的;所以这种分布式ID方式很多时候都能在项目中采用;它实际也是雪花算法的变种,它采用网卡序列号等来动态生成workerId和datacenterId,在分布式的系统中,是可以保证ID唯一性的;

    1-实现

    1-1、添加依赖

            <!-- 9、集成mybatis-plus  -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.2.0</version>
            </dependency>

    1-2、添加配置

    mybatis plus使用前面有介绍过,请参考:https://www.cnblogs.com/yanghj/p/12446686.html

    1-3、使用

      两种方式:

    一种是数据库自动生成并插入,这种方式在插入数据库时,数据库自动生成并插入,无需用户手动填写,这种方式我们实际很少使用,因为在插入后才能拿到该ID,但是很多时候,我们在插入前就需要用到该ID,用来做其他关联业务处理,所以手动插入比较实用点;

    一种是手动插入方式:ID用mybatis plus来生成,然后再塞入ID字段中;

        /**
         * 编号
         */
        @TableId(value = "id",type = IdType.INPUT) //2、该注解表示ID手动填入
        //@TableId(value = "id",type = IdType.ASSIGN_ID) //1、该注解表示ID自动生成并插入,无需用户填写
        private Long id;

    手动插入时,写个IDhelper生成ID,代码如下:

    package com.anson.utils;
    
    import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
    import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
    
    import java.util.UUID;
    
    /**
     * 描述: ID生成
     * 版权: Copyright (c) 2020
     * 公司: XXX
     * 作者: yanghj
     * 版本: 4.0
     * 创建日期: 2020/9/16 9:59
     */
    public class IDhelper
    {
        //用mybatis-plus生成Long ID
        public  static Long getNextId()
        {
            IdentifierGenerator identifierGenerator=new DefaultIdentifierGenerator();
            Number id=  identifierGenerator.nextId(new Object());
            Long nextid = Long.parseLong(id+"");
            return nextid;
        }
    
    }

    使用的时候:

    Long id = IDhelper.getNextId();

    2-总结

      使用到MySQL数据库的系统,这种分布式ID解决方案无疑是目前最方便的方案,当然,也可以采用其他方案;自由选择;

  • 相关阅读:
    BestCoder Round #29 1003 (hdu 5172) GTY's gay friends [线段树 判不同 预处理 好题]
    POJ 1182 食物链 [并查集 带权并查集 开拓思路]
    Codeforces Round #288 (Div. 2) E. Arthur and Brackets [dp 贪心]
    Codeforces Round #287 (Div. 2) E. Breaking Good [Dijkstra 最短路 优先队列]
    Codeforces Round #287 (Div. 2) D. The Maths Lecture [数位dp]
    NOJ1203 最多约数问题 [搜索 数论]
    poj1426
    POJ 1502 MPI Maelstrom [最短路 Dijkstra]
    POJ 2785 4 Values whose Sum is 0 [二分]
    浅析group by,having count()
  • 原文地址:https://www.cnblogs.com/yanghj/p/13680979.html
Copyright © 2020-2023  润新知