From b7d571ccc1ecc1be833dee555ef76e8d9b152a20 Mon Sep 17 00:00:00 2001 From: wujiawei <12345678> Date: Sat, 19 Oct 2024 22:31:41 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=20=20=E9=80=9A=E9=81=93=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0appKey=E3=80=81appSecret=E3=80=81originalIp?= =?UTF-8?q?=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...yNettyServerPropertiesApplicationImpl.java | 4 +- .../config/ClientAutoConfiguration.java | 8 +- ...ttyClientPermeateClientVisitorHandler.java | 1 + .../netty/socket/NettyClientSocket.java | 21 +++- .../heartbeat/common/ChannelContext.java | 22 +++-- .../heartbeat/common/NettyProxyMsg.java | 98 ++++++++++++++++++- .../common/decoder/NettyProxyMsgDecoder.java | 19 ++++ .../common/encoder/NettyProxyMsgEncoder.java | 38 +++++++ .../utils/ChannelAttributeKeyUtils.java | 61 ++++++++++++ .../LazyNettyClusterNodeApplicationImpl.java | 2 +- .../config/HeartbeatServerConfiguration.java | 6 +- ...andleClientConnectSuccessTypeAdvanced.java | 79 ++++++++++----- ...verHandleReportDisconnectTypeAdvanced.java | 24 +++-- ...HandleReportStagingClosedTypeAdvanced.java | 14 ++- ...HandleReportStagingOpenedTypeAdvanced.java | 12 ++- .../LazyClientStatsChangeApplication.java | 18 ++-- ...LazyNettyClientTokenBucketApplication.java | 10 +- .../state/LazyNettyClientLoginCommand.java | 76 ++++++++++++++ .../state/LazyNettyClientMessageCommand.java | 3 +- .../LazyClientStatsChangeApplicationImpl.java | 24 +++-- ...NettyClientTokenBucketApplicationImpl.java | 12 +++ .../LazyNettyClientTokenBucketRepository.java | 9 ++ ...yNettyClientTokenBucketRepositoryImpl.java | 48 +++++++++ .../README.md | 2 +- .../src/main/resources/application-dev.yml | 4 +- 25 files changed, 538 insertions(+), 77 deletions(-) create mode 100644 wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/command/lazy/netty/client/state/LazyNettyClientLoginCommand.java diff --git a/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/application/impl/LazyNettyServerPropertiesApplicationImpl.java b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/application/impl/LazyNettyServerPropertiesApplicationImpl.java index 1db94d3..4959023 100644 --- a/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/application/impl/LazyNettyServerPropertiesApplicationImpl.java +++ b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/application/impl/LazyNettyServerPropertiesApplicationImpl.java @@ -186,10 +186,12 @@ public class LazyNettyServerPropertiesApplicationImpl implements LazyNettyServer String inetHost = lazyNettyServerProperties.getInetHost(); Integer inetPort = lazyNettyServerProperties.getInetPort(); String clientId = lazyNettyServerProperties.getClientId(); + String appKey = lazyNettyServerProperties.getAppKey(); + String appSecret = lazyNettyServerProperties.getAppSecret(); NettyClientSocket nettyClientSocket = new NettyClientSocket(inetHost, inetPort, clientId, - NormalUsedString.DEFAULT, + NormalUsedString.DEFAULT,appKey,appSecret, clientChangeEvent, handleChannelTypeAdvancedList); cacheNettyClientSocketMap.put(lazyNettyServerProperties, nettyClientSocket); diff --git a/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/config/ClientAutoConfiguration.java b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/config/ClientAutoConfiguration.java index 5248d43..b84c32d 100644 --- a/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/config/ClientAutoConfiguration.java +++ b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/config/ClientAutoConfiguration.java @@ -48,7 +48,9 @@ public class ClientAutoConfiguration implements CommandLineRunner { String inetHost = nettyClientProperties.getInetHost(); int inetPort = nettyClientProperties.getInetPort(); String clientId = nettyClientProperties.getClientId(); - return new NettyClientSocket(inetHost, inetPort, clientId, NormalUsedString.DEFAULT, clientChangeEvent, handleChannelTypeAdvancedList); + String appKey = nettyClientProperties.getAppKey(); + String appSecret = nettyClientProperties.getAppSecret(); + return new NettyClientSocket(inetHost, inetPort, clientId, NormalUsedString.DEFAULT, appKey,appSecret,clientChangeEvent, handleChannelTypeAdvancedList); } /** @@ -62,9 +64,11 @@ public class ClientAutoConfiguration implements CommandLineRunner { String inetHost = nettyClientProperties.getInetHost(); int inetPort = nettyClientProperties.getInetPort(); String clientId = nettyClientProperties.getClientId(); + String appKey = nettyClientProperties.getAppKey(); + String appSecret = nettyClientProperties.getAppSecret(); NettyClientSocket nettyClientSocket = new NettyClientSocket( inetHost, inetPort, - clientId, NormalUsedString.DEFAULT, + clientId, NormalUsedString.DEFAULT,appKey,appSecret, clientChangeEvent, handleChannelTypeAdvancedList); Thread thread = new Thread(() -> { try { diff --git a/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/handler/NettyClientPermeateClientVisitorHandler.java b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/handler/NettyClientPermeateClientVisitorHandler.java index 6579250..564cc37 100644 --- a/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/handler/NettyClientPermeateClientVisitorHandler.java +++ b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/handler/NettyClientPermeateClientVisitorHandler.java @@ -127,6 +127,7 @@ public class NettyClientPermeateClientVisitorHandler extends SimpleChannelInbou @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); log.error("exceptionCaught"); } } \ No newline at end of file diff --git a/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/socket/NettyClientSocket.java b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/socket/NettyClientSocket.java index 4a98c8c..36a955d 100644 --- a/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/socket/NettyClientSocket.java +++ b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/socket/NettyClientSocket.java @@ -7,8 +7,8 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import org.framework.lazy.cloud.network.heartbeat.client.netty.filter.NettyClientFilter; import org.framework.lazy.cloud.network.heartbeat.client.netty.event.ClientChangeEvent; +import org.framework.lazy.cloud.network.heartbeat.client.netty.filter.NettyClientFilter; import org.framework.lazy.cloud.network.heartbeat.common.MessageType; import org.framework.lazy.cloud.network.heartbeat.common.NettyProxyMsg; import org.framework.lazy.cloud.network.heartbeat.common.NettyServerContext; @@ -16,6 +16,7 @@ import org.framework.lazy.cloud.network.heartbeat.common.adapter.ChannelTypeAdap import org.framework.lazy.cloud.network.heartbeat.common.advanced.HandleChannelTypeAdvanced; import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils; +import java.net.InetAddress; import java.util.List; import java.util.concurrent.TimeUnit; @@ -43,6 +44,8 @@ public class NettyClientSocket { * 当前连接的服务端ID */ private final String serverId; + private final String appKey; + private final String appSecret; /** * 客户端状态变更事件 */ @@ -50,11 +53,20 @@ public class NettyClientSocket { private final ClientChangeEvent clientChangeEvent; private final List handleChannelTypeAdvancedList; // 处理服务端发送过来的数据类型 - public NettyClientSocket(String inetHost, int inetPort, String clientId, String serverId, ClientChangeEvent clientChangeEvent, List handleChannelTypeAdvancedList) { + public NettyClientSocket(String inetHost, + int inetPort, + String clientId, + String serverId, + String appKey, + String appSecret, + ClientChangeEvent clientChangeEvent, + List handleChannelTypeAdvancedList) { this.inetHost = inetHost; this.inetPort = inetPort; this.clientId = clientId; this.serverId = serverId; + this.appKey = appKey; + this.appSecret = appSecret; this.clientChangeEvent = clientChangeEvent; this.handleChannelTypeAdvancedList = handleChannelTypeAdvancedList; } @@ -78,7 +90,6 @@ public class NettyClientSocket { .option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 1024 * 1024 * 2)) .handler(new NettyClientFilter(new ChannelTypeAdapter(handleChannelTypeAdvancedList), this)) ; - log.info("use clientId:{} connect to server IP:{},server port :{}", clientId, inetHost, inetPort); ChannelFuture future = bootstrap.connect(inetHost, inetPort); // 客户端连接服务端的channel @@ -92,7 +103,11 @@ public class NettyClientSocket { NettyProxyMsg nettyMsg = new NettyProxyMsg(); nettyMsg.setType(MessageType.REPORT_CLIENT_CONNECT_SUCCESS); nettyMsg.setClientId(clientId); + String hostAddress = InetAddress.getLocalHost().getHostAddress(); + nettyMsg.setOriginalIpString(hostAddress); nettyMsg.setData((clientId).getBytes()); + nettyMsg.setAppKeyString(appKey); + nettyMsg.setAppSecretString(appSecret); ChannelAttributeKeyUtils.buildClientId(serviceChannel, clientId); serviceChannel.writeAndFlush(nettyMsg); diff --git a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/ChannelContext.java b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/ChannelContext.java index 9950d9d..325960e 100644 --- a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/ChannelContext.java +++ b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/ChannelContext.java @@ -1,11 +1,11 @@ package org.framework.lazy.cloud.network.heartbeat.common; import io.netty.channel.Channel; -import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -29,17 +29,21 @@ public class ChannelContext { // 如果客户端已经存在 移除 if (channelIdClientChannelDTOConcurrentHashMap.containsKey(clientId)) { // clear(clientId); - List channels = channelIdClientChannelDTOConcurrentHashMap.get(clientId); - for (Channel existChannel : channels) { - if (existChannel != null && !existChannel.isActive()) { - existChannel.close(); - }else { - channels.remove(existChannel); + List existChannelList = new ArrayList<>(); + List oldChannels = channelIdClientChannelDTOConcurrentHashMap.get(clientId); + for (Channel existChannel : oldChannels) { + if (existChannel != null) { + if(existChannel.isActive()){ + existChannelList.add(existChannel); + }else { + existChannel.close(); + } } } - channels.add(channel); + existChannelList.add(channel); + channelIdClientChannelDTOConcurrentHashMap.put(clientId, existChannelList); }else { - channelIdClientChannelDTOConcurrentHashMap.putIfAbsent(clientId, List.of(channel)); + channelIdClientChannelDTOConcurrentHashMap.putIfAbsent(clientId, Collections.synchronizedList(new ArrayList<>(List.of(channel)))); } } diff --git a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/NettyProxyMsg.java b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/NettyProxyMsg.java index fd76d6a..030e1e4 100644 --- a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/NettyProxyMsg.java +++ b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/NettyProxyMsg.java @@ -3,6 +3,7 @@ package org.framework.lazy.cloud.network.heartbeat.common; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.wu.framework.core.utils.ObjectUtils; import java.nio.charset.StandardCharsets; @@ -13,8 +14,8 @@ import java.nio.charset.StandardCharsets; @Setter @Getter public class NettyProxyMsg { - // body 长度 type 1 clientId 4 clientTargetIp 4 clientTargetPort 4 visitorPort 4 visitorId 4 data 4 - public static final int bodyLength = 1 + 1 + 4 + 4 + 4 + 4 + 4 + 4; + // body 长度 type 1 isSsl 1 appKey 4 appSecret 4 clientId 4 originalIp 4 clientTargetIp 4 clientTargetPort 4 visitorPort 4 visitorId 4 data 4 + public static final int bodyLength = 1 + 1 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4; /** @@ -30,8 +31,29 @@ public class NettyProxyMsg { * byte 长度 1 * 1 true * 0 false + * @since 1.2.8 */ private byte isSsl = 0; + /** + * 令牌key + * byte[] 长度 4 + * @since 1.2.8 + */ + private byte[] appKey; + /** + * 令牌密钥 + * byte[] 长度 4 + * + * @since 1.2.9 + */ + private byte[] appSecret; + /** + * 原始IP + * byte[] 长度 4 + * + * @since 1.2.9 + */ + private byte[] originalIp; /** * 客户端ID * byte[] 长度 4 @@ -84,6 +106,78 @@ public class NettyProxyMsg { } + public void setAppKeyString(String appKey) { + if (ObjectUtils.isEmpty(appKey)) { + this.appKey = null; + } else { + this.appKey = appKey.getBytes(StandardCharsets.UTF_8); + } + } + + public void setAppSecretString(String appSecret) { + if (ObjectUtils.isEmpty(appSecret)) { + this.appSecret = null; + } else { + this.appSecret = appSecret.getBytes(StandardCharsets.UTF_8); + } + } + + /** + * 设置原始IP + * + * @param originalIp 原始IP + */ + public void setOriginalIpString(String originalIp) { + if (ObjectUtils.isEmpty(originalIp)) { + this.originalIp = null; + } else { + this.originalIp = originalIp.getBytes(StandardCharsets.UTF_8); + } + } + + /** + * 获取应用密钥 + * + * @return 应用密钥 + */ + public String getAppSecretString() { + if (ObjectUtils.isEmpty(appSecret)) { + return null; + } + return new String(appSecret, StandardCharsets.UTF_8); + } + + /** + * 获取应用key + * + * @return 应用key + */ + public String getAppKeyString() { + if (ObjectUtils.isEmpty(appKey)) { + return null; + } + return new String(appKey, StandardCharsets.UTF_8); + } + + /** + * 获取原始IP字符串 + * + * @return 原始IP字符串 + */ + public String getOriginalIpString() { + if (ObjectUtils.isEmpty(originalIp)) { + return null; + } + return new String(originalIp, StandardCharsets.UTF_8); + } + + public String getClientIdString() { + if (ObjectUtils.isEmpty(clientId)) { + return null; + } + return new String(clientId, StandardCharsets.UTF_8); + } + public void setClientTargetIp(byte[] clientTargetIp) { this.clientTargetIp = clientTargetIp; } diff --git a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/decoder/NettyProxyMsgDecoder.java b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/decoder/NettyProxyMsgDecoder.java index a62a966..68c8865 100644 --- a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/decoder/NettyProxyMsgDecoder.java +++ b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/decoder/NettyProxyMsgDecoder.java @@ -112,6 +112,22 @@ public class NettyProxyMsgDecoder extends LengthFieldBasedFrameDecoder { byte isSsl = in.readByte(); nettyProxyMsg.setIsSsl(isSsl); + + int appKeyLength = in.readInt(); + byte[] appKeyBytes = new byte[appKeyLength]; + in.readBytes(appKeyBytes); + nettyProxyMsg.setAppKey(appKeyBytes); + + int appSecretLength = in.readInt(); + byte[] appSecretBytes = new byte[appSecretLength]; + in.readBytes(appSecretBytes); + nettyProxyMsg.setAppSecret(appSecretBytes); + + int originalIpLength = in.readInt(); + byte[] originalIpBytes = new byte[originalIpLength]; + in.readBytes(originalIpBytes); + nettyProxyMsg.setOriginalIp(originalIpBytes); + int clientIdLength = in.readInt(); byte[] clientIdBytes = new byte[clientIdLength]; in.readBytes(clientIdBytes); @@ -140,6 +156,9 @@ public class NettyProxyMsgDecoder extends LengthFieldBasedFrameDecoder { nettyProxyMsg.setVisitorId(visitorIdBytes); byte[] data = new byte[bodyLength - NettyProxyMsg.bodyLength - + appKeyLength - + appSecretLength - + originalIpLength - clientIdLength - clientTargetIpLength - clientTargetPortLength - diff --git a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/encoder/NettyProxyMsgEncoder.java b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/encoder/NettyProxyMsgEncoder.java index ddc7b0f..e624a8f 100644 --- a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/encoder/NettyProxyMsgEncoder.java +++ b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/encoder/NettyProxyMsgEncoder.java @@ -24,6 +24,9 @@ public class NettyProxyMsgEncoder extends MessageToByteEncoder { int bodyLength = NettyProxyMsg.bodyLength; byte typeBytes = msg.getType(); byte isSsl = msg.getIsSsl(); + byte[] appKey = msg.getAppKey(); + byte[] appSecret = msg.getAppSecret(); + byte[] originalIp = msg.getOriginalIp(); byte[] clientIdBytes = msg.getClientId(); byte[] clientTargetIpBytes = msg.getClientTargetIp(); byte[] clientTargetPortBytes = msg.getClientTargetPort(); @@ -31,6 +34,15 @@ public class NettyProxyMsgEncoder extends MessageToByteEncoder { byte[] visitorIdBytes = msg.getVisitorId(); byte[] msgDataBytes = msg.getData(); + if (appKey != null) { + bodyLength += appKey.length; + } + if (appSecret != null) { + bodyLength += appSecret.length; + } + if (originalIp != null) { + bodyLength += originalIp.length; + } if (clientIdBytes != null) { bodyLength += clientIdBytes.length; } @@ -56,6 +68,32 @@ public class NettyProxyMsgEncoder extends MessageToByteEncoder { out.writeByte(typeBytes); out.writeByte(isSsl); + // 防止数据读错位置 令牌key + if (appKey != null) { + out.writeInt(appKey.length); + out.writeBytes(appKey); + } else { + // 防止令牌key 未填写 + out.writeInt(0x00); + } + + // 防止数据读错位置 令牌密钥 + if (appSecret != null) { + out.writeInt(appSecret.length); + out.writeBytes(appSecret); + } else { + // 防止令牌密钥 未填写 + out.writeInt(0x00); + } + + // 防止数据读错位置 原始IP + if (originalIp != null) { + out.writeInt(originalIp.length); + out.writeBytes(originalIp); + } else { + // 防止原始IP 未填写 + out.writeInt(0x00); + } // 防止数据读错位置 clientId if (clientIdBytes != null) { out.writeInt(clientIdBytes.length); diff --git a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/utils/ChannelAttributeKeyUtils.java b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/utils/ChannelAttributeKeyUtils.java index 74e193d..da743ad 100644 --- a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/utils/ChannelAttributeKeyUtils.java +++ b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/utils/ChannelAttributeKeyUtils.java @@ -11,6 +11,9 @@ public class ChannelAttributeKeyUtils { private static final AttributeKey VISITOR_ID = AttributeKey.newInstance("visitorId"); private static final AttributeKey VISITOR_PORT = AttributeKey.newInstance("visitorPort"); private static final AttributeKey CLIENT_ID = AttributeKey.newInstance("clientId"); + private static final AttributeKey APP_KEY = AttributeKey.newInstance("appKey"); + private static final AttributeKey APP_SECRET = AttributeKey.newInstance("appSecret"); + private static final AttributeKey ORIGINAL_IP = AttributeKey.newInstance("originalIp"); private static final AttributeKey OUT_FLOW = AttributeKey.newInstance("outFlow"); private static final AttributeKey IN_FLOW = AttributeKey.newInstance("inFlow"); @@ -174,4 +177,62 @@ public class ChannelAttributeKeyUtils { public static Channel getTransferNextChannel(Channel channel) { return channel.attr(TRANSFER_NEXT_CHANNEL).get(); } + + + /** + * 为通道绑定 通道中访客端口 + * + * @param channel 通道 + * @param appKey 应用key + */ + public static void buildAppKey(Channel channel, String appKey) { + channel.attr(APP_KEY).set(appKey); + } + + /** + * 获取 通道中 应用key + * + * @param channel 通道 + */ + public static String getAppKey(Channel channel) { + return channel.attr(APP_KEY).get(); + } + + /** + * 为通道绑定 应用密钥 + * + * @param channel 通道 + * @param appSecret 应用密钥 + */ + public static void buildAppSecret(Channel channel, String appSecret) { + channel.attr(APP_SECRET).set(appSecret); + } + + /** + * 获取 通道中 应用密钥 + * + * @param channel 通道 + */ + public static String getAppSecret(Channel channel) { + return channel.attr(APP_SECRET).get(); + } + + /** + * 为通道绑定 原始IP + * + * @param channel 通道 + * @param originalIp 原始IP + */ + public static void buildOriginalIp(Channel channel, String originalIp) { + channel.attr(ORIGINAL_IP).set(originalIp); + } + + /** + * 获取 通道中 原始IP + * + * @param channel 通道 + */ + public static String getOriginalIp(Channel channel) { + return channel.attr(ORIGINAL_IP).get(); + } } diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/cluster/application/impl/LazyNettyClusterNodeApplicationImpl.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/cluster/application/impl/LazyNettyClusterNodeApplicationImpl.java index 78c74cf..1b46543 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/cluster/application/impl/LazyNettyClusterNodeApplicationImpl.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/cluster/application/impl/LazyNettyClusterNodeApplicationImpl.java @@ -182,7 +182,7 @@ public class LazyNettyClusterNodeApplicationImpl implements LazyNettyClusterNode NettyClientSocket nettyClientSocket = new NettyClientSocket(inetHost, inetPort, clusterNodeClientId, - clusterNodeId, + clusterNodeId,null,null, clientChangeEvent, handleChannelTypeAdvancedList); // 过滤已经存在的 boolean anyMatch = cacheClusterNettyClientSocketMap diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/config/HeartbeatServerConfiguration.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/config/HeartbeatServerConfiguration.java index 4471673..49fdb95 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/config/HeartbeatServerConfiguration.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/config/HeartbeatServerConfiguration.java @@ -41,12 +41,14 @@ public class HeartbeatServerConfiguration { LazyNettyClientBlacklistApplication lazyNettyClientBlacklistApplication, LazyInternalNetworkServerPermeateClientMappingApplication lazyInternalNetworkServerPermeateClientMappingApplication, LazyInternalNetworkClientPermeateServerMappingApplication lazyInternalNetworkClientPermeateServerMappingApplication, - LazyInternalNetworkClientPermeateClientMappingApplication lazyInternalNetworkClientPermeateClientMappingApplication) { + LazyInternalNetworkClientPermeateClientMappingApplication lazyInternalNetworkClientPermeateClientMappingApplication, + LazyNettyClientTokenBucketApplication lazyNettyClientTokenBucketApplication) { return new ServerHandleClientConnectSuccessTypeAdvanced(lazyClientStatsChangeApplication, lazyNettyClientBlacklistApplication, lazyInternalNetworkServerPermeateClientMappingApplication, lazyInternalNetworkClientPermeateServerMappingApplication, - lazyInternalNetworkClientPermeateClientMappingApplication); + lazyInternalNetworkClientPermeateClientMappingApplication, + lazyNettyClientTokenBucketApplication); } /** diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleClientConnectSuccessTypeAdvanced.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleClientConnectSuccessTypeAdvanced.java index a58fb6f..3791ba4 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleClientConnectSuccessTypeAdvanced.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleClientConnectSuccessTypeAdvanced.java @@ -12,10 +12,13 @@ import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeK import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.*; import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.permeate.client.mapping.LazyInternalNetworkClientPermeateClientMappingQueryListCommand; import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.permeate.server.mapping.LazyInternalNetworkClientPermeateServerMappingQueryListCommand; +import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand; import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.dto.LazyInternalNetworkClientPermeateClientMappingDTO; import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.dto.LazyInternalNetworkClientPermeateServerMappingDTO; import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.blacklist.LazyNettyClientBlacklist; +import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.token.bucket.LazyNettyClientTokenBucket; import org.springframework.stereotype.Component; +import org.wu.framework.web.response.Result; import java.nio.charset.StandardCharsets; import java.util.List; @@ -35,12 +38,14 @@ public class ServerHandleClientConnectSuccessTypeAdvanced extends AbstractHandle private final LazyInternalNetworkClientPermeateServerMappingApplication lazyInternalNetworkClientPermeateServerMappingApplication; private final LazyInternalNetworkClientPermeateClientMappingApplication lazyInternalNetworkClientPermeateClientMappingApplication; - public ServerHandleClientConnectSuccessTypeAdvanced(LazyClientStatsChangeApplication lazyClientStatsChangeApplication, LazyNettyClientBlacklistApplication lazyNettyClientBlacklistApplication, LazyInternalNetworkServerPermeateClientMappingApplication lazyInternalNetworkServerPermeateClientMappingApplication, LazyInternalNetworkClientPermeateServerMappingApplication lazyInternalNetworkClientPermeateServerMappingApplication, LazyInternalNetworkClientPermeateClientMappingApplication lazyInternalNetworkClientPermeateClientMappingApplication) { + private final LazyNettyClientTokenBucketApplication lazyNettyClientTokenBucketApplication; + public ServerHandleClientConnectSuccessTypeAdvanced(LazyClientStatsChangeApplication lazyClientStatsChangeApplication, LazyNettyClientBlacklistApplication lazyNettyClientBlacklistApplication, LazyInternalNetworkServerPermeateClientMappingApplication lazyInternalNetworkServerPermeateClientMappingApplication, LazyInternalNetworkClientPermeateServerMappingApplication lazyInternalNetworkClientPermeateServerMappingApplication, LazyInternalNetworkClientPermeateClientMappingApplication lazyInternalNetworkClientPermeateClientMappingApplication, LazyNettyClientTokenBucketApplication lazyNettyClientTokenBucketApplication) { this.lazyClientStatsChangeApplication = lazyClientStatsChangeApplication; this.lazyNettyClientBlacklistApplication = lazyNettyClientBlacklistApplication; this.lazyInternalNetworkServerPermeateClientMappingApplication = lazyInternalNetworkServerPermeateClientMappingApplication; this.lazyInternalNetworkClientPermeateServerMappingApplication = lazyInternalNetworkClientPermeateServerMappingApplication; this.lazyInternalNetworkClientPermeateClientMappingApplication = lazyInternalNetworkClientPermeateClientMappingApplication; + this.lazyNettyClientTokenBucketApplication = lazyNettyClientTokenBucketApplication; } @@ -54,10 +59,17 @@ public class ServerHandleClientConnectSuccessTypeAdvanced extends AbstractHandle public void doHandler(Channel newChannel, NettyProxyMsg msg) { - String clientId = new String(msg.getClientId()); + String clientId = msg.getClientIdString(); + String appKey = msg.getAppKeyString(); + String appSecret = msg.getAppSecretString(); + String originalIp = msg.getOriginalIpString(); ChannelContext.push(newChannel, clientId); ChannelAttributeKeyUtils.buildClientId(newChannel, clientId); + ChannelAttributeKeyUtils.buildAppKey(newChannel, appKey); + ChannelAttributeKeyUtils.buildAppSecret(newChannel, appSecret); + ChannelAttributeKeyUtils.buildOriginalIp(newChannel, originalIp); + // 客户端:{},IP:{}连接成功 log.info("Client: {}, IP: {} Connection successful", new String(msg.getClientId()), newChannel.remoteAddress().toString()); // 验证客户端是否时黑名单 @@ -66,31 +78,46 @@ public class ServerHandleClientConnectSuccessTypeAdvanced extends AbstractHandle lazyNettyClientBlacklist.setIsDeleted(false); lazyNettyClientBlacklistApplication.exists(lazyNettyClientBlacklist).accept(exists -> { if (!exists) { - // 服务状态在线 - lazyClientStatsChangeApplication.clientOnLine(clientId); - // 当前在线客户端数量:{} - log.info("Current number of online clients: {}", ChannelContext.getClientIds().size()); - // 所有的客户端ID - List clientIdList = ChannelContext.getClientIds(); + // 认证验证 + Result existsTokenResult = lazyNettyClientTokenBucketApplication.certificationToken(clientId, appKey, appSecret); + Boolean existsToken= existsTokenResult.getData(); + if(existsToken){ + // 服务状态在线 + LazyNettyClientLoginCommand lazyNettyClientLoginCommand = new LazyNettyClientLoginCommand(); + lazyNettyClientLoginCommand.setClientId(clientId); + lazyNettyClientLoginCommand.setAppKey(appKey); + lazyNettyClientLoginCommand.setAppSecret(appSecret); + lazyNettyClientLoginCommand.setOriginalIp(originalIp); + lazyClientStatsChangeApplication.clientOnLine(lazyNettyClientLoginCommand); + // 当前在线客户端数量:{} + log.info("Current number of online clients: {}", ChannelContext.getClientIds().size()); + // 所有的客户端ID + List clientIdList = ChannelContext.getClientIds(); + + // TODO 多副本本地channel 无法共享问题 + // 通知所有客户端有人上线了 + ChannelContext.getChannels().forEach((existClientId, channels) -> { + NettyProxyMsg nettyMsg = new NettyProxyMsg(); + nettyMsg.setType(MessageType.DISTRIBUTE_CLIENT_CONNECTION_SUCCESS_NOTIFICATION); + nettyMsg.setData((JSON.toJSONString(clientIdList) + .getBytes(StandardCharsets.UTF_8))); + // 发送所有客户端ID + for (Channel channel : channels) { + channel.writeAndFlush(nettyMsg); + } + }); + // 开始开启客户端:【{}】,端口映射 + log.info("Start opening client: [{}], port mapping", clientId); + // 创建访问者(内网穿透连接创建) + lazyInternalNetworkServerPermeateClientMappingApplication.createVisitor(clientId); + // 结束开启客户端:【{}】,端口映射 + log.info("End opening client: [{}], port mapping", clientId); + }else { + // 关闭通道 + log.warn("无法认证客户端:【{}】",clientId); + newChannel.close(); + } - // TODO 多副本本地channel 无法共享问题 - // 通知所有客户端有人上线了 - ChannelContext.getChannels().forEach((existClientId, channels) -> { - NettyProxyMsg nettyMsg = new NettyProxyMsg(); - nettyMsg.setType(MessageType.DISTRIBUTE_CLIENT_CONNECTION_SUCCESS_NOTIFICATION); - nettyMsg.setData((JSON.toJSONString(clientIdList) - .getBytes(StandardCharsets.UTF_8))); - // 发送所有客户端ID - for (Channel channel : channels) { - channel.writeAndFlush(nettyMsg); - } - }); - // 开始开启客户端:【{}】,端口映射 - log.info("Start opening client: [{}], port mapping", clientId); - // 创建访问者(内网穿透连接创建) - lazyInternalNetworkServerPermeateClientMappingApplication.createVisitor(clientId); - // 结束开启客户端:【{}】,端口映射 - log.info("End opening client: [{}], port mapping", clientId); } else { // 黑名单客户端 diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleReportDisconnectTypeAdvanced.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleReportDisconnectTypeAdvanced.java index 7f15bde..6b6bf10 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleReportDisconnectTypeAdvanced.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleReportDisconnectTypeAdvanced.java @@ -2,15 +2,16 @@ package org.framework.lazy.cloud.network.heartbeat.server.netty.advanced; import io.netty.channel.Channel; -import io.netty.channel.ChannelId; import lombok.extern.slf4j.Slf4j; import org.framework.lazy.cloud.network.heartbeat.common.ChannelContext; import org.framework.lazy.cloud.network.heartbeat.common.MessageType; import org.framework.lazy.cloud.network.heartbeat.common.NettyClientVisitorContext; import org.framework.lazy.cloud.network.heartbeat.common.NettyProxyMsg; import org.framework.lazy.cloud.network.heartbeat.common.advanced.server.AbstractHandleReportDisconnectTypeAdvanced; +import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils; import org.framework.lazy.cloud.network.heartbeat.server.netty.socket.NettyServerPermeateClientVisitorSocket; import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.LazyClientStatsChangeApplication; +import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand; import org.springframework.stereotype.Component; import org.wu.framework.core.utils.ObjectUtils; @@ -40,14 +41,21 @@ public class ServerHandleReportDisconnectTypeAdvanced extends AbstractHandleRepo @Override public void doHandler(Channel deathChannel, NettyProxyMsg msg) { // 关闭连接通知 - byte[] clientId = msg.getClientId(); - log.warn("close client :{} channel", new String(clientId)); + String clientId = msg.getClientIdString(); + log.warn("close client :{} channel", clientId); Channel deathClientChannelDTO = ChannelContext.getLoadBalance(clientId); - + String appKey = ChannelAttributeKeyUtils.getAppKey(deathChannel); + String appSecret = ChannelAttributeKeyUtils.getAppSecret(deathChannel); + String originalIp = ChannelAttributeKeyUtils.getOriginalIp(deathChannel); if (deathClientChannelDTO != null) { // 服务状态离线 - String tenantId = new String(clientId); - lazyClientStatsChangeApplication.clientOffLine(tenantId); + + LazyNettyClientLoginCommand lazyNettyClientLoginCommand = new LazyNettyClientLoginCommand(); + lazyNettyClientLoginCommand.setClientId(clientId); + lazyNettyClientLoginCommand.setAppKey(appKey); + lazyNettyClientLoginCommand.setAppSecret(appSecret); + lazyNettyClientLoginCommand.setOriginalIp(originalIp); + lazyClientStatsChangeApplication.clientOffLine(lazyNettyClientLoginCommand); ChannelContext.remove(clientId); // 通知其他客户端 channelId 关闭了 @@ -57,12 +65,12 @@ public class ServerHandleReportDisconnectTypeAdvanced extends AbstractHandleRepo NettyProxyMsg nettyMsg = new NettyProxyMsg(); nettyMsg.setType(MessageType.DISTRIBUTE_CLIENT_DISCONNECTION_NOTIFICATION); nettyMsg.setClientId(clientId); - nettyMsg.setData(clientId); + nettyMsg.setData(clientId.getBytes(StandardCharsets.UTF_8)); channel.writeAndFlush(nettyMsg); // 暂存通知 NettyProxyMsg stagingNettyProxyMsg = new NettyProxyMsg(); stagingNettyProxyMsg.setType(MessageType.DISTRIBUTE_CLIENT_STAGING_OPENED_NOTIFICATION); - stagingNettyProxyMsg.setData(clientId); + stagingNettyProxyMsg.setData(clientId.getBytes(StandardCharsets.UTF_8)); stagingNettyProxyMsg.setClientId(clientId); channel.writeAndFlush(stagingNettyProxyMsg); } diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleReportStagingClosedTypeAdvanced.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleReportStagingClosedTypeAdvanced.java index be15ebd..7bb5121 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleReportStagingClosedTypeAdvanced.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleReportStagingClosedTypeAdvanced.java @@ -3,7 +3,9 @@ package org.framework.lazy.cloud.network.heartbeat.server.netty.advanced; import io.netty.channel.Channel; import io.netty.channel.ChannelId; import lombok.extern.slf4j.Slf4j; +import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils; import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.LazyClientStatsChangeApplication; +import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand; import org.springframework.stereotype.Component; import org.framework.lazy.cloud.network.heartbeat.common.ChannelContext; import org.framework.lazy.cloud.network.heartbeat.common.MessageType; @@ -33,13 +35,23 @@ public class ServerHandleReportStagingClosedTypeAdvanced extends AbstractHandleR */ @Override protected void doHandler(Channel stagingClosedChannel, NettyProxyMsg msg) { + + String appKey = ChannelAttributeKeyUtils.getAppKey(stagingClosedChannel); + String appSecret = ChannelAttributeKeyUtils.getAppSecret(stagingClosedChannel); + String originalIp = ChannelAttributeKeyUtils.getOriginalIp(stagingClosedChannel); + byte[] clientIdBytes = msg.getClientId(); // 获取所有通道 List stagingOpenedClientChannel = ChannelContext.get(clientIdBytes); if (stagingOpenedClientChannel != null) { String clientId = new String(clientIdBytes); // 存储当前客户端暂存关闭 - lazyClientStatsChangeApplication.stagingClosed(clientId); + LazyNettyClientLoginCommand lazyNettyClientLoginCommand = new LazyNettyClientLoginCommand(); + lazyNettyClientLoginCommand.setClientId(clientId); + lazyNettyClientLoginCommand.setAppKey(appKey); + lazyNettyClientLoginCommand.setAppSecret(appSecret); + lazyNettyClientLoginCommand.setOriginalIp(originalIp); + lazyClientStatsChangeApplication.stagingClosed(lazyNettyClientLoginCommand); ChannelContext.getChannels().forEach((existClientId, channels) -> { for (Channel channel : channels) { // 告诉他们 当前参数这个通道 暂存关闭了 diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleReportStagingOpenedTypeAdvanced.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleReportStagingOpenedTypeAdvanced.java index 4ba04d1..8fdf4af 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleReportStagingOpenedTypeAdvanced.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/netty/advanced/ServerHandleReportStagingOpenedTypeAdvanced.java @@ -6,7 +6,9 @@ import org.framework.lazy.cloud.network.heartbeat.common.ChannelContext; import org.framework.lazy.cloud.network.heartbeat.common.MessageType; import org.framework.lazy.cloud.network.heartbeat.common.NettyProxyMsg; import org.framework.lazy.cloud.network.heartbeat.common.advanced.server.AbstractHandleReportStagingOpenedTypeAdvanced; +import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils; import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.LazyClientStatsChangeApplication; +import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand; import org.springframework.stereotype.Component; import java.nio.charset.StandardCharsets; @@ -35,13 +37,21 @@ public class ServerHandleReportStagingOpenedTypeAdvanced extends AbstractHandleR protected void doHandler(Channel stagingOpenedChannel, NettyProxyMsg msg) { // 获取所有通道 byte[] clientIdBytes = msg.getClientId(); + String appKey = ChannelAttributeKeyUtils.getAppKey(stagingOpenedChannel); + String appSecret = ChannelAttributeKeyUtils.getAppSecret(stagingOpenedChannel); + String originalIp = ChannelAttributeKeyUtils.getOriginalIp(stagingOpenedChannel); List stagingOpenedClientChannel = ChannelContext.get(clientIdBytes); if (stagingOpenedClientChannel != null) { ChannelContext.getChannels().forEach((existClientId, channels) -> { for (Channel channel : channels) { // 存储当前客户端暂存关闭 String clientId = new String(clientIdBytes); - lazyClientStatsChangeApplication.stagingOpened(clientId); + LazyNettyClientLoginCommand lazyNettyClientLoginCommand = new LazyNettyClientLoginCommand(); + lazyNettyClientLoginCommand.setClientId(clientId); + lazyNettyClientLoginCommand.setAppKey(appKey); + lazyNettyClientLoginCommand.setAppSecret(appSecret); + lazyNettyClientLoginCommand.setOriginalIp(originalIp); + lazyClientStatsChangeApplication.stagingOpened(lazyNettyClientLoginCommand); // 告诉他们 当前参数这个通道 暂存开启了 NettyProxyMsg nettyMsg = new NettyProxyMsg(); nettyMsg.setType(MessageType.DISTRIBUTE_CLIENT_STAGING_OPENED_NOTIFICATION); diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/LazyClientStatsChangeApplication.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/LazyClientStatsChangeApplication.java index b5f61cf..7fcb071 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/LazyClientStatsChangeApplication.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/LazyClientStatsChangeApplication.java @@ -1,5 +1,7 @@ package org.framework.lazy.cloud.network.heartbeat.server.standalone.application; +import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand; + /** * 云下心跳客户端操作 nacos 配置 */ @@ -9,30 +11,30 @@ public interface LazyClientStatsChangeApplication { /** * 客户端在线 * - * @param clientId 客户端ID + * @param lazyNettyClientLoginCommand 客户端状态 */ - void clientOnLine(String clientId); + void clientOnLine(LazyNettyClientLoginCommand lazyNettyClientLoginCommand); /** * 客户端离线 * - * @param clientId 客户端ID + * @param lazyNettyClientLoginCommand 客户端状态 */ - void clientOffLine(String clientId); + void clientOffLine(LazyNettyClientLoginCommand lazyNettyClientLoginCommand); /** * 客户端暂存关闭 * - * @param clientId 客户端ID + * @param lazyNettyClientLoginCommand 客户端状态 */ - void stagingClosed(String clientId); + void stagingClosed(LazyNettyClientLoginCommand lazyNettyClientLoginCommand); /** * 客户端暂存开启 * - * @param clientId 客户端ID + * @param lazyNettyClientLoginCommand 客户端状态 */ - void stagingOpened(String clientId); + void stagingOpened(LazyNettyClientLoginCommand lazyNettyClientLoginCommand); } diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/LazyNettyClientTokenBucketApplication.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/LazyNettyClientTokenBucketApplication.java index 70d1025..fece865 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/LazyNettyClientTokenBucketApplication.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/LazyNettyClientTokenBucketApplication.java @@ -1,7 +1,6 @@ package org.framework.lazy.cloud.network.heartbeat.server.standalone.application; import org.wu.framework.web.response.Result; -import org.wu.framework.web.response.ResultFactory; import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.token.bucket.LazyNettyClientTokenBucket; import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.token.bucket.LazyNettyClientTokenBucketRemoveCommand; import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.token.bucket.LazyNettyClientTokenBucketStoryCommand; @@ -106,4 +105,13 @@ public interface LazyNettyClientTokenBucketApplication { Result remove(LazyNettyClientTokenBucketRemoveCommand lazyNettyClientTokenBucketRemoveCommand); + /** + * 认证验证 + * + * @param clientId 客户端ID + * @param appKey key + * @param appSecret 令牌 + * @return 布尔类型 + */ + Result certificationToken(String clientId, String appKey, String appSecret); } \ No newline at end of file diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/command/lazy/netty/client/state/LazyNettyClientLoginCommand.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/command/lazy/netty/client/state/LazyNettyClientLoginCommand.java new file mode 100644 index 0000000..6fd5a66 --- /dev/null +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/command/lazy/netty/client/state/LazyNettyClientLoginCommand.java @@ -0,0 +1,76 @@ +package org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; +import org.framework.lazy.cloud.network.heartbeat.common.enums.NettyClientStatus; +import org.wu.framework.lazy.orm.core.persistence.reverse.lazy.ddd.DefaultDDDLazyStoryCommand; + +import java.time.LocalDateTime; + +/** + * describe 客户端登陆信息 + * + * @author Jia wei Wu + * @date 2023/12/27 03:46 下午 + * @see DefaultDDDLazyStoryCommand + **/ +@Data +@Accessors(chain = true) +@Schema(title = "lazy_netty_client_login_command", description = "客户端登陆信息") +public class LazyNettyClientLoginCommand { + + + /** + * 客户端ID + */ + @Schema(description = "客户端ID", name = "clientId", example = "") + private String clientId; + + /** + * 创建时间 + */ + @Schema(description = "创建时间", name = "createTime", example = "") + private LocalDateTime createTime; + + /** + * 在线状态(true在线,false离线) + */ + @Schema(description = "在线状态(true在线,false离线)", name = "onLineState", example = "") + private NettyClientStatus onLineState; + + /** + * 暂存状态(开启、关闭) + */ + @Schema(description = "暂存状态(开启、关闭)", name = "staging", example = "") + private String stagingState; + + /** + * 服务端ID + */ + @Schema(description = "服务端ID", name = "serverId", example = "") + private String serverId; + + /** + * 令牌key + * byte[] 长度 4 + * + * @since 1.2.8 + */ + private String appKey; + /** + * 令牌密钥 + * byte[] 长度 4 + * + * @since 1.2.9 + */ + private String appSecret; + /** + * 原始IP + * byte[] 长度 4 + * + * @since 1.2.9 + */ + private String originalIp; + +} \ No newline at end of file diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/command/lazy/netty/client/state/LazyNettyClientMessageCommand.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/command/lazy/netty/client/state/LazyNettyClientMessageCommand.java index a147c5c..b981f43 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/command/lazy/netty/client/state/LazyNettyClientMessageCommand.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/command/lazy/netty/client/state/LazyNettyClientMessageCommand.java @@ -29,7 +29,8 @@ public class LazyNettyClientMessageCommand { * 发送的消息 */ @Schema(description = "发送的消息", name = "message", example = "") - private String message; /** + private String message; + /** * 服务端ID */ @Schema(description = "服务端ID", name = "serverId", example = "") diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/impl/LazyClientStatsChangeApplicationImpl.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/impl/LazyClientStatsChangeApplicationImpl.java index 457355c..352f0cf 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/impl/LazyClientStatsChangeApplicationImpl.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/impl/LazyClientStatsChangeApplicationImpl.java @@ -3,6 +3,7 @@ package org.framework.lazy.cloud.network.heartbeat.server.standalone.application import org.framework.lazy.cloud.network.heartbeat.server.properties.ServerNodeProperties; import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.LazyClientStatsChangeApplication; +import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand; import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.state.LazyNettyClientState; import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.state.record.LazyNettyClientStateRecord; import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.state.record.LazyNettyClientStateRecordRepository; @@ -46,10 +47,11 @@ public class LazyClientStatsChangeApplicationImpl implements LazyClientStatsChan /** * 客户端在线 * - * @param clientId 客户端ID + * @param lazyNettyClientLoginCommand 客户端ID */ @Override - public void clientOnLine(String clientId) { + public void clientOnLine(LazyNettyClientLoginCommand lazyNettyClientLoginCommand) { + String clientId = lazyNettyClientLoginCommand.getClientId(); // 如果可以已经在线状态不推送 String clientStatusKey = ClientConfigKeyUtils.getClientStatusKey(clientId); // stringRedisTemplate.opsForValue().set(clientStatusKey, NettyClientStatus.ON_LINE.name()); @@ -70,10 +72,11 @@ public class LazyClientStatsChangeApplicationImpl implements LazyClientStatsChan /** * 客户端离线 * - * @param clientId 客户端ID + * @param lazyNettyClientLoginCommand 客户端ID */ @Override - public void clientOffLine(String clientId) { + public void clientOffLine(LazyNettyClientLoginCommand lazyNettyClientLoginCommand) { + String clientId = lazyNettyClientLoginCommand.getClientId(); // 如果可以已经在线状态不推送 String clientStatusKey = ClientConfigKeyUtils.getClientStatusKey(clientId); // stringRedisTemplate.opsForValue().set(clientStatusKey, NettyClientStatus.OFF_LINE.name()); @@ -89,7 +92,7 @@ public class LazyClientStatsChangeApplicationImpl implements LazyClientStatsChan storyClientStateRecord(clientId,serverId,NettyClientStatus.OFF_LINE.name(),null); // // 触发暂存扫描 // ClientOnLineState clientOnLineState = new ClientOnLineState(); -// clientOnLineState.setClientId(clientId); +// clientOnLineState.setClientId(lazyNettyClientLoginCommand); // clientOnLineState.setOnLineState(NettyClientStatus.OFF_LINE.name()); // stringRedisTemplate.convertAndSend(REDIS_CLIENT_ONLINE_OR_OFFLINE_CHANNEL,clientOnLineState); @@ -98,10 +101,11 @@ public class LazyClientStatsChangeApplicationImpl implements LazyClientStatsChan /** * 客户端暂存关闭 * - * @param clientId 客户端ID + * @param lazyNettyClientLoginCommand 客户端ID */ @Override - public void stagingClosed(String clientId) { + public void stagingClosed(LazyNettyClientLoginCommand lazyNettyClientLoginCommand) { + String clientId = lazyNettyClientLoginCommand.getClientId(); LazyNettyClientState lazyNettyClientState = new LazyNettyClientState(); lazyNettyClientState.setClientId(clientId); lazyNettyClientState.setStagingState("CLOSED"); @@ -114,10 +118,12 @@ public class LazyClientStatsChangeApplicationImpl implements LazyClientStatsChan /** * 客户端暂存开启 * - * @param clientId 客户端ID + * @param clientId 客户端ID + * @param lazyNettyClientLoginCommand */ @Override - public void stagingOpened(String clientId) { + public void stagingOpened(LazyNettyClientLoginCommand lazyNettyClientLoginCommand) { + String clientId = lazyNettyClientLoginCommand.getClientId(); LazyNettyClientState lazyNettyClientState = new LazyNettyClientState(); lazyNettyClientState.setClientId(clientId); lazyNettyClientState.setStagingState("OPENED"); diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/impl/LazyNettyClientTokenBucketApplicationImpl.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/impl/LazyNettyClientTokenBucketApplicationImpl.java index 96a7a3d..ad9f408 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/impl/LazyNettyClientTokenBucketApplicationImpl.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/application/impl/LazyNettyClientTokenBucketApplicationImpl.java @@ -143,4 +143,16 @@ public class LazyNettyClientTokenBucketApplicationImpl implements LazyNettyClien return lazyNettyClientTokenBucketRepository.remove(lazyNettyClientTokenBucket); } + /** + * 认证验证 + * + * @param clientId 客户端ID + * @param appKey key + * @param appSecret 令牌 + * @return 布尔类型 + */ + @Override + public Result certificationToken(String clientId, String appKey, String appSecret) { + return lazyNettyClientTokenBucketRepository.certificationToken(clientId,appKey,appSecret); + } } \ No newline at end of file diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/domain/model/lazy/netty/client/token/bucket/LazyNettyClientTokenBucketRepository.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/domain/model/lazy/netty/client/token/bucket/LazyNettyClientTokenBucketRepository.java index 8d6a457..f171205 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/domain/model/lazy/netty/client/token/bucket/LazyNettyClientTokenBucketRepository.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/domain/model/lazy/netty/client/token/bucket/LazyNettyClientTokenBucketRepository.java @@ -103,4 +103,13 @@ public interface LazyNettyClientTokenBucketRepository { Result exists(LazyNettyClientTokenBucket lazyNettyClientTokenBucket); + /** + * 认证验证 + * + * @param clientId 客户端ID + * @param appKey key + * @param appSecret 令牌 + * @return 布尔类型 + */ + Result certificationToken(String clientId, String appKey, String appSecret); } \ No newline at end of file diff --git a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/infrastructure/persistence/LazyNettyClientTokenBucketRepositoryImpl.java b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/infrastructure/persistence/LazyNettyClientTokenBucketRepositoryImpl.java index b1bb664..ec3310a 100644 --- a/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/infrastructure/persistence/LazyNettyClientTokenBucketRepositoryImpl.java +++ b/wu-lazy-cloud-heartbeat-server/src/main/java/org/framework/lazy/cloud/network/heartbeat/server/standalone/infrastructure/persistence/LazyNettyClientTokenBucketRepositoryImpl.java @@ -8,10 +8,12 @@ import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructu import org.springframework.stereotype.Repository; import org.wu.framework.lazy.orm.database.lambda.domain.LazyPage; import org.wu.framework.lazy.orm.database.lambda.stream.lambda.LazyLambdaStream; +import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazyUpdateSetValueWrappers; import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazyWrappers; import org.wu.framework.web.response.Result; import org.wu.framework.web.response.ResultFactory; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; @@ -144,4 +146,50 @@ public class LazyNettyClientTokenBucketRepositoryImpl implements LazyNettyClient return ResultFactory.successOf(exists); } + /** + * 认证验证 + * + * @param clientId 客户端ID + * @param appKey key + * @param appSecret 令牌 + * @return 布尔类型 + */ + @Override + public Result certificationToken(String clientId, String appKey, String appSecret) { + // 验证客户端与令牌 + boolean exists = lazyLambdaStream.exists(LazyWrappers + .lambdaWrapper() + .eq(LazyNettyClientTokenBucketDO::getUsedByClientId, clientId) + .eq(LazyNettyClientTokenBucketDO::getAppKey, appKey) + .eq(LazyNettyClientTokenBucketDO::getAppSecret, appSecret) + ); + if (exists) { + return ResultFactory.successOf(true); + } + // 验证令牌是否未被占用 + boolean hasCanUseToken = lazyLambdaStream.exists(LazyWrappers + .lambdaWrapper() + .isNull(LazyNettyClientTokenBucketDO::getUsedByClientId) + .eq(LazyNettyClientTokenBucketDO::getAppKey, appKey) + .eq(LazyNettyClientTokenBucketDO::getAppSecret, appSecret) + ); + if (hasCanUseToken) { + // 绑定客户端ID + + lazyLambdaStream.update( + LazyUpdateSetValueWrappers.lambdaWrapper() + .set(LazyNettyClientTokenBucketDO::getUsedByClientId, clientId) + .set(LazyNettyClientTokenBucketDO::getUpdateTime, LocalDateTime.now()) + , + LazyWrappers + .lambdaWrapper() + .eq(LazyNettyClientTokenBucketDO::getAppKey, appKey) + .eq(LazyNettyClientTokenBucketDO::getAppSecret, appSecret) + ); + return ResultFactory.successOf(true); + } + + + return ResultFactory.successOf(false); + } } \ No newline at end of file diff --git a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/README.md b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/README.md index 07aaa52..da6871b 100644 --- a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/README.md +++ b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/README.md @@ -38,7 +38,7 @@ docker run -d -it --privileged --name client -p 6004:6004 registry.cn-hangzhou.a ``` ```shell -docker run -d -it --privileged --name client --restart=always -e spring.lazy.netty.client.inet-host=124.222.48.62 -e spring.lazy.netty.client.inet-port=30676 -e spring.lazy.netty.client.client-id="shihua" registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-client-start:1.2.9-JDK17-SNAPSHOT +docker run -d -it --privileged --name client --restart=always -e spring.lazy.netty.client.inet-host=124.222.48.62 -e spring.lazy.netty.client.inet-port=30676 -e spring.lazy.netty.client.client-id="ziguang" registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-client-start:1.2.8-JDK17-NATIVE-SNAPSHOT ``` ```yaml diff --git a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/src/main/resources/application-dev.yml b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/src/main/resources/application-dev.yml index 341da25..e29cfe7 100644 --- a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/src/main/resources/application-dev.yml +++ b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/src/main/resources/application-dev.yml @@ -4,10 +4,12 @@ spring: client: # inet-host: 124.222.48.62 # inet-port: 30676 +# inet-host: 124.222.48.62 +# inet-port: 30560 inet-host: 127.0.0.1 inet-port: 7001 inet-path: wu-lazy-cloud-heartbeat-server - client-id: my-home # 客户端ID + client-id: wujiawei # 客户端ID app-key: key app-secret: secret # inet-host: 124.222.48.62 # 服务端地址