该框架中“机器id(workerId)”的分配方式默认有三种方式
1.(单机版)zookeeper分配 2.(单机版)db分配 3.(分布式版)通过服务端分配
不同的分配方式就是不同的用法,依赖也是不同。其中单机版和分布式版也要根据场景来自行选择:
- 单机版:无网络消耗,高可靠性,超高性能(单机可达1200w/s),有workerId上限问题
分布式版:有网络消耗,高可用,高性能(集群单节点可达100w/s),无雪花算法任何问题,但是需要维护服务端
zookeeper分配workerId
1.添加依赖
<dependency><groupId>com.github.simonalong</groupId><artifactId>butterfly-zookeeper-allocator</artifactId><!--替换为具体版本号--><version>${last.version.release}</version></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);
}
