一套业务代码,多种协议自由切换

协议选择的困境

项目初期,你选了 Protobuf 作为通信协议,因为它性能好。但后来需求变了:

  • GM 后台想用 JSON 调试,Protobuf 太难看懂了
  • 新增了一个 Web 客户端,用 JSON 更方便
  • 某个第三方系统只支持 JSON

怎么办?传统做法是:写两套接口,一套 Protobuf,一套 JSON。这意味着所有的业务逻辑都要复制一份。

ionet 的做法:业务代码不变,一行配置切换协议。


协议无关的 Action

回顾一下 ionet 的 Action 写法:

@ActionController(1)
public class HallAction {
    @ActionMethod(0)
    private UserMessage login(LoginMessage message) {
        var userMessage = new UserMessage();
        userMessage.name = "Hello, " + message.jwt;
        return userMessage;
    }
}

这段代码中没有任何协议相关的代码——没有 Protobuf.parseFrom(),没有 JSON.parse()。框架在底层处理了编解码,业务代码是协议无关的


新增/减少协议无需重启

ionet 还有一个精妙的特性:新增或减少协议时,不需要重启对外服。

这意味着:

  • 用户不会因为你切换了协议而断线
  • 不需要在整个集群上做滚动重启
  • 可以在运行时灵活调整协议策略

在传统架构中,协议变更通常意味着一次完整的部署周期。ionet 的这个设计,让协议变更变得和修改配置文件一样轻松。


协议碎片治理

什么是协议碎片?

在实际开发中,你经常会遇到这种需求:某个接口只需要传一个 int 值,或者一个 string 值。为此单独定义一个 Protobuf message 显得很浪费:

// 只为传一个 ID 就定义一个 message?太碎片化了
message ItemIdRequest {
    int32 itemId = 1;
}

当这样的"碎片协议"积累到几十个时,.proto 文件会变得臃肿且难以维护。

ionet 的解决方案:自动装箱拆箱

ionet 的 Action 支持基础类型的自动装箱、拆箱:

@ActionController(1)
public class ShopAction {
    // 参数是 int,不需要定义 Message 类
    @ActionMethod(0)
    private ItemInfo getItem(int itemId) {
        return itemService.getItem(itemId);
    }

    // 参数是 String,同样不需要 Message
    @ActionMethod(1)
    private UserInfo findByName(String name) {
        return userService.findByName(name);
    }

    // 返回值也支持基础类型
    @ActionMethod(2)
    private int getPlayerCount() {
        return onlineService.getCount();
    }

    // 支持 boolean
    @ActionMethod(3)
    private boolean isOnline(long userId) {
        return onlineService.isOnline(userId);
    }
}

支持的基础类型包括:intlongbooleanString 等。

这个特性不仅减少了协议碎片,还让业务代码更加简洁自然——就像写普通的 Java 方法一样。


连接方式也是一套代码

类似于协议切换,ionet 的 Action 还能一套代码同时支持多种连接方式

  • TCP
  • WebSocket
  • UDP

不需要为不同连接方式写不同的接口。未来如果 ionet 支持了 KCP 或 QUIC,你现有的业务代码也无需任何改变


小结

ionet 在协议层面的设计哲学是:让协议成为可替换的"插件",而非业务代码的约束。

能力 说明
协议切换 一行配置从 Protobuf 切换到 JSON
无需重启 新增/减少协议不重启对外服
协议碎片治理 基础类型自动装箱拆箱
连接方式 TCP/WebSocket/UDP 一套代码
可扩展 协议和连接方式均可扩展

更多资源

下一篇预告:[5 分钟搭建桌游服务器:Room 模块 + 领域事件实战]

posted @ 2026-04-11 23:18  渔民小镇  阅读(17)  评论(0)    收藏  举报