mirror of
https://gitee.com/wujiawei1207537021/wu-lazy-cloud-network.git
synced 2025-06-06 21:37:56 +08:00
[fix] 通道数据添加appKey、appSecret、originalIp验证
This commit is contained in:
parent
55ce3ff359
commit
b7d571ccc1
@ -186,10 +186,12 @@ public class LazyNettyServerPropertiesApplicationImpl implements LazyNettyServer
|
|||||||
String inetHost = lazyNettyServerProperties.getInetHost();
|
String inetHost = lazyNettyServerProperties.getInetHost();
|
||||||
Integer inetPort = lazyNettyServerProperties.getInetPort();
|
Integer inetPort = lazyNettyServerProperties.getInetPort();
|
||||||
String clientId = lazyNettyServerProperties.getClientId();
|
String clientId = lazyNettyServerProperties.getClientId();
|
||||||
|
String appKey = lazyNettyServerProperties.getAppKey();
|
||||||
|
String appSecret = lazyNettyServerProperties.getAppSecret();
|
||||||
|
|
||||||
NettyClientSocket nettyClientSocket = new
|
NettyClientSocket nettyClientSocket = new
|
||||||
NettyClientSocket(inetHost, inetPort, clientId,
|
NettyClientSocket(inetHost, inetPort, clientId,
|
||||||
NormalUsedString.DEFAULT,
|
NormalUsedString.DEFAULT,appKey,appSecret,
|
||||||
clientChangeEvent, handleChannelTypeAdvancedList);
|
clientChangeEvent, handleChannelTypeAdvancedList);
|
||||||
cacheNettyClientSocketMap.put(lazyNettyServerProperties, nettyClientSocket);
|
cacheNettyClientSocketMap.put(lazyNettyServerProperties, nettyClientSocket);
|
||||||
|
|
||||||
|
@ -48,7 +48,9 @@ public class ClientAutoConfiguration implements CommandLineRunner {
|
|||||||
String inetHost = nettyClientProperties.getInetHost();
|
String inetHost = nettyClientProperties.getInetHost();
|
||||||
int inetPort = nettyClientProperties.getInetPort();
|
int inetPort = nettyClientProperties.getInetPort();
|
||||||
String clientId = nettyClientProperties.getClientId();
|
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();
|
String inetHost = nettyClientProperties.getInetHost();
|
||||||
int inetPort = nettyClientProperties.getInetPort();
|
int inetPort = nettyClientProperties.getInetPort();
|
||||||
String clientId = nettyClientProperties.getClientId();
|
String clientId = nettyClientProperties.getClientId();
|
||||||
|
String appKey = nettyClientProperties.getAppKey();
|
||||||
|
String appSecret = nettyClientProperties.getAppSecret();
|
||||||
NettyClientSocket nettyClientSocket = new NettyClientSocket(
|
NettyClientSocket nettyClientSocket = new NettyClientSocket(
|
||||||
inetHost, inetPort,
|
inetHost, inetPort,
|
||||||
clientId, NormalUsedString.DEFAULT,
|
clientId, NormalUsedString.DEFAULT,appKey,appSecret,
|
||||||
clientChangeEvent, handleChannelTypeAdvancedList);
|
clientChangeEvent, handleChannelTypeAdvancedList);
|
||||||
Thread thread = new Thread(() -> {
|
Thread thread = new Thread(() -> {
|
||||||
try {
|
try {
|
||||||
|
@ -127,6 +127,7 @@ public class NettyClientPermeateClientVisitorHandler extends SimpleChannelInbou
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
||||||
|
cause.printStackTrace();
|
||||||
log.error("exceptionCaught");
|
log.error("exceptionCaught");
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -7,8 +7,8 @@ import io.netty.channel.nio.NioEventLoopGroup;
|
|||||||
import io.netty.channel.socket.nio.NioSocketChannel;
|
import io.netty.channel.socket.nio.NioSocketChannel;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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.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.MessageType;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.NettyProxyMsg;
|
import org.framework.lazy.cloud.network.heartbeat.common.NettyProxyMsg;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.NettyServerContext;
|
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.advanced.HandleChannelTypeAdvanced;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
|
||||||
|
|
||||||
|
import java.net.InetAddress;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@ -43,6 +44,8 @@ public class NettyClientSocket {
|
|||||||
* 当前连接的服务端ID
|
* 当前连接的服务端ID
|
||||||
*/
|
*/
|
||||||
private final String serverId;
|
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 ClientChangeEvent clientChangeEvent;
|
||||||
private final List<HandleChannelTypeAdvanced> handleChannelTypeAdvancedList; // 处理服务端发送过来的数据类型
|
private final List<HandleChannelTypeAdvanced> handleChannelTypeAdvancedList; // 处理服务端发送过来的数据类型
|
||||||
|
|
||||||
public NettyClientSocket(String inetHost, int inetPort, String clientId, String serverId, ClientChangeEvent clientChangeEvent, List<HandleChannelTypeAdvanced> handleChannelTypeAdvancedList) {
|
public NettyClientSocket(String inetHost,
|
||||||
|
int inetPort,
|
||||||
|
String clientId,
|
||||||
|
String serverId,
|
||||||
|
String appKey,
|
||||||
|
String appSecret,
|
||||||
|
ClientChangeEvent clientChangeEvent,
|
||||||
|
List<HandleChannelTypeAdvanced> handleChannelTypeAdvancedList) {
|
||||||
this.inetHost = inetHost;
|
this.inetHost = inetHost;
|
||||||
this.inetPort = inetPort;
|
this.inetPort = inetPort;
|
||||||
this.clientId = clientId;
|
this.clientId = clientId;
|
||||||
this.serverId = serverId;
|
this.serverId = serverId;
|
||||||
|
this.appKey = appKey;
|
||||||
|
this.appSecret = appSecret;
|
||||||
this.clientChangeEvent = clientChangeEvent;
|
this.clientChangeEvent = clientChangeEvent;
|
||||||
this.handleChannelTypeAdvancedList = handleChannelTypeAdvancedList;
|
this.handleChannelTypeAdvancedList = handleChannelTypeAdvancedList;
|
||||||
}
|
}
|
||||||
@ -78,7 +90,6 @@ public class NettyClientSocket {
|
|||||||
.option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 1024 * 1024 * 2))
|
.option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 1024 * 1024 * 2))
|
||||||
.handler(new NettyClientFilter(new ChannelTypeAdapter(handleChannelTypeAdvancedList), this))
|
.handler(new NettyClientFilter(new ChannelTypeAdapter(handleChannelTypeAdvancedList), this))
|
||||||
;
|
;
|
||||||
|
|
||||||
log.info("use clientId:{} connect to server IP:{},server port :{}", clientId, inetHost, inetPort);
|
log.info("use clientId:{} connect to server IP:{},server port :{}", clientId, inetHost, inetPort);
|
||||||
ChannelFuture future = bootstrap.connect(inetHost, inetPort);
|
ChannelFuture future = bootstrap.connect(inetHost, inetPort);
|
||||||
// 客户端连接服务端的channel
|
// 客户端连接服务端的channel
|
||||||
@ -92,7 +103,11 @@ public class NettyClientSocket {
|
|||||||
NettyProxyMsg nettyMsg = new NettyProxyMsg();
|
NettyProxyMsg nettyMsg = new NettyProxyMsg();
|
||||||
nettyMsg.setType(MessageType.REPORT_CLIENT_CONNECT_SUCCESS);
|
nettyMsg.setType(MessageType.REPORT_CLIENT_CONNECT_SUCCESS);
|
||||||
nettyMsg.setClientId(clientId);
|
nettyMsg.setClientId(clientId);
|
||||||
|
String hostAddress = InetAddress.getLocalHost().getHostAddress();
|
||||||
|
nettyMsg.setOriginalIpString(hostAddress);
|
||||||
nettyMsg.setData((clientId).getBytes());
|
nettyMsg.setData((clientId).getBytes());
|
||||||
|
nettyMsg.setAppKeyString(appKey);
|
||||||
|
nettyMsg.setAppSecretString(appSecret);
|
||||||
ChannelAttributeKeyUtils.buildClientId(serviceChannel, clientId);
|
ChannelAttributeKeyUtils.buildClientId(serviceChannel, clientId);
|
||||||
serviceChannel.writeAndFlush(nettyMsg);
|
serviceChannel.writeAndFlush(nettyMsg);
|
||||||
|
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package org.framework.lazy.cloud.network.heartbeat.common;
|
package org.framework.lazy.cloud.network.heartbeat.common;
|
||||||
|
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import lombok.Data;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
@ -29,17 +29,21 @@ public class ChannelContext {
|
|||||||
// 如果客户端已经存在 移除
|
// 如果客户端已经存在 移除
|
||||||
if (channelIdClientChannelDTOConcurrentHashMap.containsKey(clientId)) {
|
if (channelIdClientChannelDTOConcurrentHashMap.containsKey(clientId)) {
|
||||||
// clear(clientId);
|
// clear(clientId);
|
||||||
List<Channel> channels = channelIdClientChannelDTOConcurrentHashMap.get(clientId);
|
List<Channel> existChannelList = new ArrayList<>();
|
||||||
for (Channel existChannel : channels) {
|
List<Channel> oldChannels = channelIdClientChannelDTOConcurrentHashMap.get(clientId);
|
||||||
if (existChannel != null && !existChannel.isActive()) {
|
for (Channel existChannel : oldChannels) {
|
||||||
existChannel.close();
|
if (existChannel != null) {
|
||||||
}else {
|
if(existChannel.isActive()){
|
||||||
channels.remove(existChannel);
|
existChannelList.add(existChannel);
|
||||||
|
}else {
|
||||||
|
existChannel.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
channels.add(channel);
|
existChannelList.add(channel);
|
||||||
|
channelIdClientChannelDTOConcurrentHashMap.put(clientId, existChannelList);
|
||||||
}else {
|
}else {
|
||||||
channelIdClientChannelDTOConcurrentHashMap.putIfAbsent(clientId, List.of(channel));
|
channelIdClientChannelDTOConcurrentHashMap.putIfAbsent(clientId, Collections.synchronizedList(new ArrayList<>(List.of(channel))));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package org.framework.lazy.cloud.network.heartbeat.common;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
import org.wu.framework.core.utils.ObjectUtils;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
@ -13,8 +14,8 @@ import java.nio.charset.StandardCharsets;
|
|||||||
@Setter
|
@Setter
|
||||||
@Getter
|
@Getter
|
||||||
public class NettyProxyMsg {
|
public class NettyProxyMsg {
|
||||||
// body 长度 type 1 clientId 4 clientTargetIp 4 clientTargetPort 4 visitorPort 4 visitorId 4 data 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;
|
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
|
* byte 长度 1
|
||||||
* 1 true
|
* 1 true
|
||||||
* 0 false
|
* 0 false
|
||||||
|
* @since 1.2.8
|
||||||
*/
|
*/
|
||||||
private byte isSsl = 0;
|
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
|
* 客户端ID
|
||||||
* byte[] 长度 4
|
* 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) {
|
public void setClientTargetIp(byte[] clientTargetIp) {
|
||||||
this.clientTargetIp = clientTargetIp;
|
this.clientTargetIp = clientTargetIp;
|
||||||
}
|
}
|
||||||
|
@ -112,6 +112,22 @@ public class NettyProxyMsgDecoder extends LengthFieldBasedFrameDecoder {
|
|||||||
byte isSsl = in.readByte();
|
byte isSsl = in.readByte();
|
||||||
nettyProxyMsg.setIsSsl(isSsl);
|
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();
|
int clientIdLength = in.readInt();
|
||||||
byte[] clientIdBytes = new byte[clientIdLength];
|
byte[] clientIdBytes = new byte[clientIdLength];
|
||||||
in.readBytes(clientIdBytes);
|
in.readBytes(clientIdBytes);
|
||||||
@ -140,6 +156,9 @@ public class NettyProxyMsgDecoder extends LengthFieldBasedFrameDecoder {
|
|||||||
nettyProxyMsg.setVisitorId(visitorIdBytes);
|
nettyProxyMsg.setVisitorId(visitorIdBytes);
|
||||||
|
|
||||||
byte[] data = new byte[bodyLength - NettyProxyMsg.bodyLength -
|
byte[] data = new byte[bodyLength - NettyProxyMsg.bodyLength -
|
||||||
|
appKeyLength -
|
||||||
|
appSecretLength -
|
||||||
|
originalIpLength -
|
||||||
clientIdLength -
|
clientIdLength -
|
||||||
clientTargetIpLength -
|
clientTargetIpLength -
|
||||||
clientTargetPortLength -
|
clientTargetPortLength -
|
||||||
|
@ -24,6 +24,9 @@ public class NettyProxyMsgEncoder extends MessageToByteEncoder<NettyProxyMsg> {
|
|||||||
int bodyLength = NettyProxyMsg.bodyLength;
|
int bodyLength = NettyProxyMsg.bodyLength;
|
||||||
byte typeBytes = msg.getType();
|
byte typeBytes = msg.getType();
|
||||||
byte isSsl = msg.getIsSsl();
|
byte isSsl = msg.getIsSsl();
|
||||||
|
byte[] appKey = msg.getAppKey();
|
||||||
|
byte[] appSecret = msg.getAppSecret();
|
||||||
|
byte[] originalIp = msg.getOriginalIp();
|
||||||
byte[] clientIdBytes = msg.getClientId();
|
byte[] clientIdBytes = msg.getClientId();
|
||||||
byte[] clientTargetIpBytes = msg.getClientTargetIp();
|
byte[] clientTargetIpBytes = msg.getClientTargetIp();
|
||||||
byte[] clientTargetPortBytes = msg.getClientTargetPort();
|
byte[] clientTargetPortBytes = msg.getClientTargetPort();
|
||||||
@ -31,6 +34,15 @@ public class NettyProxyMsgEncoder extends MessageToByteEncoder<NettyProxyMsg> {
|
|||||||
byte[] visitorIdBytes = msg.getVisitorId();
|
byte[] visitorIdBytes = msg.getVisitorId();
|
||||||
byte[] msgDataBytes = msg.getData();
|
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) {
|
if (clientIdBytes != null) {
|
||||||
bodyLength += clientIdBytes.length;
|
bodyLength += clientIdBytes.length;
|
||||||
}
|
}
|
||||||
@ -56,6 +68,32 @@ public class NettyProxyMsgEncoder extends MessageToByteEncoder<NettyProxyMsg> {
|
|||||||
out.writeByte(typeBytes);
|
out.writeByte(typeBytes);
|
||||||
out.writeByte(isSsl);
|
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
|
// 防止数据读错位置 clientId
|
||||||
if (clientIdBytes != null) {
|
if (clientIdBytes != null) {
|
||||||
out.writeInt(clientIdBytes.length);
|
out.writeInt(clientIdBytes.length);
|
||||||
|
@ -11,6 +11,9 @@ public class ChannelAttributeKeyUtils {
|
|||||||
private static final AttributeKey<String> VISITOR_ID = AttributeKey.newInstance("visitorId");
|
private static final AttributeKey<String> VISITOR_ID = AttributeKey.newInstance("visitorId");
|
||||||
private static final AttributeKey<Integer> VISITOR_PORT = AttributeKey.newInstance("visitorPort");
|
private static final AttributeKey<Integer> VISITOR_PORT = AttributeKey.newInstance("visitorPort");
|
||||||
private static final AttributeKey<String> CLIENT_ID = AttributeKey.newInstance("clientId");
|
private static final AttributeKey<String> CLIENT_ID = AttributeKey.newInstance("clientId");
|
||||||
|
private static final AttributeKey<String> APP_KEY = AttributeKey.newInstance("appKey");
|
||||||
|
private static final AttributeKey<String> APP_SECRET = AttributeKey.newInstance("appSecret");
|
||||||
|
private static final AttributeKey<String> ORIGINAL_IP = AttributeKey.newInstance("originalIp");
|
||||||
private static final AttributeKey<Integer> OUT_FLOW = AttributeKey.newInstance("outFlow");
|
private static final AttributeKey<Integer> OUT_FLOW = AttributeKey.newInstance("outFlow");
|
||||||
private static final AttributeKey<Integer> IN_FLOW = AttributeKey.newInstance("inFlow");
|
private static final AttributeKey<Integer> IN_FLOW = AttributeKey.newInstance("inFlow");
|
||||||
|
|
||||||
@ -174,4 +177,62 @@ public class ChannelAttributeKeyUtils {
|
|||||||
public static Channel getTransferNextChannel(Channel channel) {
|
public static Channel getTransferNextChannel(Channel channel) {
|
||||||
return channel.attr(TRANSFER_NEXT_CHANNEL).get();
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -182,7 +182,7 @@ public class LazyNettyClusterNodeApplicationImpl implements LazyNettyClusterNode
|
|||||||
|
|
||||||
NettyClientSocket nettyClientSocket = new
|
NettyClientSocket nettyClientSocket = new
|
||||||
NettyClientSocket(inetHost, inetPort, clusterNodeClientId,
|
NettyClientSocket(inetHost, inetPort, clusterNodeClientId,
|
||||||
clusterNodeId,
|
clusterNodeId,null,null,
|
||||||
clientChangeEvent, handleChannelTypeAdvancedList);
|
clientChangeEvent, handleChannelTypeAdvancedList);
|
||||||
// 过滤已经存在的
|
// 过滤已经存在的
|
||||||
boolean anyMatch = cacheClusterNettyClientSocketMap
|
boolean anyMatch = cacheClusterNettyClientSocketMap
|
||||||
|
@ -41,12 +41,14 @@ public class HeartbeatServerConfiguration {
|
|||||||
LazyNettyClientBlacklistApplication lazyNettyClientBlacklistApplication,
|
LazyNettyClientBlacklistApplication lazyNettyClientBlacklistApplication,
|
||||||
LazyInternalNetworkServerPermeateClientMappingApplication lazyInternalNetworkServerPermeateClientMappingApplication,
|
LazyInternalNetworkServerPermeateClientMappingApplication lazyInternalNetworkServerPermeateClientMappingApplication,
|
||||||
LazyInternalNetworkClientPermeateServerMappingApplication lazyInternalNetworkClientPermeateServerMappingApplication,
|
LazyInternalNetworkClientPermeateServerMappingApplication lazyInternalNetworkClientPermeateServerMappingApplication,
|
||||||
LazyInternalNetworkClientPermeateClientMappingApplication lazyInternalNetworkClientPermeateClientMappingApplication) {
|
LazyInternalNetworkClientPermeateClientMappingApplication lazyInternalNetworkClientPermeateClientMappingApplication,
|
||||||
|
LazyNettyClientTokenBucketApplication lazyNettyClientTokenBucketApplication) {
|
||||||
return new ServerHandleClientConnectSuccessTypeAdvanced(lazyClientStatsChangeApplication,
|
return new ServerHandleClientConnectSuccessTypeAdvanced(lazyClientStatsChangeApplication,
|
||||||
lazyNettyClientBlacklistApplication,
|
lazyNettyClientBlacklistApplication,
|
||||||
lazyInternalNetworkServerPermeateClientMappingApplication,
|
lazyInternalNetworkServerPermeateClientMappingApplication,
|
||||||
lazyInternalNetworkClientPermeateServerMappingApplication,
|
lazyInternalNetworkClientPermeateServerMappingApplication,
|
||||||
lazyInternalNetworkClientPermeateClientMappingApplication);
|
lazyInternalNetworkClientPermeateClientMappingApplication,
|
||||||
|
lazyNettyClientTokenBucketApplication);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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.*;
|
||||||
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.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.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.LazyInternalNetworkClientPermeateClientMappingDTO;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.dto.LazyInternalNetworkClientPermeateServerMappingDTO;
|
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.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.springframework.stereotype.Component;
|
||||||
|
import org.wu.framework.web.response.Result;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -35,12 +38,14 @@ public class ServerHandleClientConnectSuccessTypeAdvanced extends AbstractHandle
|
|||||||
private final LazyInternalNetworkClientPermeateServerMappingApplication lazyInternalNetworkClientPermeateServerMappingApplication;
|
private final LazyInternalNetworkClientPermeateServerMappingApplication lazyInternalNetworkClientPermeateServerMappingApplication;
|
||||||
private final LazyInternalNetworkClientPermeateClientMappingApplication lazyInternalNetworkClientPermeateClientMappingApplication;
|
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.lazyClientStatsChangeApplication = lazyClientStatsChangeApplication;
|
||||||
this.lazyNettyClientBlacklistApplication = lazyNettyClientBlacklistApplication;
|
this.lazyNettyClientBlacklistApplication = lazyNettyClientBlacklistApplication;
|
||||||
this.lazyInternalNetworkServerPermeateClientMappingApplication = lazyInternalNetworkServerPermeateClientMappingApplication;
|
this.lazyInternalNetworkServerPermeateClientMappingApplication = lazyInternalNetworkServerPermeateClientMappingApplication;
|
||||||
this.lazyInternalNetworkClientPermeateServerMappingApplication = lazyInternalNetworkClientPermeateServerMappingApplication;
|
this.lazyInternalNetworkClientPermeateServerMappingApplication = lazyInternalNetworkClientPermeateServerMappingApplication;
|
||||||
this.lazyInternalNetworkClientPermeateClientMappingApplication = lazyInternalNetworkClientPermeateClientMappingApplication;
|
this.lazyInternalNetworkClientPermeateClientMappingApplication = lazyInternalNetworkClientPermeateClientMappingApplication;
|
||||||
|
this.lazyNettyClientTokenBucketApplication = lazyNettyClientTokenBucketApplication;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -54,10 +59,17 @@ public class ServerHandleClientConnectSuccessTypeAdvanced extends AbstractHandle
|
|||||||
public void doHandler(Channel newChannel, NettyProxyMsg msg) {
|
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);
|
ChannelContext.push(newChannel, clientId);
|
||||||
|
|
||||||
ChannelAttributeKeyUtils.buildClientId(newChannel, clientId);
|
ChannelAttributeKeyUtils.buildClientId(newChannel, clientId);
|
||||||
|
ChannelAttributeKeyUtils.buildAppKey(newChannel, appKey);
|
||||||
|
ChannelAttributeKeyUtils.buildAppSecret(newChannel, appSecret);
|
||||||
|
ChannelAttributeKeyUtils.buildOriginalIp(newChannel, originalIp);
|
||||||
|
|
||||||
// 客户端:{},IP:{}连接成功
|
// 客户端:{},IP:{}连接成功
|
||||||
log.info("Client: {}, IP: {} Connection successful", new String(msg.getClientId()), newChannel.remoteAddress().toString());
|
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);
|
lazyNettyClientBlacklist.setIsDeleted(false);
|
||||||
lazyNettyClientBlacklistApplication.exists(lazyNettyClientBlacklist).accept(exists -> {
|
lazyNettyClientBlacklistApplication.exists(lazyNettyClientBlacklist).accept(exists -> {
|
||||||
if (!exists) {
|
if (!exists) {
|
||||||
// 服务状态在线
|
// 认证验证
|
||||||
lazyClientStatsChangeApplication.clientOnLine(clientId);
|
Result<Boolean> existsTokenResult = lazyNettyClientTokenBucketApplication.certificationToken(clientId, appKey, appSecret);
|
||||||
// 当前在线客户端数量:{}
|
Boolean existsToken= existsTokenResult.getData();
|
||||||
log.info("Current number of online clients: {}", ChannelContext.getClientIds().size());
|
if(existsToken){
|
||||||
// 所有的客户端ID
|
// 服务状态在线
|
||||||
List<String> clientIdList = ChannelContext.getClientIds();
|
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<String> 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 {
|
} else {
|
||||||
// 黑名单客户端
|
// 黑名单客户端
|
||||||
|
@ -2,15 +2,16 @@ package org.framework.lazy.cloud.network.heartbeat.server.netty.advanced;
|
|||||||
|
|
||||||
|
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.ChannelId;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.ChannelContext;
|
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.MessageType;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.NettyClientVisitorContext;
|
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.NettyProxyMsg;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.advanced.server.AbstractHandleReportDisconnectTypeAdvanced;
|
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.netty.socket.NettyServerPermeateClientVisitorSocket;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.LazyClientStatsChangeApplication;
|
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.springframework.stereotype.Component;
|
||||||
import org.wu.framework.core.utils.ObjectUtils;
|
import org.wu.framework.core.utils.ObjectUtils;
|
||||||
|
|
||||||
@ -40,14 +41,21 @@ public class ServerHandleReportDisconnectTypeAdvanced extends AbstractHandleRepo
|
|||||||
@Override
|
@Override
|
||||||
public void doHandler(Channel deathChannel, NettyProxyMsg msg) {
|
public void doHandler(Channel deathChannel, NettyProxyMsg msg) {
|
||||||
// 关闭连接通知
|
// 关闭连接通知
|
||||||
byte[] clientId = msg.getClientId();
|
String clientId = msg.getClientIdString();
|
||||||
log.warn("close client :{} channel", new String(clientId));
|
log.warn("close client :{} channel", clientId);
|
||||||
Channel deathClientChannelDTO = ChannelContext.getLoadBalance(clientId);
|
Channel deathClientChannelDTO = ChannelContext.getLoadBalance(clientId);
|
||||||
|
String appKey = ChannelAttributeKeyUtils.getAppKey(deathChannel);
|
||||||
|
String appSecret = ChannelAttributeKeyUtils.getAppSecret(deathChannel);
|
||||||
|
String originalIp = ChannelAttributeKeyUtils.getOriginalIp(deathChannel);
|
||||||
if (deathClientChannelDTO != null) {
|
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);
|
ChannelContext.remove(clientId);
|
||||||
|
|
||||||
// 通知其他客户端 channelId 关闭了
|
// 通知其他客户端 channelId 关闭了
|
||||||
@ -57,12 +65,12 @@ public class ServerHandleReportDisconnectTypeAdvanced extends AbstractHandleRepo
|
|||||||
NettyProxyMsg nettyMsg = new NettyProxyMsg();
|
NettyProxyMsg nettyMsg = new NettyProxyMsg();
|
||||||
nettyMsg.setType(MessageType.DISTRIBUTE_CLIENT_DISCONNECTION_NOTIFICATION);
|
nettyMsg.setType(MessageType.DISTRIBUTE_CLIENT_DISCONNECTION_NOTIFICATION);
|
||||||
nettyMsg.setClientId(clientId);
|
nettyMsg.setClientId(clientId);
|
||||||
nettyMsg.setData(clientId);
|
nettyMsg.setData(clientId.getBytes(StandardCharsets.UTF_8));
|
||||||
channel.writeAndFlush(nettyMsg);
|
channel.writeAndFlush(nettyMsg);
|
||||||
// 暂存通知
|
// 暂存通知
|
||||||
NettyProxyMsg stagingNettyProxyMsg = new NettyProxyMsg();
|
NettyProxyMsg stagingNettyProxyMsg = new NettyProxyMsg();
|
||||||
stagingNettyProxyMsg.setType(MessageType.DISTRIBUTE_CLIENT_STAGING_OPENED_NOTIFICATION);
|
stagingNettyProxyMsg.setType(MessageType.DISTRIBUTE_CLIENT_STAGING_OPENED_NOTIFICATION);
|
||||||
stagingNettyProxyMsg.setData(clientId);
|
stagingNettyProxyMsg.setData(clientId.getBytes(StandardCharsets.UTF_8));
|
||||||
stagingNettyProxyMsg.setClientId(clientId);
|
stagingNettyProxyMsg.setClientId(clientId);
|
||||||
channel.writeAndFlush(stagingNettyProxyMsg);
|
channel.writeAndFlush(stagingNettyProxyMsg);
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,9 @@ package org.framework.lazy.cloud.network.heartbeat.server.netty.advanced;
|
|||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.ChannelId;
|
import io.netty.channel.ChannelId;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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.LazyClientStatsChangeApplication;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.ChannelContext;
|
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.MessageType;
|
||||||
@ -33,13 +35,23 @@ public class ServerHandleReportStagingClosedTypeAdvanced extends AbstractHandleR
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void doHandler(Channel stagingClosedChannel, NettyProxyMsg msg) {
|
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();
|
byte[] clientIdBytes = msg.getClientId();
|
||||||
// 获取所有通道
|
// 获取所有通道
|
||||||
List<Channel> stagingOpenedClientChannel = ChannelContext.get(clientIdBytes);
|
List<Channel> stagingOpenedClientChannel = ChannelContext.get(clientIdBytes);
|
||||||
if (stagingOpenedClientChannel != null) {
|
if (stagingOpenedClientChannel != null) {
|
||||||
String clientId = new String(clientIdBytes);
|
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) -> {
|
ChannelContext.getChannels().forEach((existClientId, channels) -> {
|
||||||
for (Channel channel : channels) {
|
for (Channel channel : channels) {
|
||||||
// 告诉他们 当前参数这个通道 暂存关闭了
|
// 告诉他们 当前参数这个通道 暂存关闭了
|
||||||
|
@ -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.MessageType;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.common.NettyProxyMsg;
|
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.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.LazyClientStatsChangeApplication;
|
||||||
|
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.LazyNettyClientLoginCommand;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
@ -35,13 +37,21 @@ public class ServerHandleReportStagingOpenedTypeAdvanced extends AbstractHandleR
|
|||||||
protected void doHandler(Channel stagingOpenedChannel, NettyProxyMsg msg) {
|
protected void doHandler(Channel stagingOpenedChannel, NettyProxyMsg msg) {
|
||||||
// 获取所有通道
|
// 获取所有通道
|
||||||
byte[] clientIdBytes = msg.getClientId();
|
byte[] clientIdBytes = msg.getClientId();
|
||||||
|
String appKey = ChannelAttributeKeyUtils.getAppKey(stagingOpenedChannel);
|
||||||
|
String appSecret = ChannelAttributeKeyUtils.getAppSecret(stagingOpenedChannel);
|
||||||
|
String originalIp = ChannelAttributeKeyUtils.getOriginalIp(stagingOpenedChannel);
|
||||||
List<Channel> stagingOpenedClientChannel = ChannelContext.get(clientIdBytes);
|
List<Channel> stagingOpenedClientChannel = ChannelContext.get(clientIdBytes);
|
||||||
if (stagingOpenedClientChannel != null) {
|
if (stagingOpenedClientChannel != null) {
|
||||||
ChannelContext.getChannels().forEach((existClientId, channels) -> {
|
ChannelContext.getChannels().forEach((existClientId, channels) -> {
|
||||||
for (Channel channel : channels) {
|
for (Channel channel : channels) {
|
||||||
// 存储当前客户端暂存关闭
|
// 存储当前客户端暂存关闭
|
||||||
String clientId = new String(clientIdBytes);
|
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();
|
NettyProxyMsg nettyMsg = new NettyProxyMsg();
|
||||||
nettyMsg.setType(MessageType.DISTRIBUTE_CLIENT_STAGING_OPENED_NOTIFICATION);
|
nettyMsg.setType(MessageType.DISTRIBUTE_CLIENT_STAGING_OPENED_NOTIFICATION);
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package org.framework.lazy.cloud.network.heartbeat.server.standalone.application;
|
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 配置
|
* 云下心跳客户端操作 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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package org.framework.lazy.cloud.network.heartbeat.server.standalone.application;
|
package org.framework.lazy.cloud.network.heartbeat.server.standalone.application;
|
||||||
|
|
||||||
import org.wu.framework.web.response.Result;
|
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.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.LazyNettyClientTokenBucketRemoveCommand;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.token.bucket.LazyNettyClientTokenBucketStoryCommand;
|
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<LazyNettyClientTokenBucket> remove(LazyNettyClientTokenBucketRemoveCommand lazyNettyClientTokenBucketRemoveCommand);
|
Result<LazyNettyClientTokenBucket> remove(LazyNettyClientTokenBucketRemoveCommand lazyNettyClientTokenBucketRemoveCommand);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 认证验证
|
||||||
|
*
|
||||||
|
* @param clientId 客户端ID
|
||||||
|
* @param appKey key
|
||||||
|
* @param appSecret 令牌
|
||||||
|
* @return 布尔类型
|
||||||
|
*/
|
||||||
|
Result<Boolean> certificationToken(String clientId, String appKey, String appSecret);
|
||||||
}
|
}
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -29,7 +29,8 @@ public class LazyNettyClientMessageCommand {
|
|||||||
* 发送的消息
|
* 发送的消息
|
||||||
*/
|
*/
|
||||||
@Schema(description = "发送的消息", name = "message", example = "")
|
@Schema(description = "发送的消息", name = "message", example = "")
|
||||||
private String message; /**
|
private String message;
|
||||||
|
/**
|
||||||
* 服务端ID
|
* 服务端ID
|
||||||
*/
|
*/
|
||||||
@Schema(description = "服务端ID", name = "serverId", example = "")
|
@Schema(description = "服务端ID", name = "serverId", example = "")
|
||||||
|
@ -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.properties.ServerNodeProperties;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.LazyClientStatsChangeApplication;
|
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.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.LazyNettyClientStateRecord;
|
||||||
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.state.record.LazyNettyClientStateRecordRepository;
|
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
|
@Override
|
||||||
public void clientOnLine(String clientId) {
|
public void clientOnLine(LazyNettyClientLoginCommand lazyNettyClientLoginCommand) {
|
||||||
|
String clientId = lazyNettyClientLoginCommand.getClientId();
|
||||||
// 如果可以已经在线状态不推送
|
// 如果可以已经在线状态不推送
|
||||||
String clientStatusKey = ClientConfigKeyUtils.getClientStatusKey(clientId);
|
String clientStatusKey = ClientConfigKeyUtils.getClientStatusKey(clientId);
|
||||||
// stringRedisTemplate.opsForValue().set(clientStatusKey, NettyClientStatus.ON_LINE.name());
|
// stringRedisTemplate.opsForValue().set(clientStatusKey, NettyClientStatus.ON_LINE.name());
|
||||||
@ -70,10 +72,11 @@ public class LazyClientStatsChangeApplicationImpl implements LazyClientStatsChan
|
|||||||
/**
|
/**
|
||||||
* 客户端离线
|
* 客户端离线
|
||||||
*
|
*
|
||||||
* @param clientId 客户端ID
|
* @param lazyNettyClientLoginCommand 客户端ID
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void clientOffLine(String clientId) {
|
public void clientOffLine(LazyNettyClientLoginCommand lazyNettyClientLoginCommand) {
|
||||||
|
String clientId = lazyNettyClientLoginCommand.getClientId();
|
||||||
// 如果可以已经在线状态不推送
|
// 如果可以已经在线状态不推送
|
||||||
String clientStatusKey = ClientConfigKeyUtils.getClientStatusKey(clientId);
|
String clientStatusKey = ClientConfigKeyUtils.getClientStatusKey(clientId);
|
||||||
// stringRedisTemplate.opsForValue().set(clientStatusKey, NettyClientStatus.OFF_LINE.name());
|
// 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);
|
storyClientStateRecord(clientId,serverId,NettyClientStatus.OFF_LINE.name(),null);
|
||||||
// // 触发暂存扫描
|
// // 触发暂存扫描
|
||||||
// ClientOnLineState clientOnLineState = new ClientOnLineState();
|
// ClientOnLineState clientOnLineState = new ClientOnLineState();
|
||||||
// clientOnLineState.setClientId(clientId);
|
// clientOnLineState.setClientId(lazyNettyClientLoginCommand);
|
||||||
// clientOnLineState.setOnLineState(NettyClientStatus.OFF_LINE.name());
|
// clientOnLineState.setOnLineState(NettyClientStatus.OFF_LINE.name());
|
||||||
// stringRedisTemplate.convertAndSend(REDIS_CLIENT_ONLINE_OR_OFFLINE_CHANNEL,clientOnLineState);
|
// 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
|
@Override
|
||||||
public void stagingClosed(String clientId) {
|
public void stagingClosed(LazyNettyClientLoginCommand lazyNettyClientLoginCommand) {
|
||||||
|
String clientId = lazyNettyClientLoginCommand.getClientId();
|
||||||
LazyNettyClientState lazyNettyClientState = new LazyNettyClientState();
|
LazyNettyClientState lazyNettyClientState = new LazyNettyClientState();
|
||||||
lazyNettyClientState.setClientId(clientId);
|
lazyNettyClientState.setClientId(clientId);
|
||||||
lazyNettyClientState.setStagingState("CLOSED");
|
lazyNettyClientState.setStagingState("CLOSED");
|
||||||
@ -114,10 +118,12 @@ public class LazyClientStatsChangeApplicationImpl implements LazyClientStatsChan
|
|||||||
/**
|
/**
|
||||||
* 客户端暂存开启
|
* 客户端暂存开启
|
||||||
*
|
*
|
||||||
* @param clientId 客户端ID
|
* @param clientId 客户端ID
|
||||||
|
* @param lazyNettyClientLoginCommand
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void stagingOpened(String clientId) {
|
public void stagingOpened(LazyNettyClientLoginCommand lazyNettyClientLoginCommand) {
|
||||||
|
String clientId = lazyNettyClientLoginCommand.getClientId();
|
||||||
LazyNettyClientState lazyNettyClientState = new LazyNettyClientState();
|
LazyNettyClientState lazyNettyClientState = new LazyNettyClientState();
|
||||||
lazyNettyClientState.setClientId(clientId);
|
lazyNettyClientState.setClientId(clientId);
|
||||||
lazyNettyClientState.setStagingState("OPENED");
|
lazyNettyClientState.setStagingState("OPENED");
|
||||||
|
@ -143,4 +143,16 @@ public class LazyNettyClientTokenBucketApplicationImpl implements LazyNettyClien
|
|||||||
return lazyNettyClientTokenBucketRepository.remove(lazyNettyClientTokenBucket);
|
return lazyNettyClientTokenBucketRepository.remove(lazyNettyClientTokenBucket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 认证验证
|
||||||
|
*
|
||||||
|
* @param clientId 客户端ID
|
||||||
|
* @param appKey key
|
||||||
|
* @param appSecret 令牌
|
||||||
|
* @return 布尔类型
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Result<Boolean> certificationToken(String clientId, String appKey, String appSecret) {
|
||||||
|
return lazyNettyClientTokenBucketRepository.certificationToken(clientId,appKey,appSecret);
|
||||||
|
}
|
||||||
}
|
}
|
@ -103,4 +103,13 @@ public interface LazyNettyClientTokenBucketRepository {
|
|||||||
|
|
||||||
Result<Boolean> exists(LazyNettyClientTokenBucket lazyNettyClientTokenBucket);
|
Result<Boolean> exists(LazyNettyClientTokenBucket lazyNettyClientTokenBucket);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 认证验证
|
||||||
|
*
|
||||||
|
* @param clientId 客户端ID
|
||||||
|
* @param appKey key
|
||||||
|
* @param appSecret 令牌
|
||||||
|
* @return 布尔类型
|
||||||
|
*/
|
||||||
|
Result<Boolean> certificationToken(String clientId, String appKey, String appSecret);
|
||||||
}
|
}
|
@ -8,10 +8,12 @@ import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructu
|
|||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
import org.wu.framework.lazy.orm.database.lambda.domain.LazyPage;
|
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.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.lazy.orm.database.lambda.stream.wrapper.LazyWrappers;
|
||||||
import org.wu.framework.web.response.Result;
|
import org.wu.framework.web.response.Result;
|
||||||
import org.wu.framework.web.response.ResultFactory;
|
import org.wu.framework.web.response.ResultFactory;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ -144,4 +146,50 @@ public class LazyNettyClientTokenBucketRepositoryImpl implements LazyNettyClient
|
|||||||
return ResultFactory.successOf(exists);
|
return ResultFactory.successOf(exists);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 认证验证
|
||||||
|
*
|
||||||
|
* @param clientId 客户端ID
|
||||||
|
* @param appKey key
|
||||||
|
* @param appSecret 令牌
|
||||||
|
* @return 布尔类型
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Result<Boolean> certificationToken(String clientId, String appKey, String appSecret) {
|
||||||
|
// 验证客户端与令牌
|
||||||
|
boolean exists = lazyLambdaStream.exists(LazyWrappers
|
||||||
|
.<LazyNettyClientTokenBucketDO>lambdaWrapper()
|
||||||
|
.eq(LazyNettyClientTokenBucketDO::getUsedByClientId, clientId)
|
||||||
|
.eq(LazyNettyClientTokenBucketDO::getAppKey, appKey)
|
||||||
|
.eq(LazyNettyClientTokenBucketDO::getAppSecret, appSecret)
|
||||||
|
);
|
||||||
|
if (exists) {
|
||||||
|
return ResultFactory.successOf(true);
|
||||||
|
}
|
||||||
|
// 验证令牌是否未被占用
|
||||||
|
boolean hasCanUseToken = lazyLambdaStream.exists(LazyWrappers
|
||||||
|
.<LazyNettyClientTokenBucketDO>lambdaWrapper()
|
||||||
|
.isNull(LazyNettyClientTokenBucketDO::getUsedByClientId)
|
||||||
|
.eq(LazyNettyClientTokenBucketDO::getAppKey, appKey)
|
||||||
|
.eq(LazyNettyClientTokenBucketDO::getAppSecret, appSecret)
|
||||||
|
);
|
||||||
|
if (hasCanUseToken) {
|
||||||
|
// 绑定客户端ID
|
||||||
|
|
||||||
|
lazyLambdaStream.update(
|
||||||
|
LazyUpdateSetValueWrappers.<LazyNettyClientTokenBucketDO>lambdaWrapper()
|
||||||
|
.set(LazyNettyClientTokenBucketDO::getUsedByClientId, clientId)
|
||||||
|
.set(LazyNettyClientTokenBucketDO::getUpdateTime, LocalDateTime.now())
|
||||||
|
,
|
||||||
|
LazyWrappers
|
||||||
|
.<LazyNettyClientTokenBucketDO>lambdaWrapper()
|
||||||
|
.eq(LazyNettyClientTokenBucketDO::getAppKey, appKey)
|
||||||
|
.eq(LazyNettyClientTokenBucketDO::getAppSecret, appSecret)
|
||||||
|
);
|
||||||
|
return ResultFactory.successOf(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return ResultFactory.successOf(false);
|
||||||
|
}
|
||||||
}
|
}
|
@ -38,7 +38,7 @@ docker run -d -it --privileged --name client -p 6004:6004 registry.cn-hangzhou.a
|
|||||||
```
|
```
|
||||||
|
|
||||||
```shell
|
```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
|
```yaml
|
||||||
|
@ -4,10 +4,12 @@ spring:
|
|||||||
client:
|
client:
|
||||||
# inet-host: 124.222.48.62
|
# inet-host: 124.222.48.62
|
||||||
# inet-port: 30676
|
# inet-port: 30676
|
||||||
|
# inet-host: 124.222.48.62
|
||||||
|
# inet-port: 30560
|
||||||
inet-host: 127.0.0.1
|
inet-host: 127.0.0.1
|
||||||
inet-port: 7001
|
inet-port: 7001
|
||||||
inet-path: wu-lazy-cloud-heartbeat-server
|
inet-path: wu-lazy-cloud-heartbeat-server
|
||||||
client-id: my-home # 客户端ID
|
client-id: wujiawei # 客户端ID
|
||||||
app-key: key
|
app-key: key
|
||||||
app-secret: secret
|
app-secret: secret
|
||||||
# inet-host: 124.222.48.62 # 服务端地址
|
# inet-host: 124.222.48.62 # 服务端地址
|
||||||
|
Loading…
x
Reference in New Issue
Block a user