当前位置:   article > 正文

Spring Cloud Alibaba 工程集成全局唯一ID生成器 Vesta_vesta-service

vesta-service

官网简介:

 

        Vesta是一款通用的ID产生器,互联网俗称统一发号器,它支持三种发布模式:嵌入发布模式、中心服务器发布模式、REST发布模式,根据业务的性能需求,它可以产生最大峰值型和最小粒度型两种类型的ID,它的实现架构使其具有高性能,高可用和可伸缩等互联网产品需要的质量属性,是一款通用的高性能的发号器产品。

特性:

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

本章项目实战环境:

Spring Cloud Alibaba 模块化开发,vesta配置在公用模块sm-common,基于业务场景自行定义;

  1. 大部分模块场景下需要用到,则配置在公共模块引入;
  2. 部分模块用到可在模块内引入即可;

Vesta的jar包以及配置文件下载:https://download.csdn.net/download/u011673769/33155559

项目实战

项目架构

sm-commodity:商品模块,只涉及商品相关业务需求;

sm-common:公用模块,主要存公用配置信息,以及工具类等;

sm-gateway:网关模块,所有模块的统一入口;

在sm-common根目录下创建lib文件夹,并导入vesta相关jar包,如下图 

在sm-common的pom.xml中引入vesta的依赖:

  1. <!-- 引入本地jar包-->
  2. <dependency>
  3. <groupId>vesta.intf</groupId>
  4. <artifactId>vesta-intf</artifactId>
  5. <version>1.0.0</version>
  6. <scope>system</scope>
  7. <systemPath>${project.basedir}/lib/vesta-intf.jar</systemPath>
  8. </dependency>
  9. <dependency>
  10. <groupId>vesta.service</groupId>
  11. <artifactId>vesta-service</artifactId>
  12. <version>1.0.0</version>
  13. <scope>system</scope>
  14. <systemPath>${project.basedir}/lib/vesta-service.jar</systemPath>
  15. </dependency>

在sm-common的resource下导入vesta的配置文件,如下

vesta-rest.properties

  1. # 机器ID
  2. vesta.machine=1021
  3. ## 生成方式,0表示 嵌入发布模式 1表示 中心服务器发布模式 2表示 REST发 布模式
  4. vesta.genMethod=0
  5. # # ID类型,1表示最小粒度型 0表示最大峰值
  6. vesta.type=1

 vesta-rest-main.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
  5. <bean
  6. class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  7. <property name="locations" value="classpath:/vesta/vesta-rest.properties"/>
  8. </bean>
  9. <bean id="idService" class="com.robert.vesta.service.factory.IdServiceFactoryBean"
  10. init-method="init">
  11. <property name="providerType" value="PROPERTY"/>
  12. <property name="type" value="${vesta.type}"/>
  13. <property name="genMethod" value="${vesta.genMethod}"/>
  14. <property name="machineId" value="${vesta.machine}"/>
  15. </bean>
  16. </beans>

创建类 UidService.java

  1. package net.sm.util;
  2. import com.robert.vesta.service.bean.Id;
  3. import com.robert.vesta.service.intf.IdService;
  4. import org.checkerframework.common.reflection.qual.ForName;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7. import org.springframework.stereotype.Component;
  8. import org.springframework.stereotype.Service;
  9. import javax.annotation.Resource;
  10. import java.util.Date;
  11. /**
  12. * <p>Title: UidService</p>
  13. * <p>Description: 统一发号器,它具有全局唯一、粗略有序、可反解和可制造等特性</p>
  14. * 三种发布模式:嵌入发布模式、中心服务器发布模式、REST发布模式
  15. * @author GaoYanJia
  16. */
  17. @Service("MyUidService")
  18. public class UidService {
  19. private final IdService idService;
  20. public UidService() {
  21. //重要,这个路径必须指定你存放 vesta-rest-main.xml 的路径
  22. ApplicationContext ac = new ClassPathXmlApplicationContext(
  23. "vesta/vesta-rest-main.xml");
  24. idService = (IdService) ac.getBean("idService");
  25. }
  26. public long genId() {
  27. return idService.genId();
  28. }
  29. public String genIdString() {
  30. return idService.genId()+"";
  31. }
  32. public Id explainId(long id) {
  33. return idService.expId(id);
  34. }
  35. public Date transTime(long time) {
  36. return idService.transTime(time);
  37. }
  38. public long makeId(long version, long type, long genMethod, long machine, long time, long seq) {
  39. long madeId = -1;
  40. if (time == -1 || seq == -1)
  41. throw new IllegalArgumentException("Both time and seq are required.");
  42. else if (version == -1) {
  43. if (type == -1) {
  44. if (genMethod == -1) {
  45. if (machine == -1) {
  46. madeId = idService.makeId(time, seq);
  47. } else {
  48. madeId = idService.makeId(machine, time, seq);
  49. }
  50. } else {
  51. madeId = idService.makeId(genMethod, machine, time, seq);
  52. }
  53. } else {
  54. madeId = idService.makeId(type, genMethod, machine, time, seq);
  55. }
  56. } else {
  57. madeId = idService.makeId(version, type, genMethod, time, seq, machine);
  58. }
  59. return madeId;
  60. }
  61. }

API使用说明:

  • genId 生成全局唯一 ID号
  • explainId 反解全局唯一 ID号,得到可以解释 ID号含义的 JSON数据
  • makeId 手工制造 ID
  • transTime对产生的日期反解

新建一个测试的Controller,并引入UidService

  1. package net.sm.controller;
  2. import com.alibaba.fastjson.JSONObject;
  3. import net.sm.util.UidService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.*;
  6. /**
  7. * @Author GGYYJJ
  8. * @Date 2021/9/29 17:48
  9. * @Version 1.0
  10. * @Title
  11. * @Desc
  12. */
  13. @RestController
  14. @RequestMapping("/api/commodity/v1/")
  15. public class CommodityController {
  16. @Autowired
  17. private UidService myUidService;
  18. /**
  19. 测试 Vesta API功能
  20. **/
  21. @PostMapping("/test")
  22. public JSONObject test(){
  23. long uid = myUidService.genId();
  24. System.out.println("获取唯一id"+uid);
  25. Id config = myUidService.explainId(uid);
  26. System.out.println("解码,获取uid内配置信息:"+config);
  27. Date date = myUidService.transTime(config.getTime());
  28. System.out.println("解码后,将date转为时间:"+date);
  29. }
  30. }

控制台输入如下,配置成功;

 

以下是配置过程中遇到的问题:

  1. UidService.java 必须用@Service("MyUidService")取别名的方式注入到spring中;
  2. pom.xml 本地的方式引入jar包,必须加  <scope>system</scope>  否则在打包项目的时候,本地的vesta的jar不会打包进入项目内;项目能成功编译通过,但是发布时候会报错,报错  com.robert.vesta.service.intf.IdService  找不到;

至此,Spring Cloud Alibaba 引入Vesta结束,有帮助的朋友点个赞,关注下。后续还有更多项目实战文章;小编初期写文章,谢谢支持。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/757186
推荐阅读
相关标签
  

闽ICP备14008679号