当前位置: 首页 > news >正文

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

协议选择的困境

项目初期,你选了 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 模块 + 领域事件实战]

http://www.jsqmd.com/news/625829/

相关文章:

  • WebStorm 2026.1 安装配置 与环境搭建 (保姆级图文教程)
  • kill-doc:免费文档下载神器,10分钟变1分钟的终极解决方案
  • 2026贵州贵阳玻璃隔断源头工厂五大品牌深度横评:如何甄选高透光隔音隔断 - 精选优质企业推荐榜
  • 【HarmonyOS 5开发实战】Windows家庭版Hyper-V配置与DevEco Studio环境搭建全攻略
  • 数字孪生与工业大脑:SOP+VisuCAD 的协同中枢
  • Substance Painter高效工作流:快捷键与实用技巧全解析
  • LeetCode--459.重复的子字符串(字符串/KMP算法)
  • FastAPI 数据库连接池优化与高并发实战
  • PyTorch 2.8镜像中的模型安全与鲁棒性测试:对抗样本生成
  • CoPaw性能调优教程:GPU显存优化与推理速度提升参数详解
  • LaTeX2Word-Equation:3秒搞定公式迁移,学术写作效率提升90%
  • 2026年贵州贵阳办公玻璃隔断源头工厂深度横评:五大品牌性价比对标指南 - 精选优质企业推荐榜
  • 别再死记硬背了!用C++图解递归折半查找和二叉排序树,面试官都夸你理解透彻
  • AI+Dify实战:零代码构建新闻聚合与智能分析全栈应用
  • 华为-AC+FIT AP组网(web方式)
  • AI开发-python-langchain框架(--AI 直接生成并执行 Python 代码 )诳
  • 2026贵州贵阳玻璃隔断定制源头工厂对标深评:五大品牌隔音隔热性能与交付周期横评 - 精选优质企业推荐榜
  • 技术适配器中的接口转换与兼容处理
  • Linux内核中的RCU机制详解
  • 2026贵州贵阳玻璃隔断定制源头工厂深度横评:5大品牌隔音隔热性能对比指南 - 精选优质企业推荐榜
  • Excel VBA 入门到精通(七):用户窗体设计
  • Linux内核中的KVM虚拟化详解
  • vSphere虚拟化实战:从ESXI安装到服务部署全解析
  • AI 时代,计算机专业学生该怎么学?簿
  • 2026年贵州贵阳玻璃隔断源头工厂定制方案深度对标——五大品牌采购指南 - 精选优质企业推荐榜
  • 好用的芯片底部填充胶源头厂家
  • 模电实战:从特性曲线到电路搭建,深入解析场效应管放大原理
  • 2026年贵州贵阳玻璃隔断源头工厂深度横评:从采光隔音到成本控制的完整选购指南 - 精选优质企业推荐榜
  • 2026年贵州贵阳玻璃隔断办公空间定制指南:源头工厂直供与隔音隔热性能对标 - 精选优质企业推荐榜
  • 从Pixel2Geo到MatrixFusion:镜像视界拆解危化园区数字孪生核心技术,30cm定位精度碾压传统方案