Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
/ server Public
forked from niuma-wj/server

NiuMa平台游戏服务器(C++、高并发、分布式,棋牌游戏、掼蛋、麻将、斗地主、牛牛)

License

Notifications You must be signed in to change notification settings

Xwuz/server

Repository files navigation

其他语言版本: English, 中文.

项目代码组织入口地址:Project
掼蛋游戏已更新,欢迎下载客户端测试,下载地址 1
下载地址 2

NiuMa 游戏平台游戏服务器(C++)

本项目是使用 C++开发的棋牌游戏逻辑服务器,实现棋牌游戏的后台服务逻辑,例如麻将游戏功能逻辑与流程控制等。客户端与本服务建立 TCP 连接通信,并通过 MessagePack 序列化方案进行消息交互。本服务依赖的第三方组件包括:MySql 8.0+、Redis 以及 RabbitMQ,本服务支持跨平台部署,轻量化设计使得在部署时无需安装太多依赖,基于整体分布式架构设计,本服务器可以根据业务情况进行服务实例弹性横向扩展。本服务设计的一大特点是功能模块简洁明了,代码逻辑思路清晰,核心模块高度抽象和可复用,开发者很容易掌握并进行功能扩展和维护。

游戏服务器核心设计

游戏服务器的核心模块包括:网络 IO、线程模型、消息分发及处理,这三个核心模块从根本上影响着服务器整体并发性能。本项目网络 IO 使用的是 boost::asio 框架,如下图所示,一个 TCP 会话(Session)代表着一个客户端与服务器的 TCP 网络连接,这里将一个完整的游戏逻辑单元定义为一个游戏场地(Venue),例如一张棋牌桌就是一个游戏场地,每个游戏场地有全局唯一 ID,初始化时创建一个专门处理场地内部逻辑的线程池,线程池中每个线程包含设定数量的消息处理器(Message Handler),系统中所有消息处理器都会注册到一个单例的消息处理器列表中,当新建一个游戏场地时,该场地会根据负载情况分配到当前负载最轻的消息处理器,因此一个消息处理器维护了一个场地列表,由此一个场地的所有游戏逻辑和消息处理都在同一个线程内执行,这避免了多线程的数据同步问题,以及复杂容易出错的异步调用问题。当 TCP 会话收到一个消息时,网络接收线程遍历消息处理器列表,一旦列表中有一个消息处理器接收该消息即结束遍历,因为所有场地内的消息都携带了场地 ID 字段,可以用于哈希表匹配,所以遍历是一个非常快速的一个过程。
核心设计

系统后端架构设计

系统包含两种不同处理方式的业务逻辑,一种为上述的游戏功能业务逻辑,由 C++游戏服务器进行处理;另一种则是登录及游戏主界面(游戏大厅)的业务逻辑,由 WEB 服务器进行处理,通过 HTTP Restful 接口进行通信,同时 WEB 服务器还负责根据游戏服务实例的负载情况进行游戏场地分配,例如当玩家新建一个斗地主游戏房间时,会把创建请求发送到 WEB 服务器,WEB 根据所有游戏服务实例的负载情况,将新建的房间分配到当前负载最轻的游戏服务实例,并向客户端返回该游戏服务实例的连接信息(IP、端口),客户端再与该游戏服务实例建立 TCP 连接,从而完成进入该游戏房间,并开始游戏业务逻辑。

系统后端采用分布式架构设计,由 WEB 服务基于全局 Redis 的数据记录进行负载决策,游戏服务实例实时更新它的负载情况到全局 Redis 数据库中,每个 WEB 服务实例都可以独自进行负载决策,因此系统中不需要统一控制的中心和路由服务器实例,并使得游戏服务和 WEB 服务可以根据实际业务量进行灵活节点部署,同时也不需要担心单节点性能瓶颈问题。WEB 服务实例与游戏服务实例之间通过 RabbitMQ 进行交互通信,服务器之间的查询调度可以简单、有序且高效地进行。
架构图

编译(Ubuntu 环境)

首先确保系统已经安装了 cmake 3.30 版本以上,按照以下步骤编译游戏服务:

1、编译安装 boost 库(具体可参考网上教程)

2、安装编译 rabbitmq-c

git clone https://github.com/alanxz/rabbitmq-c.git
mkdir build
cd build
cmake ..
make
sudo make install

3、安装 mysql-concpp

官网下载地址:https://dev.mysql.com/downloads/connector/cpp
选择Linux-Generic,下载Linux - Generic (glibc 2.28) (x86, 64-bit), Compressed TAR Archive
解压缩包:tar -xzvf mysql-connector-c++-9.2.0-linux-glibc2.28-x86-64bit.tar.gz
创建目录:/usr/local/lib/cmake/mysql-concpp-9.2.0
将mysql-concpp-config.cmake和mysql-concpp-config-version.cmake文件复制到/usr/local/lib/cmake/mysql-concpp-9.2.0目录
将压缩包中lib64目录下的全部文件复制到/usr/local/lib目录
创建目录/usr/include/mysql-cppconn,并将压缩包中include目录下的全部文件复制到/usr/include/mysql-cppconn目录

4、编译游戏服务

mkdir build
mkdir bin
mkdir bin/log
cd build
cmake ..
make
cd Server
cp Server ../../bin/

将 server.ini 配置文件也复制到 bin 目录,并按照格式修改相关配置信息

联系方式

393817707@qq.com

About

NiuMa平台游戏服务器(C++、高并发、分布式,棋牌游戏、掼蛋、麻将、斗地主、牛牛)

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C++ 86.3%
  • C 13.6%
  • CMake 0.1%

AltStyle によって変換されたページ (->オリジナル) /