五邑隐侠,本名关健昌,12年游戏生涯。 本教程以Go语言为例。

RPC指远程方法调用,游戏里引入RPC目的是降低跨进程交互的复杂度。
游戏业务设计为多go routine,一个玩家一个go routine。游戏里RPC客户端阻塞式调用远程(服务进程)方法,这样处理的好处是跨进程交互的业务也可以按照单线程顺序执行的思路实现。
RPC请求包由以下几部分组成:标记(字符串,用于区分是哪类调用)、序列号(一次调用的唯一标记)、方法编号(用于映射调用的方法)、参数。
RPC响应包由以下几部分组成:标记、序列号、方法编号、返回值。
type RpcRequest struct {
    Mark      []byte
    FuncNo    uint16
    SerialNo  uint16
    Params    []byte
} type RpcResponse struct {
    Mark      []byte
    FuncNo    uint16
    SerialNo  uint16
    ReturnVal    []byte
}
RPC建立在P2P网络之上,在 P2pListener interface 的 OnP2pCall(p2p *P2pNet, pack *P2pPack) 实现方法,根据包头前几个字节与 Mark 对比,如果一致则调用对应的RPC客户端/服务端进行处理。
对于RPC服务,可以参考http服务,建立方法编号到处理方法的映射。
type RpcHandler func(params []byte) ([]byte, error)

type RpcServ struct {
    p2p               *P2pNet
    mark              []byte
    mapFuncNo2Handler map[uint16]RpcHandler
} func (s *RpcServ) HandleFunc(funcNo uint16, handler func(params []byte) ([]byte, error)) {
if handler == nil {
        return
    }

    s.mapFuncNo2Handler[funcNo] = handler
}
当收到请求后,解析出funcNo和参数Params,调用对应的处理器进行处理。
handler, ok := s.mapFuncNo2Handler[rpc.FuncNo]
if !ok {
    return fmt.Errorf("no handler for funcNo %d", rpc.FuncNo)
}

returnVal, err := handler(rpc.Params)
RPC服务对请求的处理可以是非阻塞的。
一般只对RPC客户端做成阻塞的,这样在客户端调用远程方法时,客户端会一直等待服务端返回才继续往下执行,整个逻辑流程跟单线程执行一样。
通过序列号SerialNo、方法号 FuncNo 双重确认响应包对应于当前请求。
在go语言里,可以通过定义一个长度为1的 chan byte,请求发出后,读取通道,如果还没有收到响应就会阻塞,响应返回时往通道里写个1,唤醒调用流程继续执行。
func Wait(e chan byte) {
    <-e
}
func Signal(e chan byte) {
e <- 1
}
调用方法的参数和返回值都是二进制,业务可以根据自己的需要用json或 protobuff 进行序列化/反序列化。
func (c *RpcClient) invoke(params []byte) ([]byte, error)
RPC调用介绍到这里。接下来介绍下游戏业务进程的实现。
 

go语言游戏服务端开发(四)——RPC机制的更多相关文章

  1. go语言游戏服务端开发(三)——服务机制

    五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例.   P2P网络为服务进程间.服务进程与客户端间通信提供了便利,在这个基础上可以搭建服务. 在服务层,通信包可以通过定义协议号来确定该包怎 ...

  2. go语言游戏服务端开发(二)——网络通信

    一.网络层 网络游戏客户端除了全局登录使用http请求外,一般通过socket长连接与服务端保持连接.go语言的net包提供网络socket长连接相关操作. 对于服务端,一般经历 Listen.Acc ...

  3. go语言游戏服务端开发(一)——架构

    五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例.   网络游戏程序分为客户端和服务端.客户端负责图形渲染.交互和一些简单校验处理,服务端负责业务逻辑处理.数据存储. 我们开发一个游戏de ...

  4. Swift3.0服务端开发(四) MySQL数据库的连接与操作

    本篇博客我们来聊聊MySQL数据库的连接与操作.如果你本地没有MySQL数据库的话,需要你先安装MySQL数据库.在Mac OS中使用brew包管理器进行MySQL的安装是及其方便的.安装MySQL的 ...

  5. Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)

    前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...

  6. 转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端

    from: http://ybak.iteye.com/blog/1853335 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端 游戏服 ...

  7. 俯瞰 Java 服务端开发

    原文首发于 github ,欢迎 star . Java 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻 ...

  8. 为什么多数游戏服务端是用 C++ 来写

    早年开发游戏必须用C++,这没得说,2000-2004年,java还没有nio,其他动态语言不抗重负,只能C/C++能开发出完整可用的游戏服务端.直到2005年,韩国的游戏很多都还是纯C++写服务端, ...

  9. 游戏服务端pomelo完整安装配置过程

    版权声明:本文为博主原创文章,转载或又一次发表请先与我联系. https://blog.csdn.net/jonahzheng/article/details/27658985 游戏服务端pomelo ...

随机推荐

  1. 深入浅出Mybatis系列(五)---配置详解之settings设置

    settings 中的设置是非常关键的,它们会改变 MyBatis 的运行时行为.下表描述了设置中各项的意图.默认值等. 设置参数 描述 有效值 默认值 cacheEnabled 该配置影响的所有映射 ...

  2. 自旋锁&信号量

    1. 自旋锁 Linux内核中最常见的锁是自旋锁.一个自旋锁就是一个互斥设备,它只能有两个值:"锁定"和"解锁".如果锁可用,则"锁定"位被 ...

  3. cmd进入pycharm所创建的虚拟环境

    进入cmd命令,进入虚拟环境所在文件夹.(pycharm每创建一个新项目就会创建一个虚拟环境,位于项目下venv下Script) E:\virtualenv\crawl1\Scripts>act ...

  4. 定位API的原理

    参考:0Day 安全 所有的win_32程序都会加载ntdll.dll和kerner32.dll这两个最基础的动态链接库.如果想要在win_32平台下定位kernel32.dll中的API地址 1,首 ...

  5. Jemeter压力测试

    Jmeter教程 简单的压力测试 Jmeter是一个非常好用的压力测试工具.  Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测试需要的脚本写好. 转载自小坦克:https: ...

  6. Struts2框架基本使用

    时间:2017-1-6 16:53 修改struts.xml配置文件不需要重启服务器.Struts2框架    一.        *   介绍Struts2        *   关于Struts2 ...

  7. mac下用clion进行sdl2游戏开发de环境搭建

    1. 故事背景 想从unity转unreal了,于是要使用c++进行开发.unreal引擎那么大,每次打开,我的小本都嗡嗡嗡的,想着不如用个轻量一些的引擎先开发吧,核心代码独立出来,到时候如果真要移植 ...

  8. IP掩码的作用

    IP地址&IP掩码==网段,即,与上掩码后相同的IP属于同一网段.

  9. linux centos7 移动文件到指定目录

    2021-08-26 在 centos7 环境下怎么移动一个文件到其他的目录下呢? 使用命令  mv 文件名 指定目录  即可完成该操作. 那么怎么将一个文件夹下的内容移动到另一个文件夹下呢?比如有时 ...

  10. 手撕LRU缓存

    面试官:来了,老弟,LRU缓存实现一下? 我:直接LinkedHashMap就好了. 面试官:不要用现有的实现,自己实现一个. 我:..... 面试官:回去等消息吧.... 大家好,我是程序员学长,今 ...