feat[gateway]: gateway attachment support signal only

This commit is contained in:
godotg committed 2023-04-15 09:57:16 +08:00
1 parent 384b79d58d
commit 018083fdb8
4 files changed
+40 -7

No files matched your search

@@ -81,10 +81,10 @@ public class GatewayRouteHandler extends ServerRouteHandler {
throw new IllegalArgumentException(StringUtils.format(" session:{}发送了一个非法包[{}]", SessionUtils.sessionSimpleInfo(ctx), JsonUtils.object2String(packet)));
}
var signalAttachment = (SignalAttachment) decodedPacketInfo.getAttachment();
// 把客户端信息包装为一个GatewayAttachment,因此通过这个网关附加包可以得到玩家的uid、sid之类的信息
var gatewayAttachment = new GatewayAttachment(session, signalAttachment);
var gatewayAttachment = new GatewayAttachment(session);
gatewayAttachment.wrapAttachment(decodedPacketInfo.getAttachment());
// 网关优先使用IGatewayLoadBalancer作为一致性hash的计算参数,然后才会使用客户端的session做参数
// 例子:以聊天服务来说,玩家知道自己在哪个群组groupId中,那往这个群发送消息时,会在Packet中带上这个groupId做为一致性hash就可以了。
@@ -125,10 +125,10 @@ public class Router implements IRouter {
gatewaySession.setUid(uid);
EventBus.post(AuthUidToGatewayEvent.valueOf(gatewaySession.getSid(), uid));
NetContext.getRouter().send(session, AuthUidToGatewayConfirm.valueOf(uid), new GatewayAttachment(gatewaySession, null));
NetContext.getRouter().send(session, AuthUidToGatewayConfirm.valueOf(uid), new GatewayAttachment(gatewaySession));
return;
}
send(gatewaySession, packet, signalAttachmentInGatewayAttachment);
send(gatewaySession, packet, gatewayAttachment.attachment());
} else {
logger.error("gateway receives packet:[{}] and attachment:[{}] from server" + ", but serverSessionMap has no session[id:{}], perhaps client disconnected from gateway.", JsonUtils.object2String(packet), JsonUtils.object2String(attachment), gatewayAttachment.getSid());
}
@@ -13,7 +13,6 @@
package com.zfoo.net.router.attachment;
import com.zfoo.net.session.Session;
import org.springframework.lang.Nullable;
/**
* @author godotg
@@ -50,16 +49,16 @@ public class GatewayAttachment implements IAttachment {
* CN:客户端发到网关的可能是一个带有同步或者异步的附加包,网关转发的时候需要把这个附加包给带上
*/
private SignalAttachment signalAttachment;
private SignalOnlyAttachment signalOnlyAttachment;
public GatewayAttachment() {
}
public GatewayAttachment(Session session, @Nullable SignalAttachment signalAttachment) {
public GatewayAttachment(Session session) {
this.client = true;
this.sid = session.getSid();
this.uid = session.getUid();
this.signalAttachment = signalAttachment;
}
public GatewayAttachment(long sid, long uid) {
@@ -91,6 +90,31 @@ public class GatewayAttachment implements IAttachment {
this.taskExecutorHashParam = argument.hashCode();
}
public void wrapAttachment(IAttachment attachment) {
if (attachment == null) {
return;
}
switch (attachment.packetType()) {
case SIGNAL_ONLY_PACKET:
signalOnlyAttachment = (SignalOnlyAttachment) attachment;
break;
case SIGNAL_PACKET:
signalAttachment = (SignalAttachment) attachment;
break;
default:
}
}
public IAttachment attachment() {
if (signalAttachment != null) {
return signalAttachment;
}
if (signalOnlyAttachment != null) {
return signalOnlyAttachment;
}
return null;
}
public long getSid() {
return sid;
}
@@ -139,4 +163,12 @@ public class GatewayAttachment implements IAttachment {
public void setSignalAttachment(SignalAttachment signalAttachment) {
this.signalAttachment = signalAttachment;
}
public SignalOnlyAttachment getSignalOnlyAttachment() {
return signalOnlyAttachment;
}
public void setSignalOnlyAttachment(SignalOnlyAttachment signalOnlyAttachment) {
this.signalOnlyAttachment = signalOnlyAttachment;
}
}
+1
View File
@@ -5,6 +5,7 @@
<module id="1" name="native" minId="0" maxId="100">
<protocol location="com.zfoo.net.router.attachment.SignalAttachment"/>
<protocol location="com.zfoo.net.router.attachment.SignalOnlyAttachment"/>
<protocol location="com.zfoo.net.router.attachment.GatewayAttachment"/>
<protocol location="com.zfoo.net.router.attachment.UdpAttachment"/>
<protocol location="com.zfoo.net.router.attachment.HttpAttachment"/>