一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟

詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟

2021-06-08 14:02王 帥 Java教程

本文就在項目中來集成 UidGenerator這一工程來作為項目的全局唯一 ID生成器。接下來通過實例代碼給大家詳解詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟,感興趣的朋友一起看看吧

spring boot中全局唯一流水號id生成器集成實驗

概述

流水號生成器(全局唯一 id生成器)是服務化系統的基礎設施,其在保障系統的正確運行和高可用方面發揮著重要作用。而關于流水號生成算法首屈一指的當屬 snowflake 雪花算法,然而 snowflake本身很難在現實項目中直接使用,因此實際應用時需要一種可落地的方案。

uidgenerator 由百度開發,是java實現的, 基于 snowflake算法的唯一id生成器。uidgenerator以組件形式工作在應用項目中, 支持自定義workerid位數和初始化策略, 從而適用于 docker等虛擬化環境下實例自動重啟、漂移等場景。

本文就在項目中來集成 uidgenerator這一工程來作為項目的全局唯一 id生成器。

本文內容腦圖如下:

詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟

基礎工程創建

只需創建一個 multi-moudule的 maven項目即可,然后我們集成進兩個 module:

  • uid-generator :源碼在此
  • uid-consumer :消費者( 使用uid-generator產生全局唯一的流水號 )

uid-generator 模塊我就不多說了,源碼拿過來即可,無需任何改動;而關于 uid-consumer 模塊,先在 pom.xml中添加相關依賴如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<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.9</version>
  </dependency>
  <!--必須放在最后-->
  <dependency>
    <groupid>cn.codesheep</groupid>
    <artifactid>uid-generator</artifactid>
    <version>1.0</version>
  </dependency>
</dependencies>

然后在 application.properties配置文件中添加一些配置(主要是 mysql和 mybatis配置)

?
1
2
3
4
5
6
7
server.port=9999
spring.datasource.url=jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxx?useunicode=true&characterencoding=utf-8&usessl=false
spring.datasource.username=root
spring.datasource.password=xxx
spring.datasource.driver-class-name=com.mysql.jdbc.driver
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.configuration.map-underscore-to-camel-case=true

完成之后工程縮影如下圖所示:

詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟

下面我們來一步步集成 uidgenerator 的源碼。

數據庫建表

首先去 mysql數據庫中建一個名為 worker_node 的數據表,其 sql如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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;

spring詳細配置

cacheduidgenerator 配置

uidgenerator 有兩個具體的實現類,分別是 defaultuidgenerator 和 cacheduidgenerator ,不過官方也推薦了對于性能比較敏感的項目應使用后者,因此本文也使用 cacheduidgenerator ,而對于 defaultuidgenerator 不做過多闡述。

我們引入 uidgenerator源碼中的 cached-uid-spring.xml 文件,里面都是默認配置,我目前沒有做任何修改

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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-3.1.xsd">
 <!-- uid generator -->
 <bean id="disposableworkeridassigner" class="com.baidu.fsg.uid.worker.disposableworkeridassigner" />
 <bean id="cacheduidgenerator" class="com.baidu.fsg.uid.impl.cacheduidgenerator">
 <property name="workeridassigner" ref="disposableworkeridassigner" />
 <!-- 以下為可選配置, 如未指定將采用默認值 -->
 <!-- ringbuffer size擴容參數, 可提高uid生成的吞吐量. -->
 <!-- 默認:3, 原buffersize=8192, 擴容后buffersize= 8192 << 3 = 65536 -->
 <!--<property name="boostpower" value="3"></property>-->
 
 <!-- 指定何時向ringbuffer中填充uid, 取值為百分比(0, 100), 默認為50 -->
 <!-- 舉例: buffersize=1024, paddingfactor=50 -> threshold=1024 * 50 / 100 = 512. -->
 <!-- 當環上可用uid數量 < 512時, 將自動對ringbuffer進行填充補全 -->
 <!--<property name="paddingfactor" value="50"></property>-->
 
 <!-- 另外一種ringbuffer填充時機, 在schedule線程中, 周期性檢查填充 -->
 <!-- 默認:不配置此項, 即不實用schedule線程. 如需使用, 請指定schedule線程時間間隔, 單位:秒 -->
 <!--<property name="scheduleinterval" value="60"></property>-->
 
 <!-- 拒絕策略: 當環已滿, 無法繼續填充時 -->
 <!-- 默認無需指定, 將丟棄put操作, 僅日志記錄. 如有特殊需求, 請實現rejectedputbufferhandler接口(支持lambda表達式) -->
 <!--<property name="rejectedputbufferhandler" ref="xxxxyourputrejectpolicy"></property>-->
 
 <!-- 拒絕策略: 當環已空, 無法繼續獲取時 -->
 <!-- 默認無需指定, 將記錄日志, 并拋出uidgenerateexception異常. 如有特殊需求, 請實現rejectedtakebufferhandler接口(支持lambda表達式) -->
 <!--<property name="rejectedputbufferhandler" ref="xxxxyourputrejectpolicy"></property>-->
 
 </bean>
</beans>

mybatis mapper xml 配置

即原樣引入 uidgenerator源碼中關于工作節點(worker node)操作的 mapper xml 文件: worker_node.xml ,其內容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="utf-8"?>
<!doctype mapper public "-//mybatis.org//dtd mapper 3.0//en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baidu.fsg.uid.worker.dao.workernodedao">
 <resultmap id="workernoderes"
   type="com.baidu.fsg.uid.worker.entity.workernodeentity">
 <id column="id" jdbctype="bigint" property="id" />
 <result column="host_name" jdbctype="varchar" property="hostname" />
 <result column="port" jdbctype="varchar" property="port" />
 <result column="type" jdbctype="integer" property="type" />
 <result column="launch_date" jdbctype="date" property="launchdate" />
 <result column="modified" jdbctype="timestamp" property="modified" />
 <result column="created" jdbctype="timestamp" property="created" />
 </resultmap>
 <insert id="addworkernode" usegeneratedkeys="true" keyproperty="id"
 parametertype="com.baidu.fsg.uid.worker.entity.workernodeentity">
 insert into worker_node
 (host_name,
 port,
 type,
 launch_date,
 modified,
 created)
 values (
 #{hostname},
 #{port},
 #{type},
 #{launchdate},
 now(),
 now())
 </insert>
 <select id="getworkernodebyhostport" resultmap="workernoderes">
 select
 id,
 host_name,
 port,
 type,
 launch_date,
 modified,
 created
 from
 worker_node
 where
 host_name = #{host} and port = #{port}
 </select>
</mapper>

編寫業務代碼

config 類創建與配置

新建 uidconfig 類,為我們引入上文的 cached-uid-spring.xml 配置

?
1
2
3
4
@configuration
@importresource(locations = { "classpath:uid/cached-uid-spring.xml" })
public class uidconfig {
}

service 類創建與配置

新建 uidgenservice ,引入 uidgenerator 生成 uid的業務接口

?
1
2
3
4
5
6
7
8
9
10
@service
public class uidgenservice {
 
  @resource
  private uidgenerator uidgenerator;
 
  public long getuid() {
    return uidgenerator.getuid();
  }
}

controller 創建與配置

新建 uidtestcontroller ,目的是方便我們用瀏覽器測試接口并觀察效果:

?
1
2
3
4
5
6
7
8
9
10
11
@restcontroller
public class uidtestcontroller {
 
  @autowired
  private uidgenservice uidgenservice;
 
  @getmapping("/testuid")
  public string test() {
    return string.valueof( uidgenservice.getuid() );
  }
}

實驗測試

我們每啟動一次 spring boot工程,其即會自動去 mysql數據的 worker_node 表中插入一行關于工作節點的記錄,類似下圖所示:

詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟

接下來我們瀏覽器訪問:http://localhost:9999/testuid

詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟

ok,全局唯一流水號id已經成功生成并返回!

總結

以上所述是小編給大家介紹的spring boot工程集成全局唯一id生成器 uidgenerator,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://www.codesheep.cn/2018/10/24/springbt-uid-generator/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品色图 | 男人躁女人p | 青草悠悠视频在线观看 | 亚洲高清国产拍精品动图 | 免费一级特黄特色大片在线 | 亚欧成人中文字幕一区 | 欧美xingai| 免费人成在线观看69式小视频 | 国产女乱淫真高清免费视频 | 色噜噜狠狠色综合 | 亚洲成在人网站天堂一区二区 | 女教师巨大乳孔中文字幕免费 | 女人张开腿让男人做爽爽 | 楚乔传第二部免费完整 | 天天射寡妇射 | 女同变态 中文字幕 | 国产成人综合久久 | 日本视频二区 | 好妈妈7在线观看高清 | 青青操在线 | 王王的视频ivk | 99视频久久精品久久 | 98在线视频噜噜噜国产 | 荷兰精品女人性hd | 亚洲成av人影院 | 91短视频版高清在线观看免费 | 91在线精品国产丝袜超清 | 2048论坛永久入口 原创合集 | zoomkool最新版 | 亚洲激情久久 | 国产精品一二三 | 亚洲精品日韩专区在线观看 | coolgay男男gayxxx chinese壮直男gay老年人 chinese野外gay军人 | 114毛片免费观看网站 | 无码AV精品一区二区三区 | 日本在线观看视频 | 国产丰满美女做爰 | 欧美四级无删版影片 | 天天色天天综合 | 亚州性夜夜射在线观看 | 国产一区二区精品久久91 |