该框架中“机器id(workerId)”的分配方式默认有三种方式

1.(单机版)zookeeper分配 2.(单机版)db分配 3.(分布式版)通过服务端分配

不同的分配方式就是不同的用法,依赖也是不同。其中单机版和分布式版也要根据场景来自行选择:

  • 单机版:无网络消耗,高可靠性,超高性能(单机可达1200w/s),有workerId上限问题
  • 分布式版:有网络消耗,高可用,高性能(集群单节点可达100w/s),无雪花算法任何问题,但是需要维护服务端

    zookeeper分配workerId

    1.添加依赖

    1. <dependency>
    2. <groupId>com.github.simonalong</groupId>
    3. <artifactId>butterfly-zookeeper-allocator</artifactId>
    4. <!--替换为具体版本号-->
    5. <version>${last.version.release}</version>
    6. </dependency>

    2.使用示例

    @Test
    public void test(){
      ZkButterflyConfig config = new ZkButterflyConfig();
      config.setHost("localhost:2181");
    
      ButterflyIdGenerator generator = ButterflyIdGenerator.getInstance(config);
      // 设置起始时间,如果不设置,则默认从2020年2月22日开始
      generator.setStartTime(2020, 5, 1, 0, 0, 0);
      // 添加业务空间,如果业务空间不存在,则会注册
      generator.addNamespaces("test1", "test2");
      Long uuid = generator.getUUid("test1");
      System.out.println(uuid);
    }
    

    db分配workerId

    1.添加依赖

    <dependency>
    <groupId>com.github.simonalong</groupId>
    <artifactId>butterfly-db-allocator</artifactId>
    <!--替换为具体版本号-->
    <version>${last.version.release}</version>
    </dependency>
    

2.建表

对应的库中需要包含如下的表,没有则创建

CREATE TABLE `butterfly_uuid_generator` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `namespace` varchar(128) DEFAULT '' COMMENT '命名空间',
  `work_id` int(16) COMMENT '工作id',
  `last_expire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下次失效时间',
  `uid` varchar(128) DEFAULT '0' COMMENT '本次启动唯一id',
  `ip` varchar(128) NOT NULL DEFAULT '0' COMMENT 'ip',
  `process_id` varchar(128) NOT NULL DEFAULT '0' COMMENT '进程id',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_name_work` (`namespace`,`work_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='发号器表';

3.使用示例

@Test
public void test(){
    DbButterflyConfig config = new DbButterflyConfig();
    config.setUrl("jdbc:mysql://127.0.0.1:3306/neo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&&allowPublicKeyRetrieval=true");
    config.setUserName("neo_test");
    config.setPassword("neo@Test123");

    ButterflyIdGenerator generator = ButterflyIdGenerator.getInstance(config);
    // 设置起始时间,如果不设置,则默认从2020年2月22日开始
    generator.setStartTime(2020, 5, 1, 0, 0, 0);
    // 添加业务空间,如果业务空间不存在,则会注册
    generator.addNamespaces("test1", "test2");
    Long uuid = generator.getUUid("test1");
    System.out.println(uuid);
}

服务端分配workerId

1.服务端启动

服务端和客户端采用dubbo方式进行通讯,下载server包,将如下命令中的dubbo注册中心替换即可启动。

java -jar -Ddubbo.registry.address=127.0.0.1:2181 butterfly-server-1.0.0.jar

2.客户端添加依赖

客户端添加依赖

<dependency>
  <groupId>com.github.simonalong</groupId>
  <artifactId>butterfly-distribute-allocator</artifactId>
  <!--替换为具体版本号-->
  <version>${last.version.release}</version>
</dependency>

3.使用示例使用示例 - dubbo方式获取

首先启动服务端butterfly-server模块,然后客户端这边使用如下即可

@Test
public void test(){
    DistributeDubboButterflyConfig config = new DistributeDubboButterflyConfig();
    config.setZkHoseAndPort("localhost:2181");
    ButterflyIdGenerator generator = ButterflyIdGenerator.getInstance(config);
    // 设置起始时间,如果不设置,则默认从2020年2月22日开始
    generator.setStartTime(2020, 5, 1, 0, 0, 0);

    // 添加业务空间,如果业务空间不存在,则会注册
    generator.addNamespaces("test1", "test2");
    Long uuid = generator.getUUid("test1");
    System.out.println(uuid);
}

4.使用示例 - restful方式获取

首先启动服务端butterfly-server模块,然后客户端这边使用如下即可

@Test
public void test(){
    DistributeRestfulButterflyConfig config = new DistributeRestfulButterflyConfig();
    config.setHostAndPort("localhost:8800");
    ButterflyIdGenerator generator = ButterflyIdGenerator.getInstance(config);
    // 设置起始时间,如果不设置,则默认从2020年2月22日开始
    generator.setStartTime(2020, 5, 1, 0, 0, 0);

    // 添加业务空间,如果业务空间不存在,则会注册
    generator.addNamespaces("test1", "test2");
    Long uuid = generator.getUUid("test1");
    System.out.println(uuid);
}