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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
|
@Service @Slf4j public class DistributedIdService { @Autowired private DistributedIdProperties properties; @Autowired private SnowflakeIdGenerator snowflakeIdGenerator; @Autowired private UuidGenerator uuidGenerator; @Autowired private DatabaseIdGenerator databaseIdGenerator; @Autowired private RedisIdGenerator redisIdGenerator; @Autowired private ZookeeperIdGenerator zookeeperIdGenerator; @Autowired private DistributedIdMonitorService distributedIdMonitorService; @Autowired private DistributedIdRepository distributedIdRepository;
public DistributedIdResult generateId(String idType, String businessType) { return generateId(idType, businessType, properties.getDefaultGeneratorType()); }
public DistributedIdResult generateId(String idType, String businessType, String generatorType) { log.info("生成分布式ID,ID类型: {}, 业务类型: {}, 生成器类型: {}", idType, businessType, generatorType); DistributedIdResult result = new DistributedIdResult(); result.setIdType(idType); result.setBusinessType(businessType); result.setGeneratorType(generatorType); result.setStartTime(System.currentTimeMillis()); try { validateParameters(idType, businessType, generatorType, result); if (!result.isSuccess()) { return result; } String id = generateIdByType(generatorType, idType, businessType); if (id != null && !id.isEmpty()) { result.setSuccess(true); result.setId(id); result.setGenerateTime(LocalDateTime.now()); result.setEndTime(System.currentTimeMillis()); distributedIdMonitorService.recordSuccessGeneration(generatorType, result.getDuration()); saveIdRecord(result); log.info("分布式ID生成成功,ID: {}, 类型: {}, 生成器: {}", id, idType, generatorType); } else { result.setSuccess(false); result.setError("ID生成失败"); result.setEndTime(System.currentTimeMillis()); distributedIdMonitorService.recordFailureGeneration(generatorType); log.warn("分布式ID生成失败,类型: {}, 生成器: {}", idType, generatorType); } return result; } catch (Exception e) { log.error("分布式ID生成异常,类型: {}, 生成器: {}", idType, generatorType, e); result.setSuccess(false); result.setError("分布式ID生成异常: " + e.getMessage()); result.setEndTime(System.currentTimeMillis()); distributedIdMonitorService.recordFailureGeneration(generatorType); return result; } }
private void validateParameters(String idType, String businessType, String generatorType, DistributedIdResult result) { if (idType == null || idType.isEmpty()) { result.setSuccess(false); result.setError("ID类型不能为空"); result.setEndTime(System.currentTimeMillis()); return; } if (businessType == null || businessType.isEmpty()) { result.setSuccess(false); result.setError("业务类型不能为空"); result.setEndTime(System.currentTimeMillis()); return; } if (generatorType == null || generatorType.isEmpty()) { result.setSuccess(false); result.setError("生成器类型不能为空"); result.setEndTime(System.currentTimeMillis()); return; } }
private String generateIdByType(String generatorType, String idType, String businessType) { switch (generatorType.toUpperCase()) { case "SNOWFLAKE": if (properties.getSnowflake().isEnableSnowflake()) { return String.valueOf(snowflakeIdGenerator.nextId()); } break; case "UUID": if (properties.getUuid().isEnableUuid()) { return uuidGenerator.generateUuid(); } break; case "DATABASE": if (properties.getDatabase().isEnableDatabase()) { return String.valueOf(databaseIdGenerator.nextId()); } break; case "REDIS": if (properties.getRedis().isEnableRedis()) { return String.valueOf(redisIdGenerator.nextId()); } break; case "ZOOKEEPER": if (properties.getZookeeper().isEnableZookeeper()) { return String.valueOf(zookeeperIdGenerator.nextId()); } break; default: log.warn("不支持的生成器类型: {}", generatorType); return null; } log.warn("生成器类型 {} 未启用", generatorType); return null; }
private void saveIdRecord(DistributedIdResult result) { try { DistributedIdData data = new DistributedIdData( result.getId(), result.getIdType(), result.getGeneratorType() ); data.setBusinessType(result.getBusinessType()); data.setGenerateTime(result.getGenerateTime()); distributedIdRepository.save(data); } catch (Exception e) { log.error("保存ID记录异常", e); } }
public List<DistributedIdResult> batchGenerateId(String idType, String businessType, int count) { return batchGenerateId(idType, businessType, count, properties.getDefaultGeneratorType()); }
public List<DistributedIdResult> batchGenerateId(String idType, String businessType, int count, String generatorType) { log.info("批量生成分布式ID,ID类型: {}, 业务类型: {}, 数量: {}, 生成器类型: {}", idType, businessType, count, generatorType); List<DistributedIdResult> results = new ArrayList<>(); try { for (int i = 0; i < count; i++) { DistributedIdResult result = generateId(idType, businessType, generatorType); results.add(result); } log.info("批量生成分布式ID完成,成功数量: {}", results.stream().mapToInt(r -> r.isSuccess() ? 1 : 0).sum()); } catch (Exception e) { log.error("批量生成分布式ID异常", e); } return results; }
public DistributedIdStatus getDistributedIdStatus() { log.info("获取分布式ID状态"); try { return distributedIdMonitorService.getStatus(); } catch (Exception e) { log.error("获取分布式ID状态异常", e); return null; } }
public boolean validateIdFormat(String id, String idType) { log.info("验证ID格式,ID: {}, 类型: {}", id, idType); try { if (id == null || id.isEmpty()) { return false; } switch (idType.toUpperCase()) { case "SNOWFLAKE": return validateSnowflakeId(id); case "UUID": return validateUuid(id); case "DATABASE": return validateDatabaseId(id); case "REDIS": return validateRedisId(id); case "ZOOKEEPER": return validateZookeeperId(id); default: return false; } } catch (Exception e) { log.error("验证ID格式异常", e); return false; } }
private boolean validateSnowflakeId(String id) { try { long idLong = Long.parseLong(id); return idLong > 0; } catch (NumberFormatException e) { return false; } }
private boolean validateUuid(String id) { try { UUID.fromString(id); return true; } catch (IllegalArgumentException e) { return false; } }
private boolean validateDatabaseId(String id) { try { long idLong = Long.parseLong(id); return idLong > 0; } catch (NumberFormatException e) { return false; } }
private boolean validateRedisId(String id) { try { long idLong = Long.parseLong(id); return idLong > 0; } catch (NumberFormatException e) { return false; } }
private boolean validateZookeeperId(String id) { try { long idLong = Long.parseLong(id); return idLong > 0; } catch (NumberFormatException e) { return false; } } }
|