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

ops/2024/12/19 13:40:08/

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的映射,我采用英雄传说中的。


http://www.ppmy.cn/ops/143192.html

相关文章

04_ok_java_websocket_端口转发_将服务器的流端口转到本地

客户端socket package com.example.filedemo.controller; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import java.io.File; import java.io.IOException; import java.net.URI; import java.util.Base64; imp…

【论文笔记】CLIP-guided Prototype Modulating for Few-shot Action Recognition

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: CLIP-guided Prototype Mo…

Docker Desktop 4.37.0版本支持 命令行启动了

更新日志 Docker Desktop 4.37.0版本 支持命令行了,参考:https://docs.docker.com/desktop/release-notes/ 如下图所示 命令 点上图中的command line 可以看到相关的命令,如下图: 示例 以start为例,如下图所示&…

Nginx反向代理与负载均衡应用实践

Nginx反向代理与负载均衡应用实践 1.1 集群简介 简单地说 ,集群就是指一组(若干个)相互独立的计算机 ,利用高速通信网络组成的一 个较大的计算机服务系统 ,每个集群节点(即集群中的每台计算机)…

uniapp小程序样式穿透

<script> export default {options: { styleIsolation: shared }, //加上这句小程序样式穿透也会有效果 }; </script><style lang"scss" scoped> ::v-deep .u-cell__body {background-color: #2a6ff6; } </style>

详细描述一下 Elasticsearch 更新和删除文档的过程。

1、删 除 和 更 新 也 都 是 写 操 作 &#xff0c; 但 是 Elasticsearch 中的 文 档 是 不 可 变 的 &#xff0c; 因 此 不 能被 删 除 或 者 改 动 以 展 示 其 变 更 &#xff1b; 2、磁盘 上 的 每 个 段 都 有 一 个 相 应 的 .del 文件 。当删 除 请 求 发 送 后 &#…

【设计模式】如何用C++实现观察者模式【发布订阅机制】

【设计模式】如何用C实现观察者模式【发布订阅机制】 一、问题背景 代码质量影响生活质量。最近工作中频繁接触各种设计模式&#xff0c;深刻体会到优秀的设计模式不仅能显著降低后续维护的压力&#xff0c;还能提升开发效率。观察者模式作为一种降低耦合度、提高扩展性的利器…

DNS协议 是什么?说说DNS 完整的查询过程?

DNS协议简介 DNS(Domain Name System,域名系统) 是一个用于将人类可读的域名(如www.example.com)转换为计算机可以理解的IP地址(如192.0.2.1)的协议。DNS类似于一个“电话簿”,它将域名和相应的IP地址关联起来,从而使得网络通信更加方便。每当你访问一个网站时,背后…