peter dong 的blog

游戏服务器架构(附图)

本文将阐述一套服务器架构,算是做一个知识记录吧,尽管它有很多缺点,设计上存在硬伤,但支持公司目前乃至未来几年的业务量还是充分足够了。

总体架构如下图:

游戏服务器架构(附图)

服务器内部总共有:网关、登陆、广场、游戏、中心、DB代理、Web代理 这几个进程。

工具类则有守护、监控、管理中心 三个进程。配套系统则是网站后台。

1、网关服

网关作为外网和内网的隔离层,直面玩家(一般情况下,整套服务器除网关外,会部署在同一个局域网内)。客户端保存 url ,访问时通过域名解析到网关。客户端保存了端口范围,自己随机选取一个端口进行连接。(此处设计并不好,可优化)

网关主动连接中心服,获取登陆、广场、游戏节点的ip、端口信息,并连接。当玩家连接网关后,消息包根据功能派发到不同节点中去处理。网关对玩家是有多少玩家就有多少条TCP连接,但是对内部服务器节点则是各自一条连接。

2、登陆服

网络棋牌游戏服务器架构

一、物理架构说明

游戏系统组件包括:

  ○ 服务器系统(中心服务器的控制系统,服务器登陆控制的系统,游戏登陆服务器,游戏房间控制的系统,游戏组件系统),游戏客户端(游戏大厅,游戏组件)。
  ○ 数据库系统:用于保存用户的信息数据、游戏积分数据、游戏系统运行状态的数据以及系统日志数据等数据。
  ○ 中心服务器的控制系统:用于向客户端提供全局配置及初始化数据使用。
  ○ 服务器登陆的控制系统:用于房间服务控制系统的登陆效验使用。
  ○ 游戏房间的控制系统:用于控制游戏房间的启动,停止,添加,删除,管理等等。
  ○ 游戏组件系统:用于具体游戏服务,被游戏房间控制系统挂接,提供游戏服务。
  ○ 游戏大厅:游戏玩家连接游戏使用。

二、系统结构

游戏服务器端开发的一些建议

本文作为游戏服务器端开发的基本大纲,是游戏实践开发中的总结。

第一部分 —— 专业基础,用于指导招聘和实习考核;
第二部分 —— 游戏入门,讲述游戏服务器端开发的基本要点;
第三部分 —— 服务端架构,介绍架构设计中的一些基本原则。

希望能帮到大家!

一、专业基础

1.1网络

1.1.1理解TCP/IP协议
网络传输模型
滑动窗口技术
建立连接的三次握手与断开连接的四次握手
连接建立与断开过程中的各种状态
TCP/IP协议的传输效率

思考:
请解释DOS攻击与DRDOS攻击的基本原理
一个100Byte数据包,精简到50Byte, 其传输效率提高了50%
TIMEWAIT状态怎么解释?

1.1.2掌握常用的网络通信模型
Select
Epoll,边缘触发与平台出发点区别与应用
Select与Epoll的区别及应用

1.2存储

计算机系统存储体系
程序运行时的内存结构
计算机文件系统,页表结构
内存池与对象池的实现原理,应用场景与区别
关系数据库MySQL的使用
共享内存

1.3程序

游戏服务器开发的基本体系

近年来,我身边的朋友有很多都从web转向了游戏开发。他们以前都没有做过游戏服务器开发,更谈不上什么经验,而从网上找的例子或游戏方面的知识,又是那么的少,那么的零散。当他们进入游戏公司时,显得一脸茫然。如果是大公司还好点,起码有人带带,能学点经验,但是有些人是直接进入了小公司,甚至这些小公司只有他一个后台。他们一肩扛起了公司的游戏后端的研发,也扛起了公司的成败。他们也非常尽力,他们也想把游戏的后端做好。可是就是因为没什么经验,刚开始时以为做游戏服务器和做web差不多,但是经过一段时间之后,才发现代码太多,太乱了,一看代码都想重构,都是踩着坑往前走。

这里我把一些游戏开发方面的东西整理一下,希望能对那些想做游戏服务器开发的朋友有所帮助。

首先,要明确一点,做游戏服务器开发和做传统的web开发有着本质的区别。游戏服务器开发,如果没有经验,一开始根本没有一个明确清析的目标,不像web那样,有些明确的MVC架构,往往就是为了尽快满足策划的需求,尽快的实现功能,尽快能让游戏跑起来。但是随着功能越来越多,在老代码上面修改的越来越频繁,游戏测试时暴露出来的一堆bug,更让人觉得束手无策,这个时候我们想到了重构,想到了架构的设计。

为防游戏外挂需要做哪些工作?

对于一个要上线的游戏,防外挂是必须的,历史上因为外挂而造成大量玩家流失的游戏数不胜数。随着游戏研发技术的发展,对外挂的预防业内其实做的已经越来越好了。下面总结一下防外挂的基础知识,以及我们的移动模块为防外挂做了哪些工作。

1、预防外挂的基础知识

在做外挂预防工作之前,我们要先了解外挂有哪些。根据我的了解,市面上常见的外挂主要有以下几种:

○ 修改客户端的内存信息
这类外挂通过分析游戏所使用的内存,找到内存中的变量去分析猜测变量是代表的什么含义。由于客户端本身保存着很多游戏信息,比如技能cd、移动速度等。由于我们游戏技能的管理和发起是由客户端控制的,若外挂能去把技能cd改为了0,客户端就可以无限放此技能。
常见外挂工具:葫芦侠、八门神器

○ 加速齿轮
加速齿轮可以加速某一个进程的时间流逝速度,通过加速齿轮,可以让游戏客户端进程的时间加速N倍。真实时间可能只过了1s,而客户端进程的时间已经过了Ns。通过加速齿轮,可以让人物移动速度加快、技能cd加速等。
常见外挂工具:加速齿轮

○ 重发、篡改同步消息
此类外挂可以截获客户端发送给服务器的消息,然后进行篡改或者重发。比如可以截获一个释放技能消息,然后再无限重发给服务器,服务器若没有验证,就会无限执行技能。

游戏服务器开发需要学习的技术

一、游戏服务器编程语言的选择

所谓的游戏服务器编程语言其实有很多,基本上任何一种语言都可以作为游戏服务器的编程语言。这需要根据自己游戏的类型和要求加以选择。比如C++,Java ,Erlang,go等等。目前我用过的只有C++和Java.但是以Java为主。所以接下来就以自己的经验,谈谈以Java为核心的游戏服务器开发技术体系。

Java目前作为游戏服务器开发语言已经很是普遍。但是大多数是作为页游或手游的服务器,而端游戏一般选择C++,因为端游对服务器的性能要求相对比较高一些。两种语言各有利弊。C++效率高,但是掌握度难些。没有Java易于掌握。而目前对于追求快速上线率的页游和手游来说,Java成了一个不错的选择。

二、Java的技术系统

需要学习的技术:

(1)Java基础知识

(2)JavaNIO编程

(3)Netty,Mina网络框架精通一种,其它作为了解。

(4)一种缓存框架:Redis;memcache熟悉使用一个。

(5)SQL语言,用于数据库:mysql

(6)springmvc主要用于http协议的服务器

(7)多线程编程,明白线程安全的重要性。

(8)Java并发集合的掌握。

技能模块的防外挂机制和同步机制优化

游戏在真实的环境中,有些特殊情况需要处理,本文介绍技能模块是如何处理人为作弊和现实中的网络导致的一些问题。

主要介绍四个部分:

1. 防外挂
2. 网络延迟问题解决
3. 网络卡顿和抖动
4. 流量优化

注意,本文默认介绍的是玩家的技能处理,也就是技能的控制端在玩家的客户端。对于控制端在服务器的小怪,基本没有前三个问题。

每个游戏的技能系统的实现不同,处理方式也有可能不太一样,本文所使用的技能系统参考之前写的文章:

1.防外挂

由于技能是客户端先行,因此技能模块很多逻辑是放在客户端的,由客户端控制技能流程并且通知服务器执行相应的功能。由此可见,技能是由客户端发起的,服务端必须对收到的技能执行命令进行验证以保证技能确实是可用的,防止玩家通过外挂重复发送技能释放消息无限次释放技能。

每个游戏技能系统实现不同,可能对应的逻辑也不太一样。

基本原则是:
1. 服务端保存技能释放可用性的相关信息,比如技能CD、技能蓝量等。
2. 技能结算在服务端执行,客户端管理技能执行流程。
3. 服务端每次真正的释放技能之前,对技能进行判断是否可用。
4. 服务端收到的技能执行消息后,根据实现系统的规则进行相应验证。

游戏开发项目管理那些事

为什么需要项目管理

项目管理可以理解为为了达到一个特定的目标,所实施的一系列对项目过程要素的管理,内容包括人员,资源,关系和技术等。项目管理的三个核心要素是:成本,时间,质量。通过平衡协调各方面的资源最终完成既定目标。

小项目通常不需要启动专门的项目管理方法论,仅通过核心管理人员的粗放式管理把控即可基本上满足需求。但是当项目规模越来越大,涉及的各方资源和人员越来越多,粗放式管理举步维艰,需要更科学的项目管理方法论才能支撑项目的如期交付。

而在互联网项目,特别是游戏项目中,市场和行业日新月异,项目的需求变化更频繁,完成项目需要的参与各方更紧密流程配合,更需要项目管理在开发过程中发挥作用,汇总资源,管理变化,掌控进度,把控质量,如期交付。

项目管理能够将项目的开发过程和各方资源进度情况比较透彻清晰的呈现出来,便于资源协调和项目开发人员对总体情况的把握,从而更好的完成自己的本职工作。同时,也能给老板,投资方或者合作伙伴一个清晰可见的项目情况。

游戏开发中的项目管理

游戏行业中,如果游戏能够历经九九八十一难最终取得成功,完整的历程一般包括以下几个阶段:

游戏开发过程中需求变化那些事

随着软件项目越来越庞大,为了提高开发效率和有效的质量管控,开发过程中的项目管理越来越重要,流程分工也在不断细化。

传统的软件开发过程分大致分为如下几个步骤:
1. 需求提出
2. 可行性分析
3. 需求分析
4. 概要设计
5. 详细设计
6. 编码
7. 测试
8. 集成交付

产品的最终形态和功能都是第一步的需求所决定,“蝴蝶效应”在开发过程中体现特别明显,第一步的需求发生了变化,很可能会导致后面所有步骤都重来一遍。传统的项目管理除了对项目过程的管控,更多的是对需求的管理。传统的软件项目开发过程中会尽力避免需求的变更,甚至在需求确定以后会由需求提出方(合作开发)出具正式的需求文档并盖章确认以示“不再改变“。

传统的软件开发流程是一个工业流程化的模拟过程,最大力度的管理变化,然后进行工序的详细分拆和实施。整个过程中会有大量的各部门(公司)的沟通会议和流程,时间成本极其庞大,动辄数年的版本计划也很常见。

游戏服务端防御式开发

游戏服务端承担着游戏复杂业务逻辑实现,玩家数据持久化等重要作用。作为一个合格的服务端业务狗,我们有必要遵守一些好的防御手段,让自己的代码少踩些坑,或者当出现了bug,能够在第一时间进行抢救。

下边一些开发原则是我的经验总结,欢迎补充,不喜轻喷o(^_^)o\

  •   检查玩家请求数据的有效性

不管是做web后端,还是游戏后端开发,我们都要检查客户端请求数据的有效性。举个栗子,假设玩家在商店买了一个道具XX,数量为100。对于上传到服务端的参数,例如所购买的道具id和购买数量,我们需要重点检查购买数量参数。总不能玩家说要买100个,但是玩家的金币只能购买10个,服务端就傻傻地给了玩家100个道具吧!

有经验的程序员总是不厌其烦地告诉新手程序员,必须对传入函数的参数进行有效性检测。类似地,我们也必须对玩家的各种请求参数进行检测。很多外挂工具可以直接模拟游戏上一次发包内容,甚至通过对数据的分析进行参数篡改。所以,我们对于直接处理用户请求消息的逻辑方法,应该进行相关有效性检查。

  •   重视行为日志

同步内容
--电子创新网--
粤ICP备12070055号