iohao / ioGame

无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式; 适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器;FXGL、Unity、UE、Cocos Creator、Godot、Netty、Protobuf、webSocket、tcp、socket;java Netty 游戏服务器框架;

Home Page:http://game.iohao.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

对外服对某个路由实现拦截

molin7596 opened this issue · comments

如果我想在对外服对某个路由实现拦截 进行一些处理, 再根据处理结果 是否放行,框架是否自带? 需要自定义扩展吗

过滤器 and 拦截器

自定义扩展:我这种做法 对吗 ?

/**
 * 路由拦截器
 */
@ChannelHandler.Sharable
public class CmdInterceptorHandler extends SimpleChannelInboundHandler<BarMessage> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, BarMessage message) {
        int cmdMerge = message.getHeadMetadata().getCmdMerge();
        CmdInfo cmdInfo = CmdInfo.of(cmdMerge);
        // todo

        ctx.writeAndFlush(message);
    }

    public CmdInterceptorHandler() {
    }

    public static CmdInterceptorHandler me() {
        return CmdInterceptorHandler.Holder.ME;
    }

    /**
     * 通过 JVM 的类加载机制, 保证只加载一次 (singleton)
     */
    private static class Holder {
        static final CmdInterceptorHandler ME = new CmdInterceptorHandler();
    }

}

没问题,在游戏对外服 (yuque.com)中扩展一些自定义的 Netty Handler。

同时,框架也提供了很多内置与可选的 Handler (yuque.com),可以适当的参考,如下

@ChannelHandler.Sharable
public final class CmdCheckHandler extends SimpleChannelInboundHandler<BarMessage>
implements CmdRegionsAware {
CmdRegions cmdRegions;
@Override
protected void channelRead0(ChannelHandlerContext ctx, BarMessage message) {
int cmdMerge = message.getHeadMetadata().getCmdMerge();
// 路由存在
if (cmdRegions.existCmdMerge(cmdMerge)) {
// 交给下一个业务处理 (handler) , 下一个业务指的是你编排 handler 时的顺序
ctx.fireChannelRead(message);
return;
}
ExternalCodecKit.employError(message, ActionErrorEnum.cmdInfoErrorCode);
ctx.writeAndFlush(message);
}

框架后续迭代中会提供此类功能吗

暂时没这个计划,因为 netty handler 已经具备拦截功能了。