SpringBoot2.x 集成百度 uidgenerator 轻松搞定全局ID生成器

╰半橙微兮° 2022-11-06 04:00 266阅读 0赞

你知道的越多,不知道的就越多,业余的像一棵小草!

你来,我们一起精进!你不来,我和你的竞争对手一起精进!

编辑:业余草

foxwho.blog.csdn.net/article/details/90200602

推荐:https://www.xttblog.com/?p=5162

最近有网友给我私信,说公司要使用分布式 ID,问我有没有相关实现代码。我这里找了一个,分享给大家!

format_png

分布式 ID 的生成方案有很多,有的还带有管理界面。比如下面这个:

format_png 1

方案虽然有很多,但是这些方案核心思想都很类似,我们采用开源项目最好要有大厂背景,这样出了问题也能也好的被修复。今天推荐的这个源码项目使用的 Java11,并且 Springboot 使用的是 2.x 的版本。这个版本的难点是,根据官方文档和网上其他作者配置的怎么也配置不成功,最后只能自己一步一步升级引入依赖,修改增加接口注入来源,最后成功。

部分升级说明

这里的升级,是升级 官方 代码依赖

官方代码地址:https://github.com/baidu/uid-generator

  • 升级spring boot 版本:2.0.7.RELEASE
  • 升级 mybatis,mybatis-spring 版本
  • 升级 mysql-connector-java 版本:8.0.12
  • 升级 junit 版本

创建数据库存

导入官网数据库SQL

https://github.com/baidu/uid-generator/blob/master/src/main/scripts/WORKER\_NODE.sql

也就是一张表

我这里是在demo库中,创建了这张表

  1. DROP TABLE IF EXISTS WORKER_NODE;
  2. CREATE TABLE WORKER_NODE
  3. (
  4. ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',
  5. HOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name',
  6. PORT VARCHAR(64) NOT NULL COMMENT 'port',
  7. TYPE INT NOT NULL COMMENT 'node type: ACTUAL or CONTAINER',
  8. LAUNCH_DATE DATE NOT NULL COMMENT 'launch date',
  9. MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time',
  10. CREATED TIMESTAMP NOT NULL COMMENT 'created time',
  11. PRIMARY KEY(ID)
  12. )
  13. COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB;

如果报错,基本上是时间问题,因为mysql 低版本控制比较严格,解决方法有多种方式

方式一:

直接把TIMESTAMP改成DATETIME 即可

方式二:

执行SQL 语句前先执行:

  1. set sql_mode="NO_ENGINE_SUBSTITUTION";

mysql 配置信息更改

因为升级到8.x ,配置文件部分也要跟着修改

uid-generator 下,测试文件夹下的资源包uid/mysql.properties

以下修改为

  1. mysql.driver=com.mysql.cj.jdbc.Driver

修改完成后,配置好数据库相关参数,这样单元测试即可执行成功

案例

计划将全局生成唯一ID作为一个服务提供者,供其他微服务使用调用

这里创建了一个项目,项目中包含两个子项目一个是uid-generator官方本身,当然你也可以不需要放到本项目中,直接使用官方的自行打包即可,一个是uid-provider 服务提供者

以下说明的主要是服务提供者

创建 子项目 uid-provider

POM配置文件如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>java-spring-boot-uid-generator-baidu</artifactId>
  7. <groupId>com.foxwho.demo</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>uid-provider</artifactId>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-web</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-test</artifactId>
  20. <scope>test</scope>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.mybatis.spring.boot</groupId>
  24. <artifactId>mybatis-spring-boot-starter</artifactId>
  25. <version>1.3.2</version>
  26. </dependency>
  27. <!--for Mysql-->
  28. <dependency>
  29. <groupId>mysql</groupId>
  30. <artifactId>mysql-connector-java</artifactId>
  31. <scope>runtime</scope>
  32. <version>8.0.12</version>
  33. </dependency>
  34. <!-- druid -->
  35. <dependency>
  36. <groupId>com.alibaba</groupId>
  37. <artifactId>druid-spring-boot-starter</artifactId>
  38. <version>1.1.16</version>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.projectlombok</groupId>
  42. <artifactId>lombok</artifactId>
  43. <version>${lombok.version}</version>
  44. <optional>true</optional>
  45. </dependency>
  46. <dependency>
  47. <groupId>com.foxwho.demo</groupId>
  48. <artifactId>uid-generator</artifactId>
  49. <version>1.0-SNAPSHOT</version>
  50. </dependency>
  51. </dependencies>
  52. </project>

复制 mapper

先在uid-provider项目资源包路径下创建mapper文件夹,然后到官方uid-generator资源包路径下META-INF/mybatis/mapper/WORKER_NODE.xml 复制WORKER_NODE.xml文件,粘贴到该文件夹mapper内

cache id 配置文件

先在uid-provider项目资源包路径下创建uid文件夹,然后到官方uid-generator 测试 [注意:这里是测试资源包] 资源包路径下uid/cached-uid-spring.xml 复制cached-uid-spring.xml文件,粘贴到该文件夹uid内

最后根据需要 配置参数,可以看官方说明

创建 spring boot 启动入口

主要就是加上注解@MapperScan("com.baidu.fsg.uid")让mybatis能扫描到Mapper类的包的路径

  1. package com.foxwho.demo;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.boot.builder.SpringApplicationBuilder;
  5. @SpringBootApplication
  6. @MapperScan("com.baidu.fsg.uid")
  7. public class ConsumerApplication {
  8. public static void main(String[] args) {
  9. new SpringApplicationBuilder(ConsumerApplication.class).run(args);
  10. }
  11. }

创建配置

  1. package com.foxwho.demo.config;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.context.annotation.ImportResource;
  4. @Configuration
  5. @ImportResource(locations = { "classpath:uid/cached-uid-spring.xml" })
  6. public class UidConfig {
  7. }

创建服务接口

  1. package com.foxwho.demo.service;
  2. import com.baidu.fsg.uid.UidGenerator;
  3. import org.springframework.stereotype.Service;
  4. import javax.annotation.Resource;
  5. @Service
  6. public class UidGenService {
  7. @Resource(name = "cachedUidGenerator")
  8. private UidGenerator uidGenerator;
  9. public long getUid() {
  10. return uidGenerator.getUID();
  11. }
  12. }

主要说明一下@Resource(name = “cachedUidGenerator”) 以往错误都是少了这里,没有标明注入来源

控制器

  1. package com.foxwho.demo.controller;
  2. import com.foxwho.demo.service.UidGenService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. public class UidController {
  8. @Autowired
  9. private UidGenService uidGenService;
  10. @GetMapping("/uidGenerator")
  11. public String UidGenerator() {
  12. return String.valueOf(uidGenService.getUid());
  13. }
  14. @GetMapping("/")
  15. public String index() {
  16. return "index";
  17. }
  18. }

项目配置文件

  1. server.port=8080
  2. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
  3. spring.datasource.username=root
  4. spring.datasource.password=root
  5. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  6. mybatis.mapper-locations=classpath:mapper/*.xml
  7. mybatis.configuration.map-underscore-to-camel-case=true

启动项目

从启动入口,启动

访问浏览器

http://localhost:8080/uidGenerator

页面输出

13128615512260612

最后,需要源码的可以加我微信:dart996,免费获取!

发表评论

表情:
评论列表 (有 0 条评论,266人围观)

还没有评论,来说两句吧...

相关阅读

    相关 轻松EasyUI

            最近在学习easyUI,顾名思义easyUI很简单,总结一下我在学习EasyUI的时候是怎么学习的,学习的时候主要从四个方面入手:         ①什么是