搞定全局ID生成器:SpringBoot2.x 集成百度 uidgenerator
作者:風.foxwho
foxwho.blog.csdn.net/article/details/90200602
https://github.com/foxiswho/java-spring-boot-uid-generator-baidu
部分升級說明
這里的升級,是升級 官方 代碼依賴
官方代碼地址:https://github.com/baidu/uid-generator
升級spring boot 版本:2.0.7.RELEASE 升級 mybatis,mybatis-spring 版本 升級 mysql-connector-java 版本:8.0.12 升級 junit 版本
創(chuàng)建數(shù)據(jù)庫存
導入官網(wǎng)數(shù)據(jù)庫SQL
https://github.com/baidu/uid-generator/blob/master/src/main/scripts/WORKER_NODE.sql
也就是一張表
我這里是在demo庫中,創(chuàng)建了這張表
DROP TABLE IF EXISTS WORKER_NODE;
CREATE TABLE WORKER_NODE
(
ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',
HOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name',
PORT VARCHAR(64) NOT NULL COMMENT 'port',
TYPE INT NOT NULL COMMENT 'node type: ACTUAL or CONTAINER',
LAUNCH_DATE DATE NOT NULL COMMENT 'launch date',
MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time',
CREATED TIMESTAMP NOT NULL COMMENT 'created time',
PRIMARY KEY(ID)
)
COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB;
如果報錯,基本上是時間問題,因為mysql 低版本控制比較嚴格,解決方法有多種方式
方式一:
直接把TIMESTAMP改成DATETIME 即可
方式二:
執(zhí)行SQL 語句前先執(zhí)行:
set sql_mode="NO_ENGINE_SUBSTITUTION";
mysql 配置信息更改
uid-generator 下,測試文件夾下的資源包uid/mysql.properties
mysql.driver=com.mysql.cj.jdbc.Driver
修改完成后,配置好數(shù)據(jù)庫相關(guān)參數(shù),這樣單元測試即可執(zhí)行成功
案例
計劃將全局生成唯一ID作為一個服務提供者,供其他微服務使用調(diào)用
這里創(chuàng)建了一個項目,項目中包含兩個子項目一個是uid-generator官方本身,當然你也可以不需要放到本項目中,直接使用官方的自行打包即可,一個是uid-provider 服務提供者
以下說明的主要是服務提供者
創(chuàng)建 子項目 uid-provider
POM配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>java-spring-boot-uid-generator-baidu</artifactId>
<groupId>com.foxwho.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>uid-provider</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--for Mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.12</version>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.foxwho.demo</groupId>
<artifactId>uid-generator</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
復制 mapper
先在uid-provider項目資源包路徑下創(chuàng)建mapper文件夾,然后到官方uid-generator資源包路徑下META-INF/mybatis/mapper/WORKER_NODE.xml 復制WORKER_NODE.xml文件,粘貼到該文件夾mapper內(nèi)
cache id 配置文件
先在uid-provider項目資源包路徑下創(chuàng)建uid文件夾,然后到官方uid-generator 測試 [注意:這里是測試資源包] 資源包路徑下uid/cached-uid-spring.xml 復制cached-uid-spring.xml文件,粘貼到該文件夾uid內(nèi)
最后根據(jù)需要 配置參數(shù),可以看官方說明
創(chuàng)建 spring boot 啟動入口
主要就是加上注解@MapperScan("com.baidu.fsg.uid")讓mybatis能掃描到Mapper類的包的路徑
package com.foxwho.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication
@MapperScan("com.baidu.fsg.uid")
public class ConsumerApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(ConsumerApplication.class).run(args);
}
}
創(chuàng)建配置
package com.foxwho.demo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource(locations = { "classpath:uid/cached-uid-spring.xml" })
public class UidConfig {
}
創(chuàng)建服務接口
package com.foxwho.demo.service;
import com.baidu.fsg.uid.UidGenerator;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UidGenService {
@Resource(name = "cachedUidGenerator")
private UidGenerator uidGenerator;
public long getUid() {
return uidGenerator.getUID();
}
}
主要說明一下@Resource(name = "cachedUidGenerator") 以往錯誤都是少了這里,沒有標明注入來源
控制器
package com.foxwho.demo.controller;
import com.foxwho.demo.service.UidGenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UidController {
@Autowired
private UidGenService uidGenService;
@GetMapping("/uidGenerator")
public String UidGenerator() {
return String.valueOf(uidGenService.getUid());
}
@GetMapping("/")
public String index() {
return "index";
}
}
項目配置文件
server.port=8080
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.configuration.map-underscore-to-camel-case=true
啟動項目
從啟動入口,啟動
訪問瀏覽器
http://localhost:8080/uidGenerator
頁面輸出
13128615512260612
如有文章對你有幫助,
“在看”和轉(zhuǎn)發(fā)是對我最大的支持!
推薦, GitHub 書籍倉庫 https://github.com/ebooklist/awesome-ebooks-list 整理了大部分常用 技術(shù)書籍PDF,持續(xù)更新中... 你需要的技術(shù)書籍,這里可能都有...
點擊文末“閱讀原文”可直達
整理不易,麻煩各位小伙伴在GitHub中來個Star支持一下

