因为客户端直连服务器会出现很多潜在的风险,比如暴露服务器 IP 地址导致被攻击等问题,所以增加一个网关服务器。
网关服务器
网关服务器是介于客户端与游戏服务器之间的服务,包含以下功能:
- 客户端连接管理
维护游戏客户端的连接。
- 负载均衡
负责将客户端的请求分配到空闲的游戏服务器。
- 协议检查转换
检查协议格式,如有多协议服务器也可以做协议格式转换。
- 安全控制
拦截非法请求,隐藏游戏服务器 IP 地址(避免 DDOS 攻击)。
gRPC
通过以下几个特性综合考虑,决定选择 gRPC(HTTP/2) 作为网关服务器与游戏服务器通信的网络协议。
实时性
可靠性
可扩展性
双向流通信
gRPC 是一个由 Google 开发的高性能、开源的 RPC(Remote Procedure Calls)框架。它使用 HTTP/2 协议和 PB(Protocol Buffers)作为接口定义语言和数据序列化机制。
优点
- 基于 HTTP/2,支持多路复用、全双向流、头部压缩等,效率高。
- 跨语言开发
缺点
- 需要额外配置 Protocol Buffers
gRPC Stream
因为需要双工流通信,所以会用到 gRPC Stream。同时 gRPC Stream 也分为以下几种使用方式:
- 单向
跟 HTTP 请求一样,客户端发送请求到服务器,等待服务器返回响应。
- 服务器流
客户端一次请求,服务器可以多次响应,直到所有响应发送完毕。
- 客户端流
客户端可以多次发送请求,服务器在处理完所有请求后返回响应。
- 双工流
客户端和服务器可以主动以流的形式发送请求和响应。
实现
PB 协议文件
1 | syntax = "proto3"; |
网关服务部分逻辑
1 | func (r *gateway) ServeTCP(conn net.Conn) { |
游戏服务部分逻辑
1 | func (r *server) Stream(stream rpcpb.Game_StreamServer) error { |
测试
附上示例:gateway-grpc