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

AE-86

本文內(nèi)容腦圖如下:

本文內(nèi)容腦圖

文章共 760字鹰椒,閱讀大約需要 2分鐘 !


概 述

在前一篇文章 《Spring Boot工程集成全局唯一ID生成器 UidGenerator》 中給大家推薦了一款由百度開(kāi)發(fā)的基于 Snowflake算法實(shí)現(xiàn)的全局唯一ID生成器 UidGenerator疚沐,而本文則給大家再度推薦一款優(yōu)秀的全局唯一ID生成器摸恍,名叫 Vesta吱型。

Vesta 是艷鵬大佬的開(kāi)源作品,基于Java開(kāi)發(fā)园骆,其體驗(yàn)地址 在此舔痪。Vesta 是一款通用的 ID產(chǎn)生器,互聯(lián)網(wǎng)俗稱(chēng)統(tǒng)一發(fā)號(hào)器锌唾,其具有幾大很具有優(yōu)勢(shì)的特性:

  • 全局唯一
  • 粗略有序
  • 可反解
  • 可制造
  • 分布式

而且支持三種發(fā)布模式:

  • 嵌入式發(fā)布模式
  • 中心服務(wù)器發(fā)布模式
  • REST 發(fā)布模式

根據(jù)業(yè)務(wù)的性能需求锄码,它可以產(chǎn)生 最大峰值型最小粒度型 兩種類(lèi)型的 ID,它的實(shí)現(xiàn)架構(gòu)使其具有高性能晌涕,高可用和可伸縮等互聯(lián)網(wǎng)產(chǎn)品需要的質(zhì)量屬性滋捶,是一款通用的高性能的發(fā)號(hào)器產(chǎn)品。

本文就在 Spring Boot項(xiàng)目中將 Vesta耍起來(lái)渐排!

注: 本文首發(fā)于 My Personal Blog:CodeSheep·程序羊炬太,歡迎光臨 小站


基礎(chǔ)工程搭建

Spring Boot基礎(chǔ)工程的搭建我不再贅述,創(chuàng)建好工程后 pom中需要加入如下依賴(lài):

        <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>

對(duì)應(yīng)的 Jar包去編譯一下 Vesta源碼即可獲得驯耻,源碼在此


Vesta 配置導(dǎo)入

  • 在項(xiàng)目resources目錄中加入 Vesta的配置文件

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

vesta.machine=1021  # 機(jī)器ID
vesta.genMethod=0   # 生成方式炒考,0表示使用嵌入發(fā)布模式
vesta.type=1        # ID類(lèi)型,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">

  <bean
    class="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>

好斋枢,接下來(lái)我們創(chuàng)建一個(gè) Config配置類(lèi)來(lái)將 vesta-rest-main.xml配置文件加載進(jìn)項(xiàng)目

  • 創(chuàng)建 UidConfig配置類(lèi)
@Configuration
@ImportResource( locations = { "classpath:ext/vesta/vesta-rest-main.xml" } )
public class UidConfig {
}

編寫(xiě) Vesta Service

這里面包含的是和 ID生成器相關(guān)的幾個(gè)重要工具接口,主要有:

  • genId 生成全局唯一 ID號(hào)
  • explainId 反解全局唯一 ID號(hào)知给,得到可以解釋 ID號(hào)含義的 JSON數(shù)據(jù)
  • makeId 手工制造 ID

來(lái)看代碼吧

@Service
public class UidService {

    @Resource
    private 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;
    }

}

編寫(xiě)測(cè)試 Controller

我們針對(duì)上述 UidService中提供的三個(gè)工具接口來(lái)各自編寫(xiě)一個(gè)測(cè)試接口:

@RestController
public class UidController {

    @Autowired
    private 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 );
    }
}

實(shí)驗(yàn)驗(yàn)證

  • 實(shí)驗(yàn)一

首先我們用瀏覽器調(diào)用接口 genid瓤帚,來(lái)返回生成的全局唯一 ID流水號(hào),一切都是那么的簡(jiǎn)單優(yōu)雅:

生成全局唯一流水號(hào)
  • 實(shí)驗(yàn)二

由于 Vesta生成的全局唯一流水號(hào)具有 可反解 的優(yōu)良特性涩赢,因此我們可以先生成一個(gè)流水號(hào)戈次,然后調(diào)用 expid接口來(lái)反解出流水號(hào)所代表的意義:

全局唯一流水號(hào)的反解效果

后 記

由于能力有限,若有錯(cuò)誤或者不當(dāng)之處筒扒,還請(qǐng)大家批評(píng)指正怯邪,一起學(xué)習(xí)交流!



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末花墩,一起剝皮案震驚了整個(gè)濱河市悬秉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冰蘑,老刑警劉巖和泌,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異祠肥,居然都是意外死亡武氓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)仇箱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)聋丝,“玉大人,你說(shuō)我怎么就攤上這事工碾∪跄溃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵渊额,是天一觀的道長(zhǎng)况木。 經(jīng)常有香客問(wèn)我,道長(zhǎng)旬迹,這世上最難降的妖魔是什么火惊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮奔垦,結(jié)果婚禮上屹耐,老公的妹妹穿的比我還像新娘。我一直安慰自己椿猎,他們只是感情好惶岭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布寿弱。 她就那樣靜靜地躺著,像睡著了一般按灶。 火紅的嫁衣襯著肌膚如雪症革。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天鸯旁,我揣著相機(jī)與錄音噪矛,去河邊找鬼。 笑死铺罢,一個(gè)胖子當(dāng)著我的面吹牛艇挨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播韭赘,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼雷袋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了辞居?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛋勺,失蹤者是張志新(化名)和其女友劉穎瓦灶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體抱完,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贼陶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巧娱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碉怔。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖禁添,靈堂內(nèi)的尸體忽然破棺而出撮胧,到底是詐尸還是另有隱情,我是刑警寧澤老翘,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布芹啥,位于F島的核電站,受9級(jí)特大地震影響铺峭,放射性物質(zhì)發(fā)生泄漏墓怀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一卫键、第九天 我趴在偏房一處隱蔽的房頂上張望傀履。 院中可真熱鬧,春花似錦莉炉、人聲如沸钓账。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)官扣。三九已至翅敌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惕蹄,已是汗流浹背蚯涮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卖陵,地道東北人遭顶。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像泪蔫,于是被迫代替她去往敵國(guó)和親棒旗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354