在大型的项目中,我们一般都知道不能直接使用数据库的自增id,所以衍生了很多唯一id的生成方案,例如:生成uuid,或者现在流行的雪花算法id,还有数据库发号id等模式。由于我们线上的接口平台每日上百万,千万的数据采集,所以我们这里目前暂时使用的是滴滴tinyid开源项目做id的生成。
滴滴的tinyid的生成方案主要是基于数据库发号的模式进行id生成的,因此我们在这里可以很灵活的控制掌控这个id。这里我们详细列巨额下滴滴的tinyid使用完整步骤。
使用滴滴的tinyid,他分为服务器端和客户端两部分,服务器端,顾名思义就是需要在服务器端部署一套web服务。客户端再使用远程直接调用这个服务器端的web层即可。
一、服务器端的部署
1)首先我们从git上把滴滴的代码下载下来,下载地址是:https://codeload.github.com/didi/tinyid/zip/refs/heads/master
2)然后我们把这个代码进行解压,并且进入这个项目里面
3)由于我们只是部署服务端,因此,我们进入到tinyid_server项目下,可以看到有一个sql文件,我们需要在mysql上创建并且加载这个sql程序。
4)修改tinyid_server项目的src/main/resources/offline/application.properties,把数据库配置上
5)开始编译tinyid_server项目,进入到tinyid-master/tinyid-server 这个目录下,执行:
./build.sh offline
然后等待编译接口,最后可以在当前目录下看到一个output的文件夹,里面就是编译好的jar包。
6)然后我们运行下这个jar包,因为这个包是spring boot编写的,因此这里直接使用
nohup java -jar tinyid-server-0.1.0-SNAPSHOT.jar &
7)访问下对应的服务
curl http://127.0.0.1:9999/tinyid/id/nextId
可以看到返回了
{"data":null,"code":5,"message":"token is error"}
就代表服务器端启动没问题了,这里为什么没有token呢,是因为我们在curl的时候,后面没有添加参数,所以报错,所以这里是正常的。
二、使用客户端生成唯一id
1)我们从刚才下载的代码里面,进入到client的项目中
2)使用mvn 把项目进行编译一下
mvn install -Dmaven.test.skip=true
3)然后把生成的jar包放到我们的本地maven仓库中。这里强烈建议把代码下载下来,在本机直接编译,这样子编译好的jar包就会自动放到本地的maven respository里面。项目里面直接使用即可。
4)创建一个新的spring boot maven项目
5)引入tiny_id的客户端maven依赖
<dependency> <groupId>com.xiaoju.uemc.tinyid</groupId> <artifactId>tinyid-client</artifactId> <version>0.1.0-SNAPSHOT</version> </dependency>
6)在项目的src/main/resources目录下创建一个空文件:tinyid_client.properties
7)把下面的内容复制到tinyid_client.properties 这个文件里面
tinyid.server=192.168.31.30:9999 tinyid.token=0f673adf80504e2eaa552f5d791b644c tinyid.readTimeout=50000 tinyid.connectTimeout=50000
注意修稿server对应的host。
8)在项目中使用如下代码即可获取到tiny_id服务器端返回的唯一id
Long nextId = TinyId.nextId("test");
我们这里谢了一个接口,具体如下:
package com.didi.tinnyid.controllers; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import com.xiaoju.uemc.tinyid.client.utils.TinyId; /** * * A sample greetings controller to return greeting text */ @RestController public class GreetingsController { /** * * @param name the name to greet * @return greeting text */ @RequestMapping(value = "/{name}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public String greetingText(@PathVariable String name) { Long nextId = TinyId.nextId("test"); return "Hello " + name + ": " + nextId + " !"; } }
9)我们访问下我们的客户端项目,看下效果
有唯一id获取。此项目运行成功。
客户端使用情况说明:
1、在代码里面我们使用
TinyId.nextId("test");
这里的test我们能否直接改动呢,答案是档案可以,但是在客户端的项目里面,直接把这里的test改成test1的话代码会直接报错,因为这里的test对应的上上面服务器端初始化的sql到数据库里面的。数据库里面我们插入数据是test,所以这里只能是test,插入的是test1,这里只能是test1。我们来看看数据库信息
看到了吧这里是test,如果我们的项目需要改成什么,那么久改成什么。代码里面就使用什么。
2、在tinyid_client.properties这里的token我们能不能改变,答案是也可以改变,他的思路和上面是一样的,数据库配置什么就使用什么。
所以基于biz_type和token的修改需要和数据库对应,不然程序会直接报错比较麻烦。
3)这里使用的是数据库分发的模式,tiny_id服务器端会提前把号段加载到内存中,利用内存把号段返回给客户端。
4)这里分发的号段是不连续的,所以大家在使用的时候,尽量结合自己的业务去定制号段的长度,避免出现大量的浪费。
5)这里客户端看起来返回的id是逐步增长的,但是我们在实际的并发业务中,会出现两个并发的进程,先请求的比后请求的拿到的id小。所以不要过分相信此id是逐渐增加的。在实际应用中需要注意这点。
还没有评论,来说两句吧...