
本文内容脑图如下:

文章共 760字,阅读大约需要 2分钟 !
概 述
在前一篇文章 《Spring Boot工程集成全局唯一ID生成器 UidGenerator》 中给大家推荐了一款由百度开发的基于 Snowflake算法实现的全局唯一ID生成器 UidGenerator,而本文则给大家再度推荐一款优秀的全局唯一ID生成器,名叫 Vesta。
Vesta 是艳鹏大佬的开源作品,基于Java开发,其体验地址 在此。Vesta 是一款通用的 ID产生器,互联网俗称统一发号器,其具有几大很具有优势的特性:
- 全局唯一
- 粗略有序
- 可反解
- 可制造
- 分布式
而且支持三种发布模式:
- 嵌入式发布模式
- 中心服务器发布模式
- REST 发布模式
根据业务的性能需求,它可以产生 最大峰值型 和 最小粒度型 两种类型的 ID,它的实现架构使其具有高性能,高可用和可伸缩等互联网产品需要的质量属性,是一款通用的高性能的发号器产品。
本文就在 Spring Boot项目中将 Vesta耍起来!
注: 本文首发于 My Personal Blog:CodeSheep·程序羊,欢迎光临 小站
基础工程搭建
Spring Boot基础工程的搭建我不再赘述,创建好工程后 pom中需要加入如下依赖:
1 <dependency> 2 <groupId>com.robert.vesta</groupId> 3 <artifactId>vesta-service</artifactId> 4 <version>0.0.1</version> 5 </dependency> 6 7 <dependency> 8 <groupId>com.robert.vesta</groupId> 9 <artifactId>vesta-intf</artifactId> 10 <version>0.0.1</version> 11 </dependency>
对应的 Jar包去编译一下 Vesta源码即可获得,源码在此
Vesta 配置导入
- 在项目
resources目录中加入 Vesta的配置文件
引入vesta-rest.properties,配置如下:
1vesta.machine=1021 # 机器ID 2vesta.genMethod=0 # 生成方式,0表示使用嵌入发布模式 3vesta.type=1 # ID类型,1表示最小粒度型
引入 vesta-rest-main.xml,配置如下:
1<?xml version="1.0" encoding="UTF-8"?> 2 3<beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 6 7 <bean 8 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 9 <property name="locations" value="classpath:ext/vesta/vesta-rest.properties"/> 10 </bean> 11 12 <bean id="idService" class="com.robert.vesta.service.factory.IdServiceFactoryBean" 13 init-method="init"> 14 <property name="providerType" value="PROPERTY"/> 15 <property name="type" value="${vesta.type}"/> 16 <property name="genMethod" value="${vesta.genMethod}"/> 17 <property name="machineId" value="${vesta.machine}"/> 18 </bean> 19 20</beans>
好,接下来我们创建一个 Config配置类来将 vesta-rest-main.xml配置文件加载进项目
-
创建 UidConfig配置类
@Configuration @ImportResource( locations = { "classpath:ext/vesta/vesta-rest-main.xml" } ) public class UidConfig { }
编写 Vesta Service
这里面包含的是和 ID生成器相关的几个重要工具接口,主要有:
genId生成全局唯一 ID号explainId反解全局唯一 ID号,得到可以解释 ID号含义的 JSON数据makeId手工制造 ID
来看代码吧
1@Service 2public class UidService { 3 4 @Resource 5 private IdService idService; 6 7 public long genId() { 8 return idService.genId(); 9 } 10 11 public Id explainId( long id ) { 12 return idService.expId(id); 13 } 14 15 public long makeId( long version, long type, long genMethod, long machine, long time, long seq ) { 16 17 long madeId = -1; 18 if (time == -1 || seq == -1) 19 throw new IllegalArgumentException( "Both time and seq are required." ); 20 else if (version == -1) { 21 if (type == -1) { 22 if (genMethod == -1) { 23 if (machine == -1) { 24 madeId = idService.makeId(time, seq); 25 } else { 26 madeId = idService.makeId(machine, time, seq); 27 } 28 } else { 29 madeId = idService.makeId(genMethod, machine, time, seq); 30 } 31 } else { 32 madeId = idService.makeId(type, genMethod, machine, time, seq); 33 } 34 } else { 35 madeId = idService.makeId(version, type, genMethod, time, 36 seq, machine); 37 } 38 39 return madeId; 40 } 41 42}
编写测试 Controller
我们针对上述 UidService中提供的三个工具接口来各自编写一个测试接口:
1@RestController 2public class UidController { 3 4 @Autowired 5 private UidService uidService; 6 7 @RequestMapping("/genid") 8 public long genId() { 9 return uidService.genId(); 10 } 11 12 @RequestMapping("/expid") 13 public Id explainId(@RequestParam(value = "id", defaultValue = "0") long id) { 14 return uidService.explainId( id ); 15 } 16 17 @RequestMapping("/makeid") 18 public long makeId( 19 @RequestParam(value = "version", defaultValue = "-1") long version, 20 @RequestParam(value = "type", defaultValue = "-1") long type, 21 @RequestParam(value = "genMethod", defaultValue = "-1") long genMethod, 22 @RequestParam(value = "machine", defaultValue = "-1") long machine, 23 @RequestParam(value = "time", defaultValue = "-1") long time, 24 @RequestParam(value = "seq", defaultValue = "-1") long seq) { 25 26 return uidService.makeId( version, type, genMethod, machine, time, seq ); 27 } 28}
实验验证
- 实验一
首先我们用浏览器调用接口 genid,来返回生成的全局唯一 ID流水号,一切都是那么的简单优雅:

- 实验二
由于 Vesta生成的全局唯一流水号具有 可反解 的优良特性,因此我们可以先生成一个流水号,然后调用 expid接口来反解出流水号所代表的意义:

后 记
由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!
- My Personal Blog:CodeSheep 程序羊
- 我的半年技术博客之路