Spring Boot 工程集成全局唯一ID生成器 Vesta

news/2024/7/3 14:31:18

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

AE-86

本文内容脑图如下:

本文内容脑图

文章共 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中需要加入如下依赖:

        <dependency><groupId>com.robert.vesta</groupId><artifactId>vesta-service</artifactId><version>0.0.1</version></dependency><dependency><groupId>com.robert.vesta</groupId><artifactId>vesta-intf</artifactId><version>0.0.1</version></dependency>

对应的 Jar包去编译一下 Vesta源码即可获得,源码在此


Vesta 配置导入

  • 在项目resources目录中加入 Vesta的配置文件

引入vesta-rest.properties,配置如下:

vesta.machine=1021  # 机器ID
vesta.genMethod=0   # 生成方式,0表示使用嵌入发布模式
vesta.type=1        # ID类型,1表示最小粒度型

引入 vesta-rest-main.xml,配置如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations" value="classpath:ext/vesta/vesta-rest.properties"/></bean><bean id="idService" class="com.robert.vesta.service.factory.IdServiceFactoryBean"init-method="init"><property name="providerType" value="PROPERTY"/><property name="type" value="${vesta.type}"/><property name="genMethod" value="${vesta.genMethod}"/><property name="machineId" value="${vesta.machine}"/></bean></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

来看代码吧

@Service
public class UidService {@Resourceprivate IdService idService;public long genId() {return idService.genId();}public Id explainId( long id ) {return idService.expId(id);}public long makeId( long version, long type, long genMethod, long machine, long time, long seq ) {long madeId = -1;if (time == -1 || seq == -1)throw new IllegalArgumentException( "Both time and seq are required." );else if (version == -1) {if (type == -1) {if (genMethod == -1) {if (machine == -1) {madeId = idService.makeId(time, seq);} else {madeId = idService.makeId(machine, time, seq);}} else {madeId = idService.makeId(genMethod, machine, time, seq);}} else {madeId = idService.makeId(type, genMethod, machine, time, seq);}} else {madeId = idService.makeId(version, type, genMethod, time,seq, machine);}return madeId;}}

编写测试 Controller

我们针对上述 UidService中提供的三个工具接口来各自编写一个测试接口:

@RestController
public class UidController {@Autowiredprivate UidService uidService;@RequestMapping("/genid")public long genId() {return uidService.genId();}@RequestMapping("/expid")public Id explainId(@RequestParam(value = "id", defaultValue = "0") long id) {return uidService.explainId( id );}@RequestMapping("/makeid")public long makeId(@RequestParam(value = "version", defaultValue = "-1") long version,@RequestParam(value = "type", defaultValue = "-1") long type,@RequestParam(value = "genMethod", defaultValue = "-1") long genMethod,@RequestParam(value = "machine", defaultValue = "-1") long machine,@RequestParam(value = "time", defaultValue = "-1") long time,@RequestParam(value = "seq", defaultValue = "-1") long seq) {return uidService.makeId( version, type, genMethod, machine, time, seq );}
}

实验验证

  • 实验一

首先我们用浏览器调用接口 genid,来返回生成的全局唯一 ID流水号,一切都是那么的简单优雅:

生成全局唯一流水号

  • 实验二

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

全局唯一流水号的反解效果


后 记

由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!

  • My Personal Blog:CodeSheep 程序羊
  • 我的半年技术博客之路


转载于:https://my.oschina.net/hansonwang99/blog/2906778


http://lihuaxi.xjx100.cn/news/236753.html

相关文章

区块链3.0:拥抱EOS

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 EOS是当下最火的区块链技术&#xff0c;被社会广泛看好为下一代区块链3.0。不同于以太坊的学习&#xff0c;EOS的主语言是C&#xff0c;本文作为EO…

jQuery中的 $.ajax的一些方法

1. $(document).ajaxConplete(function(){}) 1.8版本之后&#xff0c;只能绑定到document元素上&#xff1b;1.8版本之前&#xff0c;可以帮到其他元素上 当$.ajax执行完成之后&#xff0c;执行该函数。如果有多个$.ajax请求&#xff0c;就会执行多次&#xff1b;如果有两个或多…

【Luogu】P1613 跑路

【Luogu】P1613 跑路 一、题目 题目描述 小A的工作不仅繁琐&#xff0c;更有苛刻的规定&#xff0c;要求小A每天早上在6&#xff1a;00之前到达公司&#xff0c;否则这个月工资清零。可是小A偏偏又有赖床的坏毛病。于是为了保住自己的工资&#xff0c;小A买了一个十分牛B的空间…

EOSIO Dawn 4.0 发布

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 关于Dawn 4.0 RAM分配的反馈 一些社区成员表示担心&#xff0c;在其他任何人发现之前&#xff0c;有些人会通过购买便宜的内存来获得不合理的利润。…

自定义状态切换按钮

最近在做一个项目&#xff0c;一个界面的按钮UI给画成了这样&#xff08;默认状态是蓝色的然后触摸后变成灰色的&#xff09; UI效果然后本着给低版本系统APP适配的职业素养&#xff08;其实是不想画这种按钮&#xff09;&#xff0c;想让UI兄弟给将图标改成整个按钮效果的图片…

EOS Cleos 命令使用指南

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 命令参考 操作 语法 例子 获取所有命令 $ cleos 例子 获取所有子命令 $ cleos ${command} 例子 链接节点 $ cleos --url node:{node}:no…

[USACO07JAN]平衡的阵容Balanced Lineup BZOJ 1699

题目背景 题目描述&#xff1a; 每天,农夫 John 的N(1 < N < 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛. 但是为了避免水平悬殊,牛的身高不应该相差太大. John 准备了Q (1 < Q < 18…

Java基础知识回顾之六 ----- IO流

前言 在上一篇文章中&#xff0c;回顾了Java的多线程。而在本篇文章中主要介绍Java IO的相关知识。 IO的介绍 什么是IO&#xff1f; IO的名称又来是Input与Output的缩写&#xff0c;也就是输入流和输出流。输入流用于从源读取数据&#xff0c;输出流用于向目标写数据。 可以从下…