From edaffed73697e601cb59c8cae8c4a17eefc9aac7 Mon Sep 17 00:00:00 2001 From: JangCan <2862008188@qq.com> Date: Thu, 18 Apr 2024 16:28:56 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E6=95=B0=E6=8D=AE=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=8F=8A=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aliyun/service/AliYunEcsService.java | 2 +- .../domain/InstancesInformation.java | 2 +- .../{ => common}/domain/IpAndLoadCount.java | 2 +- .../{ => common}/domain/IpAndWeight.java | 2 +- .../{ => common}/domain/MqttInfo.java | 2 +- .../{ => common}/domain/resp/HttpStatus.java | 2 +- .../{ => common}/domain/resp/Result.java | 2 +- .../common/redis/service/RedisService.java | 4 ++ .../controller/GatewayController.java | 29 ++++++++++ .../controller/LoadCenterController.java | 2 +- .../gateway/cache/GatewayLoadNodeCache.java | 52 +++++++++++++++++ .../gateway/cache/GatewayLoadSeriesCache.java | 57 +++++++++++++++++++ .../gateway/cache/GatewayNodeCache.java | 50 ++++++++++++++++ .../gateway/cache/abs/GatewayCacheAbs.java | 21 +++++++ .../gateway/model/GatewayNodeInfo.java | 33 +++++++++++ .../service/GatewayLoadService.java | 14 +++++ .../loadcenter/service/LoadCenterService.java | 2 +- .../service/impl/GatewayLoadServiceImpl.java | 50 ++++++++++++++++ .../service/impl/LoadCenterServiceImpl.java | 6 +- 19 files changed, 322 insertions(+), 12 deletions(-) rename src/main/java/com/loadcenter/{ => common}/domain/InstancesInformation.java (97%) rename src/main/java/com/loadcenter/{ => common}/domain/IpAndLoadCount.java (91%) rename src/main/java/com/loadcenter/{ => common}/domain/IpAndWeight.java (91%) rename src/main/java/com/loadcenter/{ => common}/domain/MqttInfo.java (96%) rename src/main/java/com/loadcenter/{ => common}/domain/resp/HttpStatus.java (97%) rename src/main/java/com/loadcenter/{ => common}/domain/resp/Result.java (98%) create mode 100644 src/main/java/com/loadcenter/controller/GatewayController.java create mode 100644 src/main/java/com/loadcenter/gateway/cache/GatewayLoadNodeCache.java create mode 100644 src/main/java/com/loadcenter/gateway/cache/GatewayLoadSeriesCache.java create mode 100644 src/main/java/com/loadcenter/gateway/cache/GatewayNodeCache.java create mode 100644 src/main/java/com/loadcenter/gateway/cache/abs/GatewayCacheAbs.java create mode 100644 src/main/java/com/loadcenter/gateway/model/GatewayNodeInfo.java create mode 100644 src/main/java/com/loadcenter/service/GatewayLoadService.java create mode 100644 src/main/java/com/loadcenter/service/impl/GatewayLoadServiceImpl.java diff --git a/src/main/java/com/loadcenter/common/aliyun/service/AliYunEcsService.java b/src/main/java/com/loadcenter/common/aliyun/service/AliYunEcsService.java index a9a6378..18bd1de 100644 --- a/src/main/java/com/loadcenter/common/aliyun/service/AliYunEcsService.java +++ b/src/main/java/com/loadcenter/common/aliyun/service/AliYunEcsService.java @@ -7,7 +7,7 @@ import com.aliyun.teautil.Common; import com.aliyun.teautil.models.RuntimeOptions; import com.loadcenter.common.aliyun.model.InstanceSpecification; import com.loadcenter.common.aliyun.config.AliConfig; -import com.loadcenter.domain.InstancesInformation; +import com.loadcenter.common.domain.InstancesInformation; import com.loadcenter.common.redis.service.RedisService; import com.loadcenter.common.utils.user.UserUtil; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/loadcenter/domain/InstancesInformation.java b/src/main/java/com/loadcenter/common/domain/InstancesInformation.java similarity index 97% rename from src/main/java/com/loadcenter/domain/InstancesInformation.java rename to src/main/java/com/loadcenter/common/domain/InstancesInformation.java index 9640c45..2009d14 100644 --- a/src/main/java/com/loadcenter/domain/InstancesInformation.java +++ b/src/main/java/com/loadcenter/common/domain/InstancesInformation.java @@ -1,4 +1,4 @@ -package com.loadcenter.domain; +package com.loadcenter.common.domain; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/loadcenter/domain/IpAndLoadCount.java b/src/main/java/com/loadcenter/common/domain/IpAndLoadCount.java similarity index 91% rename from src/main/java/com/loadcenter/domain/IpAndLoadCount.java rename to src/main/java/com/loadcenter/common/domain/IpAndLoadCount.java index 3c29af3..7027a3e 100644 --- a/src/main/java/com/loadcenter/domain/IpAndLoadCount.java +++ b/src/main/java/com/loadcenter/common/domain/IpAndLoadCount.java @@ -1,4 +1,4 @@ -package com.loadcenter.domain; +package com.loadcenter.common.domain; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/loadcenter/domain/IpAndWeight.java b/src/main/java/com/loadcenter/common/domain/IpAndWeight.java similarity index 91% rename from src/main/java/com/loadcenter/domain/IpAndWeight.java rename to src/main/java/com/loadcenter/common/domain/IpAndWeight.java index 72c3082..12476d1 100644 --- a/src/main/java/com/loadcenter/domain/IpAndWeight.java +++ b/src/main/java/com/loadcenter/common/domain/IpAndWeight.java @@ -1,4 +1,4 @@ -package com.loadcenter.domain; +package com.loadcenter.common.domain; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/loadcenter/domain/MqttInfo.java b/src/main/java/com/loadcenter/common/domain/MqttInfo.java similarity index 96% rename from src/main/java/com/loadcenter/domain/MqttInfo.java rename to src/main/java/com/loadcenter/common/domain/MqttInfo.java index 0f76bab..e3652bf 100644 --- a/src/main/java/com/loadcenter/domain/MqttInfo.java +++ b/src/main/java/com/loadcenter/common/domain/MqttInfo.java @@ -1,4 +1,4 @@ -package com.loadcenter.domain; +package com.loadcenter.common.domain; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/loadcenter/domain/resp/HttpStatus.java b/src/main/java/com/loadcenter/common/domain/resp/HttpStatus.java similarity index 97% rename from src/main/java/com/loadcenter/domain/resp/HttpStatus.java rename to src/main/java/com/loadcenter/common/domain/resp/HttpStatus.java index 55f2a85..1e0f7d1 100644 --- a/src/main/java/com/loadcenter/domain/resp/HttpStatus.java +++ b/src/main/java/com/loadcenter/common/domain/resp/HttpStatus.java @@ -1,4 +1,4 @@ -package com.loadcenter.domain.resp; +package com.loadcenter.common.domain.resp; /** * 返回状态码 diff --git a/src/main/java/com/loadcenter/domain/resp/Result.java b/src/main/java/com/loadcenter/common/domain/resp/Result.java similarity index 98% rename from src/main/java/com/loadcenter/domain/resp/Result.java rename to src/main/java/com/loadcenter/common/domain/resp/Result.java index 17075b0..2e3d7fe 100644 --- a/src/main/java/com/loadcenter/domain/resp/Result.java +++ b/src/main/java/com/loadcenter/common/domain/resp/Result.java @@ -1,4 +1,4 @@ -package com.loadcenter.domain.resp; +package com.loadcenter.common.domain.resp; import lombok.Data; diff --git a/src/main/java/com/loadcenter/common/redis/service/RedisService.java b/src/main/java/com/loadcenter/common/redis/service/RedisService.java index cb60fec..0f2826c 100644 --- a/src/main/java/com/loadcenter/common/redis/service/RedisService.java +++ b/src/main/java/com/loadcenter/common/redis/service/RedisService.java @@ -143,6 +143,10 @@ public class RedisService { return count == null ? 0 : count; } + public T getCacheListValue(final String key,long index){ + return (T) redisTemplate.opsForList().index(key,index); + } + /** * 获得缓存的list对象 * diff --git a/src/main/java/com/loadcenter/controller/GatewayController.java b/src/main/java/com/loadcenter/controller/GatewayController.java new file mode 100644 index 0000000..5fde14c --- /dev/null +++ b/src/main/java/com/loadcenter/controller/GatewayController.java @@ -0,0 +1,29 @@ +package com.loadcenter.controller; + +import com.loadcenter.common.domain.resp.Result; +import com.loadcenter.service.GatewayLoadService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName GatewayController + * @Description 网关控制器 + * @Author Can.J + * @Date 2024/4/18 16:09 + */ +@RestController +@RequestMapping("/gateway") +public class GatewayController { + + @Autowired + private GatewayLoadService gatewayLoadService; + + @GetMapping("/load/node") + public Result loadNode(){ + + return Result.success(gatewayLoadService.loadNode()); + } + +} diff --git a/src/main/java/com/loadcenter/controller/LoadCenterController.java b/src/main/java/com/loadcenter/controller/LoadCenterController.java index c4fe043..34212c8 100644 --- a/src/main/java/com/loadcenter/controller/LoadCenterController.java +++ b/src/main/java/com/loadcenter/controller/LoadCenterController.java @@ -1,6 +1,6 @@ package com.loadcenter.controller; -import com.loadcenter.domain.resp.Result; +import com.loadcenter.common.domain.resp.Result; import com.loadcenter.service.LoadCenterService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; diff --git a/src/main/java/com/loadcenter/gateway/cache/GatewayLoadNodeCache.java b/src/main/java/com/loadcenter/gateway/cache/GatewayLoadNodeCache.java new file mode 100644 index 0000000..7d4fdd1 --- /dev/null +++ b/src/main/java/com/loadcenter/gateway/cache/GatewayLoadNodeCache.java @@ -0,0 +1,52 @@ +package com.loadcenter.gateway.cache; + +import com.loadcenter.gateway.cache.abs.GatewayCacheAbs; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @ClassName GatewayLoadNodeCache + * @Description 网关负载节点缓存 + * @Author Can.J + * @Date 2024/4/18 15:31 + */ +@Component +public class GatewayLoadNodeCache extends GatewayCacheAbs { + // Redis中存储序列值的键名 + private final static String gatewayLoadNodeKey = "node"; + + @Override + public String getPre() { + return "gateway:load:"; + } + + /** + * 负载集合 + * @param nodeList 节点权重集合 + */ + public void put(List nodeList){ + redisService.deleteObject(encode(gatewayLoadNodeKey)); + redisService.setCacheList(encode(gatewayLoadNodeKey),nodeList); + } + + /** + * 获取所有负载节点 + * @return 负载节点集合 + */ + public List get(){ + return redisService.getCacheList(encode(gatewayLoadNodeKey)); + } + + /** + * 通过下标获取节点 + * @param index 下表 + * @return 指定节点 + */ + public String getByIndex(Long index){ + if(index ==null || index>100){ + throw new RuntimeException("下表违法,0-100"); + } + return redisService.getCacheListValue(encode(gatewayLoadNodeKey),index); + } +} diff --git a/src/main/java/com/loadcenter/gateway/cache/GatewayLoadSeriesCache.java b/src/main/java/com/loadcenter/gateway/cache/GatewayLoadSeriesCache.java new file mode 100644 index 0000000..b475c71 --- /dev/null +++ b/src/main/java/com/loadcenter/gateway/cache/GatewayLoadSeriesCache.java @@ -0,0 +1,57 @@ +package com.loadcenter.gateway.cache; + +import com.loadcenter.common.redis.service.RedisService; +import com.loadcenter.gateway.cache.abs.GatewayCacheAbs; +import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; + +/** + * @ClassName GatewayLoadSeriesCache + * @Description 网关负载序列 + * @Author Can.J + * @Date 2024/4/18 15:04 + */ +@Component +public class GatewayLoadSeriesCache extends GatewayCacheAbs { + // Redis中存储序列值的键名 + private final static String gatewayLoadSeriesKey = "series"; + + + @Override + public String getPre() { + return "gateway:load:"; + } + + /** + * bean创建完成之后执行方法 + * 初始化 只有一个初始化的概念。初始化一定是由内部控制 + */ + @PostConstruct + public void init(){ + redisService.setCacheObject(encode(gatewayLoadSeriesKey),0L); + } + + /** + * 获取当前序列值 + * @return 序列值 + */ + + public Long get(){ + return redisService.getCacheObject(encode(gatewayLoadSeriesKey)); + } + + /** + * 获取自增序列值 + * @return 自增值 + */ + public Long incrementAndGet(){ + return redisService.increment(encode(gatewayLoadSeriesKey),1L); + } + + /** + * 重置序列值为0 + */ + public void reset(){ + this.init(); + } +} diff --git a/src/main/java/com/loadcenter/gateway/cache/GatewayNodeCache.java b/src/main/java/com/loadcenter/gateway/cache/GatewayNodeCache.java new file mode 100644 index 0000000..905ae80 --- /dev/null +++ b/src/main/java/com/loadcenter/gateway/cache/GatewayNodeCache.java @@ -0,0 +1,50 @@ +package com.loadcenter.gateway.cache; + +import com.loadcenter.gateway.cache.abs.GatewayCacheAbs; +import com.loadcenter.gateway.model.GatewayNodeInfo; +import com.loadcenter.common.redis.service.RedisService; +import org.springframework.stereotype.Component; + +/** + * @ClassName GatewayNodeCache + * @Description 网关节点缓存 + * @Author Can.J + * @Date 2024/4/18 14:38 + */ +@Component +public class GatewayNodeCache extends GatewayCacheAbs { + @Override + public String getPre() { + return "gateway:node:info"; + } + + /** + * 增加缓存数据 + * + * @param gatewayNodeInfo 节点信息 + */ + public void put(GatewayNodeInfo gatewayNodeInfo) { + redisService.setCacheObject(encode(gatewayNodeInfo.getNodeId()), gatewayNodeInfo); + } + + + /** + * 获取缓存数据 + * + * @param nodeId 节点id + * @return 节点信息 + */ + public GatewayNodeInfo get(String nodeId) { + return redisService.getCacheObject(encode(nodeId)); + } + + + /** + * 删除网关节点 + * + * @param nodeId 节点id + */ + public void remove(String nodeId) { + redisService.deleteObject(encode(nodeId)); + } +} diff --git a/src/main/java/com/loadcenter/gateway/cache/abs/GatewayCacheAbs.java b/src/main/java/com/loadcenter/gateway/cache/abs/GatewayCacheAbs.java new file mode 100644 index 0000000..40fc067 --- /dev/null +++ b/src/main/java/com/loadcenter/gateway/cache/abs/GatewayCacheAbs.java @@ -0,0 +1,21 @@ +package com.loadcenter.gateway.cache.abs; + +import com.loadcenter.common.redis.service.RedisService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @ClassName GatewayCacheAbs + * @Description 缓存抽象类 + * @Author Can.J + * @Date 2024/4/18 15:35 + */ +public abstract class GatewayCacheAbs { + @Autowired + public RedisService redisService; + + public abstract String getPre(); + + public String encode(K key) { + return getPre() + key; + } +} diff --git a/src/main/java/com/loadcenter/gateway/model/GatewayNodeInfo.java b/src/main/java/com/loadcenter/gateway/model/GatewayNodeInfo.java new file mode 100644 index 0000000..c6e6388 --- /dev/null +++ b/src/main/java/com/loadcenter/gateway/model/GatewayNodeInfo.java @@ -0,0 +1,33 @@ +package com.loadcenter.gateway.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @ClassName GatewayNodeInfo + * @Description 网关节点信息 + * @Author Can.J + * @Date 2024/4/18 14:32 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class GatewayNodeInfo { + /** + * 节点id + */ + private String nodeId; + + /** + * 公网ip + */ + private String publicAddress; + + /** + * 内网ip + */ + private String privateAddress; +} diff --git a/src/main/java/com/loadcenter/service/GatewayLoadService.java b/src/main/java/com/loadcenter/service/GatewayLoadService.java new file mode 100644 index 0000000..7b6e996 --- /dev/null +++ b/src/main/java/com/loadcenter/service/GatewayLoadService.java @@ -0,0 +1,14 @@ +package com.loadcenter.service; +/** + * @ClassName GatewayLoadService + * @Description 网关负载业务 + * @Author Can.J + * @Date 2024/4/18 16:11 + */ +public interface GatewayLoadService { + /** + * 负载节点 + * @return 返回负载节点 + */ + String loadNode(); +} diff --git a/src/main/java/com/loadcenter/service/LoadCenterService.java b/src/main/java/com/loadcenter/service/LoadCenterService.java index 013a9e8..7b3dfe9 100644 --- a/src/main/java/com/loadcenter/service/LoadCenterService.java +++ b/src/main/java/com/loadcenter/service/LoadCenterService.java @@ -1,6 +1,6 @@ package com.loadcenter.service; -import com.loadcenter.domain.resp.Result; +import com.loadcenter.common.domain.resp.Result; /** * @ClassName LoadCenterService diff --git a/src/main/java/com/loadcenter/service/impl/GatewayLoadServiceImpl.java b/src/main/java/com/loadcenter/service/impl/GatewayLoadServiceImpl.java new file mode 100644 index 0000000..e7ff0b3 --- /dev/null +++ b/src/main/java/com/loadcenter/service/impl/GatewayLoadServiceImpl.java @@ -0,0 +1,50 @@ +package com.loadcenter.service.impl; + +import com.loadcenter.gateway.cache.GatewayLoadNodeCache; +import com.loadcenter.gateway.cache.GatewayLoadSeriesCache; +import com.loadcenter.gateway.cache.GatewayNodeCache; +import com.loadcenter.gateway.model.GatewayNodeInfo; +import com.loadcenter.service.GatewayLoadService; +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @ClassName GatewayLoadServiceImpl + * @Description 负载实现层 + * @Author Can.J + * @Date 2024/4/18 16:10 + */ +@Service +@AllArgsConstructor +public class GatewayLoadServiceImpl implements GatewayLoadService { + private final Long nodeLength = 100L; + /** + * 负载信息 + */ + private final GatewayLoadNodeCache gatewayLoadNodeCache; + + /** + * 负载序列 + */ + private final GatewayLoadSeriesCache gatewayLoadSeriesCache; + + /** + * 节点信息 + */ + private final GatewayNodeCache gatewayNodeCache; + + /** + * 负载节点 + * @return 返回负载节点 + */ + @Override + public String loadNode() { + Long seriesLoad = gatewayLoadSeriesCache.incrementAndGet(); + long seriesLoadIndex = seriesLoad % nodeLength; + + String loadNodeId = gatewayLoadNodeCache.getByIndex(seriesLoadIndex); + GatewayNodeInfo gatewayNodeInfo = gatewayNodeCache.get(loadNodeId); + return gatewayNodeInfo.getPublicAddress(); + } +} diff --git a/src/main/java/com/loadcenter/service/impl/LoadCenterServiceImpl.java b/src/main/java/com/loadcenter/service/impl/LoadCenterServiceImpl.java index 36564b9..5f72553 100644 --- a/src/main/java/com/loadcenter/service/impl/LoadCenterServiceImpl.java +++ b/src/main/java/com/loadcenter/service/impl/LoadCenterServiceImpl.java @@ -3,9 +3,9 @@ package com.loadcenter.service.impl; import com.alibaba.fastjson2.JSON; import com.aliyun.ecs20140526.models.DescribeInstancesResponseBody; import com.loadcenter.common.aliyun.service.AliYunEcsService; -import com.loadcenter.domain.IpAndLoadCount; -import com.loadcenter.domain.IpAndWeight; -import com.loadcenter.domain.resp.Result; +import com.loadcenter.common.domain.IpAndLoadCount; +import com.loadcenter.common.domain.IpAndWeight; +import com.loadcenter.common.domain.resp.Result; import com.loadcenter.common.redis.service.RedisService; import com.loadcenter.common.utils.user.UserUtil; import com.loadcenter.common.utils.mqtt.MqttUtil;