概 述
流水号生成器(全局唯一 ID生成器)是服务化系统的基础设施,其在保障系统的正确运行和高可用方面发挥着重要作用。而关于流水号生成算法首屈一指的当属 Snowflake雪花算法,然而 Snowflake本身很难在现实项目中直接使用,因此实际应用时需要一种可落地的方案。
UidGenerator 由百度开发,是Java实现的, 基于 Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 从而适用于 docker等虚拟化环境下实例自动重启、漂移等场景。
本文就在项目中来集成 UidGenerator这一工程来作为项目的全局唯一 ID生成器。
本文内容脑图如下:
基础工程创建
只需创建一个 Multi-Moudule的 Maven项目即可,然后我们集成进两个 Module:
uid-generator:github.com/baidu/uid-generator
uid-consumer:消费者( 使用uid-generator产生全局唯一的流水号 )
uid-generator模块我就不多说了,源码拿过来即可,无需任何改动;而关于 uid-consumer模块,先在 pom.xml中添加相关依赖如下:
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.2 mysql mysql-connector-java runtime 8.0.12 com.alibaba druid-spring-boot-starter 1.1.9 cn.codesheep uid-generator 1.0然后在 application.properties配置文件中添加一些配置(主要是 MySQL和 MyBatis配置)
9999
jdbc
:
mysql
:
//xxx.xxx.xxx.xxx:3306/xxx?useUnicode=true&characterEncoding=utf-8&useSSL=false
root
xxx
com
.
mysql
.
jdbc
.
Driver
classpath
:
mapper
/*.xml
mybatis.configuration.map-underscore-to-camel-case=true
下面我们来一步步集成 UidGenerator的源码。
数据库建表
首先去 MySQL数据库中建一个名为 WORKER_NODE的数据表,其 sql如下:
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
)
)
INNODB
;
Spring详细配置
CachedUidGenerator 配置
UidGenerator 有两个具体的实现类,分别是 DefaultUidGenerator 和 CachedUidGenerator,不过官方也推荐了对于性能比较敏感的项目应使用后者,因此本文也使用 CachedUidGenerator,而对于 DefaultUidGenerator不做过多阐述。
我们引入 UidGenerator源码中的 cached-uid-spring.xml文件,里面都是默认配置,我目前没有做任何修改
“UTF-8”
?>
“http://www.springframework.org/schema/beans” “http://www.w3.org/2001/XMLSchema-instance” " “disposableWorkerIdAssigner” “com.baidu.fsg.uid.worker.DisposableWorkerIdAssigner” /> “cachedUidGenerator” “com.baidu.fsg.uid.impl.CachedUidGenerator” “workerIdAssigner” “disposableWorkerIdAssigner” /> Mybatis Mapper XML 配置 即原样引入 UidGenerator源码中关于工作节点(Worker Node)操作的 mapper xml 文件: WORKER_NODE.xml,其内容如下: “UTF-8” “com.baidu.fsg.uid.worker.dao.WorkerNodeDAO” “workerNodeRes” “com.baidu.fsg.uid.worker.entity.WorkerNodeEntity” “ID” “BIGINT” “id” /> “HOST_NAME” “VARCHAR” “hostName” /> “PORT” “VARCHAR” “port” /> “TYPE” “INTEGER” “type” /> “LAUNCH_DATE” “DATE” “launchDate” /> “MODIFIED” “TIMESTAMP” “modified” /> “CREATED” “TIMESTAMP” “created” /> “addWorkerNode” “true” “id” “com.baidu.fsg.uid.worker.entity.WorkerNodeEntity”xmlns
xmlns:xsi
xsi:schemaLocation
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"
id
class
id
class
name
ref
xml version“1.0”
encoding
?>namespace
id
type
column
jdbcType
property
column
jdbcType
property
column
jdbcType
property
column
jdbcType
property
column
jdbcType
property
column
jdbcType
property
column
jdbcType
property
id
useGeneratedKeys
keyProperty
parameterType
INSERT INTO WORKER_NODE
(HOST_NAME,
PORT,
TYPE,
LAUNCH_DATE,
MODIFIED,
CREATED)
VALUES (
#{hostName},
#{port},
#{type},
#{launchDate},
NOW(),
NOW())