mysql数据库,建立一个独立的数据库,对应一个独立的微服务。
通过id表和分布式锁实现分布式id。
建立一个id表
CREATE TABLE `rys_distribute_id` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(64) NOT NULL DEFAULT '' COMMENT 'id名称',
`init_value` int(11) NOT NULL DEFAULT '0' COMMENT 'id初始值',
`current_value` int(11) NOT NULL COMMENT 'id当前值',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记(0-否,1-是)',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
PRIMARY KEY (`id`),
KEY `idx_type` (`init_value`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='分布式id';
1
2
3
4
5
6
7
8
9
10
11
12
13
service提供接口
@Service
public class DistributeIdService {
@Autowired
private DistributeIdMapper distributeIdMapper;
@Autowired
private RedisLockRegistry redisLockRegistry;
public Integer getNextId(String idName) {
Lock lock = redisLockRegistry.obtain(idName);
lock.lock();
try {
DistributeId distributeId = distributeIdMapper.getByName(idName);
//不存在,设置初始值
if (distributeId == null) {
distributeId = new DistributeId();
distributeId.setName(idName);
distributeId.setInitValue(DistributeIdConstant.INIT_VALUE);
distributeId.setCurrentValue(distributeId.getInitValue());
distributeIdMapper.insert(distributeId);
return distributeId.getCurrentValue();
}
//存在,当前值+1
else {
DistributeId update = new DistributeId();
update.setId(distributeId.getId());
update.setCurrentValue(distributeId.getCurrentValue() + 1);
distributeIdMapper.updateById(update);
return update.getCurrentValue();
}
} finally {
lock.unlock();
}
}
}
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
id名称常量,添加一个id,旧加一个常量值
public interface DistributeIdConstant {
int INIT_VALUE = 100001;
String RESOURCE_ID = "RESOURCE_ID";
}
1
2
3
4
5
包装成feign接口,提供出去。
也可以每个服务都起一套,这样每个人使用独立,更方便。看自己习惯。
https://github.com/mingwulipo/activiti-modeler-demo
————————————————
版权声明:本文为CSDN博主「无极大帝」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mingwulipo/article/details/107579735