项目介绍
微服务时代,我们需要生产一个连续的序列号,变得比较麻烦。这里使用了Mysql简单的实现了一个简单的分布式序列号生成组件。后续还可以支持Redis等其他高效中间件。
软件架构原理很简单,在mysql数据专门创建一张表,例如:
CREATE TABLE IF NOT EXISTS `sequece`( `id` bigit(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键id', `value` bigit(20) NOT NULL COMMENT 'sequece当前值', `ame` varchar(32) NOT NULL COMMENT 'sequece对应的名称,通常是表名', `gmt_create` DATETIME NOT NULL COMMENT '创建时间', `gmt_modified` DATETIME NOT NULL COMMENT '修改时间', PRIMARY KEY (`ID`) ,UNIQUE uk_ame (`ame`));每钟业务类型创建一条记录,value表示当时取的区间值,例如当前value值是100。当我们设置step长为100时,来取一次,就会update到value。然后程序节点就可以把这个100分配出去。
使用说明1.API方式使用
public class SequeceTest_Api { private Sequece userSeq; @Before public void setup() { DruidDataSource dataSource = ew DruidDataSource(); dataSource.setUrl("jdbc:mysql://121.196.218.206:3306/admi?characterEcodig=UTF-8"); dataSource.setUserame("admi"); dataSource.setPassword("admi123"); dataSource.setMaxActive(300); dataSource.setMiIdle(50); dataSource.setIitialSize(2); dataSource.setMaxWait(500); DbSeqRageCofig seqRageCofig = ew DbSeqRageCofig(); seqRageCofig.setDataSource(dataSource); seqRageCofig.setTableName("sequece"); seqRageCofig.setRetryTimes(100); seqRageCofig.setStep(1000); seqRageCofig.setStepStart(0); DbSeqRageMgr seqRageMgr = ew DbSeqRageMgr(); seqRageMgr.setSeqRageCofig(seqRageCofig); seqRageMgr.iit(); userSeq = ew DefaultSequece(); userSeq.setName("user"); userSeq.setSeqRageMgr(seqRageMgr); } @Test public void test() { log start = System.curretTimeMillis(); for (it i = 0; i < 1000; i++) { System.out.pritl("++++++++++id:" + userSeq.extValue()); } System.out.pritl("iterval time:" + (System.curretTimeMillis() - start)); }}2.Sprig使用方式
(1)XML文件配置
<!-- 数据源 --><bea id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" iit-method="iit" destroy-method="close"> <property ame="url" value="jdbc:mysql://121.196.218.206:3306/admi?characterEcodig=UTF-8"/> <property ame="userame" value="admi"/> <property ame="password" value="admi123"/> <property ame="maxActive" value="300"/> <property ame="miIdle" value="50"/> <property ame="iitialSize" value="2"/> <property ame="maxWait" value="500"/></bea><!-- 序列号步长管理器配置 --><bea id="seqRageCofig" class="com.xua.xseq.rage.impl.db.DbSeqRageCofig"><!-- 数据源[必选] --><property ame="dataSource" ref="dataSource"/><!-- 表名[可选] 默认:sequece--><property ame="tableName" value="sequece"/><!-- 更新失败重试次数[可选] 默认:100--><property ame="retryTimes" value="100"/><!-- 每次取数步长[可选] 默认:1000--><property ame="step" value="1000"/><!-- 起始数,注意真实开始可用数是stepStart+1,例如stepStart=0表示从1开始[可选] 默认:0--><property ame="stepStart" value="0"/></bea><!-- 序列号步长管理器 --><bea id="seqRageMgr" class="com.xua.xseq.rage.impl.db.DbSeqRageMgr" iit-method="iit"><property ame="seqRageCofig" ref="seqRageCofig"/></bea><!-- 具体使用demo --><bea id="userSeq" class="com.xua.xseq.seq.impl.DefaultSequece"><property ame="seqRageMgr" ref="seqRageMgr"/><property ame="ame" value="user"/></bea>(2)API代码使用
@RuWith(SprigJUit4ClassRuer.class)@CotextCofiguratio(locatios = { "classpath:sequece-test.xml" })public class SequeceTest_Sprig { @Autowired private Sequece userSeq; @Test public void test() { for (it i = 0; i < 100; i++) { System.out.pritl("++++++++++id:" + userSeq.extValue()); } }}









评论