rpc设计的再次思考20251215(以xdb为核心构建游戏框架)

1.服务提供者注册的方式

复制代码
// 表明这是一个服务提供者,ServerType 和 ServerId从application.properties中读取
// 而且只有当当前服务是Game时,才生效。 或者 条件注解???
@RpcProvider(type=ServerType.Game)  
public class GameProvider{

   @MsgReceiver(MsgXxx.XxxMsg.class)
   public login(RpcMsgParam param){
        // 获取对方请求的参数
        MsgXxx.XxxMsg msg = param.getMsg();

        // 主要用于返回数据给服务消费者,这样子何时返回就无所谓了
        Channel channel = param.getChannel();

        // TODO 进行业务处理,并且根据Channel进行数据返回。
   
}

思考:

rpc的用途仅仅是用于进程间通信,如:游戏服和游戏服,Web服和游戏服,游戏服和战斗校验服。

如果是本服的,则是线程间通信,比如:逻辑线程和地图服务在一个进程内这种开发方式,则另外指定线程间通信。

同时解决了dubbo rpc的必须是同步调用的缺陷,而我们采用xdb后,其实是可能在事务内提交成功时,才进行我们的处理。

2.暴露出的3种接口

复制代码
// API1: 异步调用(比如:游戏服和游戏服通信,游戏服和战斗服通信)
RpcContext.asyncCall(serverId, xxxAsk, XxxAnswer.class)
     .whenComplete((answer, exception)->{

     });


// API2: 同步调用(主要是: 比如: 充值web服发货通知游戏服给道具之类的)
XxxAnswer answer = RpcContext.syncCall(serverId, xxxAsk, XxxAnswer.class);


// API3: 仅仅是通知,无需返回
RpcContext.send(serverId, xxxAsk);

思考:

关键之处就是:获取serverId, 想查询一个玩家信息这种,根据玩家id其实是知道serverId的。

web服 和 联盟服之类的,这种是从注册中心获取的。

3.通信协议和编解码器

使用rj那种,比较简单的处理,只需要指定包头包体长度即可。

消息id 和 class的映射,我采用英雄传说中的。

相关推荐
小园子的小菜2 天前
Netty 核心组件 Channel、ChannelHandler 与简易 RPC 架构实战详解
网络协议·rpc·架构
聪明蛋子哟4 天前
高扩展性AI应用架构指南:融合RAG检索、Agent编排与OpenAPI/RPC工具网关的设计模式
人工智能·rpc·架构
小此方5 天前
C++ 工程组件与基础设施(三)详解RPC服务的概念与安装,图片介绍Brpc服务器和客户端的搭建过程
服务器·c++·rpc
笨鸟先飞的橘猫6 天前
混合流量导致 RPC 消息队列堆积
rpc·线上问题查证
阿正的梦工坊7 天前
深入理解 JSON-RPC 2.0:轻量级远程调用协议详解
rpc·json
进化中的刀盾兽9 天前
从零实现 C++ Json-Rpc(十):把消息交给真实连接——MuduoConnection 与 ConnectionFactory
c++·rpc
骑着蜗牛撵大象32712 天前
飞牛fnOS部署Damselfly:Compose编排、照片目录与7100固定访问
java·docker·rpc·dubbo·fnos·照片管理·damselfly
syagain_zsx14 天前
BRpc 二次封装:Channel 管理、服务管理与回调工厂
c++·学习·程序人生·rpc·谷歌
mister_guo14 天前
HTTP 和 RPC:从一次干饭说清它们的区别
网络协议·http·rpc
zzu123zsw14 天前
面对多 RPC 扇入超时崩溃:深入 asyncTool 核心 DAG 编排与线程池隔离防护
java·网络·spring boot·网络协议·rpc·并发编程