diff --git a/udf-starter-id/pom.xml b/udf-starter-id/pom.xml index 7a87421..cc4073a 100644 --- a/udf-starter-id/pom.xml +++ b/udf-starter-id/pom.xml @@ -29,5 +29,9 @@ org.itkk.udf udf-starter-cache-redis + + org.itkk.udf + udf-starter-rms + diff --git a/udf-starter-id/src/main/java/org/itkk/udf/id/IdWorkerInit.java b/udf-starter-id/src/main/java/org/itkk/udf/id/IdWorkerInit.java index 42fb085..e76daaa 100644 --- a/udf-starter-id/src/main/java/org/itkk/udf/id/IdWorkerInit.java +++ b/udf-starter-id/src/main/java/org/itkk/udf/id/IdWorkerInit.java @@ -179,6 +179,33 @@ public class IdWorkerInit { log.info("init IdWorker success = {} , {} , {}", result, this.datacenterId, this.workerId); } + /** + * 获得缓存值 + * + * @param paramDatacenterId 数据中心ID + * @param paramWorkerId 机器ID + * @return 缓存值 + */ + public CacheValue getCacheValue(Integer paramDatacenterId, Integer paramWorkerId) { + return redisTemplate.execute((RedisCallback) connection -> { + try { + //判空 + if (datacenterId == null || workerId == null) { + throw new SystemRuntimeException("datacenterId and workerId must not be null"); + } + //生成key + String key = cacheRedisProperties.getPrefix().concat(SPLIT).concat(CACHE_NAME).concat(SPLIT).concat(Integer.toString(paramDatacenterId)).concat(SPLIT).concat(Integer.toString(paramWorkerId)); + //判断缓存是否存在 + if (!connection.exists(serializer.serialize(key))) { + throw new SystemRuntimeException("cache does not exist , key ----> " + key); + } + return (CacheValue) jdkSerializationRedisSerializer.deserialize(connection.get(serializer.serialize(key))); + } finally { + connection.close(); + } + }); + } + /** * 定时刷新过期时间 */ diff --git a/udf-starter-id/src/main/java/org/itkk/udf/id/service/IdWorkerService.java b/udf-starter-id/src/main/java/org/itkk/udf/id/service/IdWorkerService.java new file mode 100644 index 0000000..f408ad6 --- /dev/null +++ b/udf-starter-id/src/main/java/org/itkk/udf/id/service/IdWorkerService.java @@ -0,0 +1,124 @@ +package org.itkk.udf.id.service; + +import org.itkk.udf.core.RestResponse; +import org.itkk.udf.core.exception.SystemRuntimeException; +import org.itkk.udf.id.IdWorkerInit; +import org.itkk.udf.id.IdWorkerProperties; +import org.itkk.udf.id.domain.CacheValue; +import org.itkk.udf.id.domain.Id; +import org.itkk.udf.rms.Rms; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * IdWorkerService + */ +@Service +public class IdWorkerService { + + /** + * idWorker + */ + @Autowired + private IdWorkerInit idWorkerInit; + + /** + * idWorkerProperties + */ + @Autowired + private IdWorkerProperties idWorkerProperties; + + /** + * rms + */ + @Autowired + private Rms rms; + + /** + * 获得分布式ID[IdWorker随机] + * + * @return ID + */ + public String get() { + return Long.toString(idWorkerInit.get().nextId()); + } + + /** + * 批量获得分布式ID[IdWorker随机] + * + * @param count 数量 + * @return ID + */ + public List get(Integer count) { + //判断最大数量 + if (count > idWorkerProperties.getMaxCount()) { + throw new SystemRuntimeException("The number is too large and the maximum setting is " + idWorkerProperties.getMaxCount()); + } + //循环生成 + List ids = new ArrayList<>(); + for (int i = 0; i < count; i++) { + ids.add(Long.toString(idWorkerInit.get().nextId())); + } + return ids; + } + + /** + * 解析分布式ID + * + * @param id 分布式ID + * @return ID + */ + public Id reverse(long id) { + return idWorkerInit.get().reverse(id); + } + + /** + * 获得分布式ID[指定IdWorker] + * + * @param datacenterId 数据中心ID + * @param workerId workerId + * @return ID + */ + public String workerGet(Integer datacenterId, Integer workerId) { + //定义需要请求的接口 + final String serviceCode = "ID_1"; + //获得缓存 + CacheValue cacheValue = idWorkerInit.getCacheValue(datacenterId, workerId); + //远程请求 + ResponseEntity> result = rms.call(cacheValue.getHost(), cacheValue.getPort(), serviceCode, null, null, new ParameterizedTypeReference>() { + }, null); + //返回 + return result.getBody().getResult(); + } + + /** + * 批量获得分布式ID[指定IdWorker] + * + * @param datacenterId 数据中心ID + * @param workerId workerId + * @param count 数量 + * @return ID + */ + public List workerGet(Integer datacenterId, Integer workerId, Integer count) { + //定义需要请求的接口 + final String serviceCode = "ID_2"; + //获得缓存 + CacheValue cacheValue = idWorkerInit.getCacheValue(datacenterId, workerId); + //构建uriVariables + Map uriVariables = new HashMap<>(); + uriVariables.put("count", count); + //远程请求 + ResponseEntity>> result = rms.call(cacheValue.getHost(), cacheValue.getPort(), serviceCode, null, null, new ParameterizedTypeReference>>() { + }, uriVariables); + //返回 + return result.getBody().getResult(); + } + +} diff --git a/udf-starter-id/src/main/java/org/itkk/udf/id/web/IIdWorkerController.java b/udf-starter-id/src/main/java/org/itkk/udf/id/web/IIdWorkerController.java index 2dbaab8..eff6c8b 100644 --- a/udf-starter-id/src/main/java/org/itkk/udf/id/web/IIdWorkerController.java +++ b/udf-starter-id/src/main/java/org/itkk/udf/id/web/IIdWorkerController.java @@ -28,11 +28,11 @@ import java.util.List; public interface IIdWorkerController { //NOSONAR /** - * 获得分布式ID + * 获得分布式ID[IdWorker随机] * * @return ID */ - @ApiOperation(value = "ID_1", notes = "获得分布式ID(注意:ID为长整型,在javascript下会丢失精度,请注意数据类型转换)") + @ApiOperation(value = "ID_1", notes = "获得分布式ID[IdWorker随机](注意:ID为长整型,在javascript下会丢失精度,请注意数据类型转换)") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", name = "rmsApplicationName", value = "rms应用名称", required = true, dataType = "string"), @ApiImplicitParam(paramType = "header", name = "rmsSign", value = "rms认证秘钥", required = true, dataType = "string"), @@ -42,12 +42,12 @@ public interface IIdWorkerController { //NOSONAR RestResponse get(); /** - * 批量获得分布式ID + * 批量获得分布式ID[IdWorker随机] * * @param count 数量 * @return ID */ - @ApiOperation(value = "ID_2", notes = "批量获得分布式ID(注意:ID为长整型,在javascript下会丢失精度,请注意数据类型转换)") + @ApiOperation(value = "ID_2", notes = "批量获得分布式ID[IdWorker随机](注意:ID为长整型,在javascript下会丢失精度,请注意数据类型转换)") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", name = "rmsApplicationName", value = "rms应用名称", required = true, dataType = "string"), @ApiImplicitParam(paramType = "header", name = "rmsSign", value = "rms认证秘钥", required = true, dataType = "string"), @@ -73,4 +73,42 @@ public interface IIdWorkerController { //NOSONAR @RequestMapping(value = "reverse/{id}", method = RequestMethod.GET) RestResponse reverse(@PathVariable long id); + /** + * 获得分布式ID[指定IdWorker] + * + * @param datacenterId 数据中心ID + * @param workerId workerId + * @return ID + */ + @ApiOperation(value = "ID_4", notes = "获得分布式ID[指定IdWorker](注意:ID为长整型,在javascript下会丢失精度,请注意数据类型转换)") + @ApiImplicitParams({ + @ApiImplicitParam(paramType = "header", name = "rmsApplicationName", value = "rms应用名称", required = true, dataType = "string"), + @ApiImplicitParam(paramType = "header", name = "rmsSign", value = "rms认证秘钥", required = true, dataType = "string"), + @ApiImplicitParam(paramType = "header", name = "rmsServiceCode", value = "rms接口编号", required = true, dataType = "string"), + @ApiImplicitParam(paramType = "path", name = "datacenterId", value = "数据中心ID", required = true, dataType = "int"), + @ApiImplicitParam(paramType = "path", name = "workerId", value = "机器ID", required = true, dataType = "int") + }) + @RequestMapping(value = "worker/{datacenterId}/{workerId}", method = RequestMethod.GET) + RestResponse workerGet(@PathVariable Integer datacenterId, @PathVariable Integer workerId); + + /** + * 批量获得分布式ID[指定IdWorker] + * + * @param datacenterId 数据中心ID + * @param workerId workerId + * @param count 数量 + * @return ID + */ + @ApiOperation(value = "ID_5", notes = "批量获得分布式ID[指定IdWorker](注意:ID为长整型,在javascript下会丢失精度,请注意数据类型转换)") + @ApiImplicitParams({ + @ApiImplicitParam(paramType = "header", name = "rmsApplicationName", value = "rms应用名称", required = true, dataType = "string"), + @ApiImplicitParam(paramType = "header", name = "rmsSign", value = "rms认证秘钥", required = true, dataType = "string"), + @ApiImplicitParam(paramType = "header", name = "rmsServiceCode", value = "rms接口编号", required = true, dataType = "string"), + @ApiImplicitParam(paramType = "path", name = "datacenterId", value = "数据中心ID", required = true, dataType = "int"), + @ApiImplicitParam(paramType = "path", name = "workerId", value = "机器ID", required = true, dataType = "int"), + @ApiImplicitParam(paramType = "path", name = "count", value = "数量", required = true, dataType = "string") + }) + @RequestMapping(value = "worker/{datacenterId}/{workerId}/{count}", method = RequestMethod.GET) + RestResponse> workerGet(@PathVariable Integer datacenterId, @PathVariable Integer workerId, @PathVariable Integer count); + } diff --git a/udf-starter-id/src/main/java/org/itkk/udf/id/web/IdWorkerController.java b/udf-starter-id/src/main/java/org/itkk/udf/id/web/IdWorkerController.java index 8d75eff..3da069a 100644 --- a/udf-starter-id/src/main/java/org/itkk/udf/id/web/IdWorkerController.java +++ b/udf-starter-id/src/main/java/org/itkk/udf/id/web/IdWorkerController.java @@ -7,15 +7,12 @@ package org.itkk.udf.id.web; import org.itkk.udf.core.RestResponse; -import org.itkk.udf.core.exception.SystemRuntimeException; -import org.itkk.udf.id.IdWorkerInit; -import org.itkk.udf.id.IdWorkerProperties; import org.itkk.udf.id.domain.Id; +import org.itkk.udf.id.service.IdWorkerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; -import java.util.ArrayList; import java.util.List; /** @@ -27,38 +24,33 @@ import java.util.List; public class IdWorkerController implements IIdWorkerController { /** - * idWorker + * idWorkerService */ @Autowired - private IdWorkerInit idWorkerInit; - - /** - * idWorkerProperties - */ - @Autowired - private IdWorkerProperties idWorkerProperties; + private IdWorkerService idWorkerService; @Override public RestResponse get() { - return new RestResponse<>(Long.toString(idWorkerInit.get().nextId())); + return new RestResponse<>(idWorkerService.get()); } @Override public RestResponse> get(@PathVariable Integer count) { - //判断最大数量 - if (count > idWorkerProperties.getMaxCount()) { - throw new SystemRuntimeException("The number is too large and the maximum setting is " + idWorkerProperties.getMaxCount()); - } - //循环生成 - List ids = new ArrayList<>(); - for (int i = 0; i < count; i++) { - ids.add(Long.toString(idWorkerInit.get().nextId())); - } - return new RestResponse<>(ids); + return new RestResponse<>(idWorkerService.get(count)); } @Override public RestResponse reverse(@PathVariable long id) { - return new RestResponse<>(idWorkerInit.get().reverse(id)); + return new RestResponse<>(idWorkerService.reverse(id)); + } + + @Override + public RestResponse workerGet(@PathVariable Integer datacenterId, @PathVariable Integer workerId) { + return new RestResponse<>(idWorkerService.workerGet(datacenterId, workerId)); + } + + @Override + public RestResponse> workerGet(@PathVariable Integer datacenterId, @PathVariable Integer workerId, @PathVariable Integer count) { + return new RestResponse<>(idWorkerService.workerGet(datacenterId, workerId, count)); } } diff --git a/udf-starter-rms/src/main/java/org/itkk/udf/rms/Rms.java b/udf-starter-rms/src/main/java/org/itkk/udf/rms/Rms.java index a71021f..2283acf 100644 --- a/udf-starter-rms/src/main/java/org/itkk/udf/rms/Rms.java +++ b/udf-starter-rms/src/main/java/org/itkk/udf/rms/Rms.java @@ -79,8 +79,7 @@ public class Rms { //获取服务元数据 ServiceMeta serviceMeta = rmsProperties.getService().get(serviceCode); //构建请求路径 - String path = serviceMeta.getIsHttps() ? Constant.HTTPS : Constant.HTTP; - path.concat(host).concat(":").concat(String.valueOf(port)).concat(serviceMeta.getUri()); + String path = (serviceMeta.getIsHttps() ? Constant.HTTPS : Constant.HTTP).concat(host).concat(":").concat(String.valueOf(port)).concat(serviceMeta.getUri()); //获得请求方法 String method = getRmsMethod(serviceCode); //拼装路径参数