iohao / ioGame

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

对接口数据 加密加压缩 #245

Closed HAZYUHE closed 9 months ago

HAZYUHE commented 9 months ago

你的问题 | 使用场景

描述你遇到的问题,或使用场景(询问框架能否满足此类需求) 我的需求就是需要对接口数据 加密加压缩,框架是已经用protobuf做了数据压缩,在这个基础上需要如何处理才能实现数据加密+压缩

预期值

期望的预期值

实际值

实际值

iohao commented 9 months ago

使用 SSL

可以在 netty 或 nginx 中添加 SSL

通过编解码,对业务数据加密

// 游戏对外服数据协议
message ExternalMessage {
  ...
  // 协议开关,用于一些协议级别的开关控制,比如 安全加密校验等。 : 0 不校验
  int32 protocolSwitch = 2;
  ...
  // 业务请求数据
  bytes data = 6;
  ...
}

ExternalMessage 给开发者预留了一个 protocolSwitch 属性,开发者可根据该属性自定义加密内容。

通常来说我们只需要对业务数据(即 data 属性)做处理,利用 protocolSwitch 属性与 data 配合。

具体的加密规则团队内部协商,比如,当路由是单数时用什么、双数时用什么;又或者说当主路由为 5~10 时用什么,大于 20 时用什么;得到规则后,就是对 data 字节数组的操作了。

对于业务数据加解密这部分,可以在游戏对外服编解码部分完成。

HAZYUHE commented 9 months ago

S~BP@QFZJ_G956H9YFQO~35 这一部分在框架内,该如何修改。

iohao commented 9 months ago

自定义一个编解码后,添加到 netty pipeline 中。

具体可参考游戏对外服相关文档

部分参考

假设 YourWebSocketExternalCodec 是你自定义的编解码。

public class Example {
    ExternalServer createExternalServer() {
        // 游戏对外服 - 构建器
        DefaultExternalServerBuilder builder = ...

        // setting:得到 ExternalCoreSetting 对象
        DefaultExternalCoreSetting setting = builder.setting();

        // 对 netty ChannelHandler 编排;重写 MicroBootstrapFlow 的 pipelineCodec 方法
        setting.setMicroBootstrapFlow(new WebsocketMicroBootstrapFlow() {
            @Override
            public void pipelineCodec(PipelineContext context) {
                // 添加 http 相关 handler
                this.httpHandler(context);

                // 建立连接前的验证 handler
                this.verifyHandler(context);

                // 添加 websocket 相关 handler
                this.websocketHandler(context);

                // websocket 编解码
                context.addLast("codec", new YourWebSocketExternalCodec());
            }
        });

        // 构建游戏对外服
        return builder.build();
    }
}
HAZYUHE commented 9 months ago

好的 感谢靓仔!!