- 浏览: 2203335 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1240)
- mac/IOS (287)
- flutter (1)
- J2EE (115)
- android基础知识 (582)
- android中级知识 (55)
- android组件(Widget)开发 (18)
- android 错误 (21)
- javascript (18)
- linux (70)
- 树莓派 (18)
- gwt/gxt (1)
- 工具(IDE)/包(jar) (18)
- web前端 (17)
- java 算法 (8)
- 其它 (5)
- chrome (7)
- 数据库 (8)
- 经济/金融 (0)
- english (2)
- HTML5 (7)
- 网络安全 (14)
- 设计欣赏/设计窗 (8)
- 汇编/C (8)
- 工具类 (4)
- 游戏 (5)
- 开发频道 (5)
- Android OpenGL (1)
- 科学 (4)
- 运维 (0)
- 好东西 (6)
- 美食 (1)
最新评论
-
liangzai_cool:
请教一下,文中,shell、C、Python三种方式控制led ...
树莓派 - MAX7219 -
jiazimo:
...
Kafka源码分析-序列5 -Producer -RecordAccumulator队列分析 -
hp321:
Windows该命令是不是需要安装什么软件才可以?我试过不行( ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
hp321:
Chenzh_758 写道其实直接用一下代码就可以解决了:JP ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
huanghonhpeng:
大哥你真强什么都会,研究研究。。。。小弟在这里学到了很多知识。 ...
android 浏览器
概述
流水号生成器(全局唯一 ID生成器)是服务化系统的基础设施,其在保障系统的正确运行和高可用方面发挥着重要作用。而关于流水号生成算法首屈一指的当属 Snowflake雪花算法,然而 Snowflake本身很难在现实项目中直接使用,因此实际应用时需要一种可落地的方案。
UidGenerator 由百度开发,是Java实现的, 基于 Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 从而适用于 docker等虚拟化环境下实例自动重启、漂移等场景。
本文就在项目中来集成 UidGenerator这一工程来作为项目的全局唯一 ID生成器。
本文内容脑图如下:
基础工程创建
只需创建一个 Multi-Moudule的 Maven项目即可,然后我们集成进两个 Module:
uid-generator:源码在此
uid-consumer:消费者( 使用uid-generator产生全局唯一的流水号 )
uid-generator模块我就不多说了,源码拿过来即可,无需任何改动;而关于 uid-consumer模块,先在 pom.xml中添加相关依赖如下:
<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配置)
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
完成之后工程缩影如下图所示:
下面我们来一步步集成 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) ) COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB;
Spring详细配置
CachedUidGenerator 配置
引用
UidGenerator 有两个具体的实现类,分别是 DefaultUidGenerator 和 CachedUidGenerator,不过官方也推荐了对于性能比较敏感的项目应使用后者,因此本文也使用 CachedUidGenerator,而对于 DefaultUidGenerator不做过多阐述。
我们引入 UidGenerator源码中的 cached-uid-spring.xml文件,里面都是默认配置,我目前没有做任何修改
<?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,其内容如下:
<?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配置
@Configuration @ImportResource(locations = { "classpath:uid/cached-uid-spring.xml" }) public class UidConfig { }
service 类创建与配置
新建 UidGenService,引入 UidGenerator 生成 UID的业务接口
@Service public class UidGenService { @Resource private UidGenerator uidGenerator; public long getUid() { return uidGenerator.getUID(); } }
controller 创建与配置
新建 UidTestController,目的是方便我们用浏览器测试接口并观察效果:
@RestController public class UidTestController { @Autowired private UidGenService uidGenService; @GetMapping("/testuid") public String test() { return String.valueOf( uidGenService.getUid() ); } }
实验测试
我们每启动一次 Spring Boot工程,其即会自动去 MySQL数据的 WORKER_NODE表中插入一行关于工作节点的记录,类似下图所示:
接下来我们浏览器访问:http://localhost:9999/testuid
OK,全局唯一流水号ID已经成功生成并返回!
发表评论
-
小程序textarea完美填坑
2020-07-07 16:09 529相信做微信小程序的码友们都被textarea这个原生组件坑过 ... -
Nginx+Https自己敲命令生成证书
2020-05-18 09:35 955一、准备 环境:centos6.8 ... -
https证书生成环境搭建配置(基于Tomcat和Nginx)
2020-04-24 11:06 828一、基于Tomcat、JDK内置密钥工具: 1、生成服务端证 ... -
史上最强Tomcat8性能优化
2019-11-01 21:41 909授人以鱼不如授人以渔 ... -
SpringBoot配置HTTPS,并实现HTTP访问自动转HTTPS访问
2019-10-07 09:13 5651.使用jdk自带的 keytools 创建证书 打开cmd ... -
CentOS7下Redis的安装与使用
2019-08-17 11:45 612一、手动安装过程 1、准备工作(安装gcc依赖) yum ... -
Nginx与tomcat组合的简单使用
2019-08-17 10:05 443配置tomcat跳转 请求http出现400的时候在这里配置 ... -
linux下lvs+keepalived安装配置
2019-07-10 14:20 466keepalived主机:192.168.174. ... -
使用Docker搭建Tomcat运行环境
2019-02-08 21:32 4941 准备宿主系统 准备一 ... -
Netty笔记-GlobalEventExecutor
2019-02-06 23:00 6431.概念 /** * Single-thread si ... -
Netty4转发服务的实现方案
2019-02-06 15:03 1146如果用Netty做转发服务(不需要同步应答),Netty中有一 ... -
java手机号归属地查询
2018-12-25 17:16 749所需的包:carrier-1.75.jar 、geocoder ... -
基于Netty4的HttpServer和HttpClient的简单实现
2018-10-17 20:02 700Http 消息格式: Http request: Met ... -
javafx : 支持使用微调(spinner)控制的数字的文本框(NemberTextField)
2018-10-16 00:00 1099最近花了一些时间学习javaFX, 要更深入地理解新GUI包, ... -
我的Java(定制你的Java/JavaFX Runtime)
2018-10-12 23:29 681最新的JDK 11发布了,撒花 新版本的JDK终于有了ope ... -
javaFX的几个新特性,让swing彻底过时
2018-10-12 22:42 669首先声明,Java的GUI曾经 ... -
mac os系统用install4j把jar包生成app
2018-10-05 23:02 1440install4j有windows版也有mac版 mac电脑 ... -
JavaFX Alert对话框
2018-10-05 22:01 23801. 标准对话框 消息对话框 Alert alert = ... -
IDEA Properties中文unicode转码问题
2017-02-17 19:54 1051摘要: 如何让IDEA的properties中的中文进行uni ... -
spring 3中新增的@value注解
2016-11-01 09:32 643在spring 3.0中,可以通过使用@value,对一些如x ...
相关推荐
通过以上步骤,我们可以在SpringBoot项目中成功地集成Vesta ID Generator,为分布式系统提供稳定、高效的全局唯一ID生成方案。在高并发环境下,Vesta的优秀性能和易用性将为系统的可靠性和扩展性带来显著提升。
项目可能采用了Spring Boot的全局异常处理机制,通过实现`ErrorAttributes`接口和定义`@ControllerAdvice`注解的类,可以捕获并统一处理所有控制器级别的异常,返回格式化的错误信息,增强系统的健壮性。 拦截器...
可以使用雪花算法或分布式ID生成器(如Snowflake、Twitter的Snowflake或者Google的UUID)来生成具有时间戳、工作节点ID等信息的全局唯一ID。 4. **乐观锁**: 乐观锁是一种非阻塞的并发控制策略,假设在并发环境下...
**Spring Boot 集成 Beetl 简单示例** Spring Boot 是一款基于 Java 的轻量级框架,它简化了 Spring 应用的初始搭建以及开发过程。Beetl 则是一款强大的模板引擎,旨在提供高效、简洁的模板语言,帮助开发者在 Web ...
在描述中提到的"微服务srping boot 案例demo"可能涉及到Spring Cloud,它是Spring Boot在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群...
2. **Spring Boot整合RESTful API**:Spring Boot提供了方便的工具来创建RESTful服务,如使用`@RestController`注解的控制器类和`@RequestMapping`、`@GetMapping`等方法级别的注解来定义HTTP端点。项目会创建一个...
- Spring Boot 基础知识,包括SpringBoot起步、配置详解、aop、filter、拦截器、监听、启动器、全局异常处理、外部Tomcat启动、HTTPS、监控 等。 - springboot-data - Spring Boot 数据库操作,包括SpringJDBC、...
Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的初始设置和开发过程。它集成了大量常用的第三方库配置,如 JDBC、MongoDB、JPA、RabbitMQ、Quartz 等,使得开发者能够快速地创建生产级别...
- 雪花Id是一种分布式ID生成策略,可以生成全局唯一的ID,避免ID冲突。引入 `com.baomidou.mybatisplus.extension.plugins:mybatis-plus-generator`,配置生成雪花Id的实体类注解 `@TableId(type = IdType.AUTO)`。...
1. **唯一ID生成**:此模块可能包含一个自定义ID生成器,用于生成全局唯一的ID,比如UUID、雪花ID(Snowflake ID)或其他分布式ID算法,确保在分布式系统中的唯一性。 2. **身份验证和授权**:这可能涉及到Spring ...
4、项目生成路径为/opt/exceldata/data,如果想改,全局搜一下,替换即可 5、定时任务是每天12:00删除指定文件夹目录 6、项目没有依赖数据库持久化,如果需要,可以自己加入数据库和mybatis-plus
- **配置 JSP**:在 Spring Boot 中启用对 JSP 的支持,设置视图解析器,理解 `addResourceHandlers` 和 `addViewControllers` 方法。 这个教程不仅适合初学者,也适合有一定经验的开发者,全面覆盖了 Spring Boot...
Spring Boot 是一个快速开发框架,它简化了基于Spring的应用程序的初始设置和配置。这个项目集成了多个常用组件,包括Freemarker、Swagger、Druid和MyBatis,旨在提供一个全面的微服务开发环境。 **Freemarker** 是...
Spring Cloud Gateway作为一款基于Spring Framework 5、Project Reactor和Spring Boot 2.0构建的云原生网关框架,它提供了强大的路由转发能力和灵活的过滤器模型,能够很好地满足微服务网关的各种需求。然而,在实际...
Spring Boot的快速构建得益于Spring Initializr,它可以集成在STS中,帮助我们一键生成基本的Spring Boot项目结构。 接下来,我们进入RESTful API的快速搭建。在第2节中,我们创建了一个简单的Spring Boot项目,...
全局唯一ID作为一种唯一标识来区分数据,可用作订单号、用户ID等。ID生成器是生成全局唯一ID的工具,可封装为一种基础服务为其他业务提供服务。因此此项目就是用springboot封装ID生成器,让各种业务系统调用
本篇文章将深入探讨如何在Spring Boot中集成Spring MVC,创建一个简单的Web应用程序。 ### 一、Spring MVC概述 Spring MVC是Spring框架的一部分,它是一个基于模型-视图-控制器(MVC)设计模式的Web应用框架。它...
Spring Boot 是一个旨在简化Spring应用程序开发的框架,它在Spring 4.0的基础上构建,集成了Spring框架的诸多优秀特性并解决了依赖版本冲突和引用不稳定性的问题。Spring Boot的核心目标是通过自动化配置来减少手动...
- Spring Boot默认集成了Jackson库,用于将Java对象转换为JSON格式和从JSON反序列化回Java对象。通过`@RequestBody`和`@ResponseBody`注解,可以方便地处理HTTP请求和响应的JSON数据。 7. **错误处理与API版本控制...