基于Go语言的分布式服务器开发

 2021-12-02 08:12

论文总字数:33300字

摘 要

本课题采用Go语言作为开发语言,探究了Go语言在游戏服务器上的开发特点,结合业界成熟的服务器架构,实现了一套分布式架构的服务器原型,并对服务器性能进行了测试研究。

本分布式服务器原型包括接入层、逻辑层。接入层通过网关服务器与客户端进行连接,能够自动分配客户端连接并转发消息。逻辑层中有多个逻辑服务器,专门响应从接入层传入的数据,并将消息返回到接入层,由接入层自动转发到相应的客户端。

经过验证,Go语言用于服务器开发的效率非常高。通过测试数据,在测试环境下,该服务器原型的消息响应速度可以达到30k/second。而且当客户端增加的时候,性能仍然保持非常高的水平,该原型的并发性能出色。

关键词:Go语言,分布式服务器,协程,并发,负载均衡

Distributed server development based on Golang

ABSTRACT

This project use Golang as the develop language to explore the performance of online-game server development. Author implements a distributed architecture server prototype in reference of the industry architecture. In addition, author did the performance test.

This distributed architecture server including Access Layer, Logic layer. In Access layer, gateway server connect to clients and auto manage connections from clients. There are several logic server in Logic layer. They receive requests from gateway server and response. The gateway server will transfer message both from logic servers and clients.

According to the research, the performance of development based on golang is fairly effective. Speed of the request-response of this server prototype is more than 300k/second. And it still keep fast when the client number increased. So, it’s Parallel performance is fairly satisfie.

Keyword: Golang istributed server coroutine parallel computing oad balance

目录

摘 要 I

ABSTRACT III

目录 V

第一章 绪论 - 1 -

1.1 引言 - 1 -

1.2 游戏服务器简介 - 1 -

1.3 游戏服务器技术现状 - 2 -

1.4 本文的研究目的和主要研究内容 - 3 -

第二章 Go语言 - 4 -

2.1 Go语言简介 - 4 -

2.2 Go语言在本模型上的使用 - 5 -

第三章 分布式服务器 - 8 -

3.1 分布式服务器简介 - 8 -

3.2 实现目标 - 10 -

3.3 本模型的服务器架构 - 11 -

第四章 具体实现方法 - 13 -

4.1 逻辑框架 - 13 -

4.2 负载均衡 - 14 -

4.3 通信协议 - 17 -

第五章 性能测试 - 20 -

5.1服务器性能测试简介 - 20 -

5.2性能测试模型 - 21 -

5.3性能测试流程 - 22 -

5.4性能测试数据 - 22 -

5.5数据分析 - 25 -

第六章 总结 - 27 -

参考文献 - 28 -

致谢 - 31 -

附录A - 33 -

第一章 绪论

1.1 引言

近年来,网络游戏蓬勃发展,行业竞争愈加激烈。仅2014年,中国网络游戏市场规模就达到了1108.1亿元。 同时,游戏复杂度越来越高,一个好的网络游戏,在线人数用户达到几十万甚至上百万。玩家对游戏质量的要求也快速上升。这对服务器开发者提出了更高的需求:更快的开发效率与更高的服务器性能。

国内行业中,腾讯游戏一家独大,占据了50%以上的市场份额。其余网易、盛大、完美等大型游戏厂商几乎占据了剩下的份额。在这些传统的游戏公司内,他们的服务器开发方式都比较统一,大部分使用C或者JAVA作为开发语言,手机游戏的服务器开发通常需要2~4个人,而大型的端游服务器开发对人数的需求更是达到了十几人甚至是数十人。

在这样的激烈竞争中,小型的游戏团队在服务器开发力度上显然是占了劣势。但是2014年的莉莉丝工作室推出的刀塔传奇游戏,以小团队制作方式,取得了重大成功,而他们的服务器仅仅由一个人进行开发!

刀塔传奇团队的服务器开发语言为近几年备受推崇的erlang。该语言在服务器开发方面有着一些独到的优势,所以带来了非常好的效果。而更加备受推崇的Go语言与erlang的特点相似,是不是在服务器开发上也具有非常好的效果呢?

作者毕设期间在腾讯互动娱乐事业部进行实习,能够接触到一线的游戏服务器开发技术,而腾讯游戏的服务器开发一直采用C语言作为开发语言,结合腾讯服务器的开发框架,作者希望能够使用Go语言开发出一套分布式服务器,探索Go语言在服务器开发上的具体表现。

1.2 游戏服务器简介

网络游戏是一种典型的分布式实时互动的网络应用,网络游戏最大的技术难题是如何根据玩家的操作实时显示事件或动作到玩家的屏幕上,如何克服网络延迟,确保客户端正确,顺利完成实时图形渲染。

在线游戏服务器的设计要求:

1)快速响应使用者

整个系统应该尽量掩饰内在的网络延时,快速响应用户,确保用户操作流畅。

2)提高通信效率

系统应该射击出合适C\S模型的通信协议,去减少网络流量,这样才会让带宽不会成为一些客户端性能的瓶颈。

3)设计高效的并发系统

使用C\S模型设计出高效的并发系统。一个服务器应该同时处理所有的客户端请求,这需要服务器高并发,接受许多用户的链接,并能够高效地定位出错误,给用户提供一个稳定的后端支持。

4)分布式服务器

单独服务器进程能力是有限的,对用户数量的承受能力也是有限的。伴随着大量的客户端增长,服务器需要大量的计算能力和存储容量所以需要服务的分布式基于一些集群服务器策略。

1.3 游戏服务器技术现状

1)服务器架构

在线游戏行业经过多年的发展,游戏服务器技术在服务器架构上已经比较成熟。在服务器架构设计的一个基本原则是分离的框架与通信底层,并且该层不影响框架代码更改。有很多种方式进行通信的底层混合实现,不同的操作系统平台也很不相同。例如,在Windows平台的基础上窗口消息机制,基于事件的机制,完成端口模型的实现。它是运用一些有用成熟的开发框架,它采用的分离框架通信底层,如使用Boost.Asio的框架。因此,当使用新的通信技术来实现通信底层,不能改变的是服务器框架,但只需要修改通信底层原理。按照与服务器架构分离的原则,通信底层设计的服务器架构多个模块,并产生相应的动态链接库中的呼叫。同时由于作为我们发展的四层C / S结构平台,该第一层是在客户端用户接口。第二层是游戏通信平台(网关服务器)这是服务器集群的唯一入口,所有转发请求到特定的服务器,其中在业务节点池,所有功能要求,并管理最终用户开展状态保持登录。第三层是提供实际服务器场的服务来对待和处理所有的请求的功能,不参加用户管理,只保持提供最纯粹的功能。第四层是数据库存储系统,负责管理数据的读写和维护集群的内部操作作为一个整体来提供一稳定和一致的数据访问服务。数据服务器使用备份功能,并建立专门的备份中心确保平台系统的可靠的访问操作。这个主题是确保高效和并发最大服务器性能的前提下。通过线程和通信框架合理实现。

2)服务器开发方式

行业内的大公司在游戏开发上有着很深的技术沉淀,再加上一些框架接口的原因,他们主要使用一些传承下来的语言来进行服务器开发,比如腾讯的游戏服务器开发主要使用C语言。

在腾讯内部,正常的一个小型手机游戏团队,其服务器开发者一般在3人以上。而在一些大型的端游团队,服务器开发团队达到了十几人甚至是数十人。

而行业的一些小团队,由于人手或者资金的制约,他们的开发方式较为灵活,他们会去尝试一些在服务器开发上有着较好表现的新型语言,例如开发出刀塔传奇的莉莉丝团队使用的erlang。在刀塔传奇团队,他们的服务器主要由一人开发,这种开发效率相较于传统的开发模式是非常的高的。

1.4 本文的研究目的和主要研究内容

作者毕设期间在腾讯互动娱乐事业部进行实习。直接接触游戏一线,对行业内的开发方式有所了解,具备实际的研究意义。

本文的研究目的是:使用一种全新的开发语言—Go语言,进行服务器开发,结合腾讯的游戏服务器架构,开发出一套分布式的服务器,并对服务器性能进行测试并分析。探索Go语言在游戏服务器开发上的具体表现,主要是开发效率与实际性能。

主要研究内容是:

  1. 熟悉Go语言的语法方式
  2. 设计出一套应景的分布式服务器架构
  3. 找到一套合适的负载均很解决方案尽量
  4. 使用协程来并发处理请求
  5. 对服务器性的消息处理速度进行测试分析

第二章 Go语言

2.1 Go语言简介

Go语言是Google于2009年发布的第二款编程语言。目前Go语言已经发布了1.4版本。Google推出Go语言的初衷是为了在不损失程序应用性能的情况下降低代码的复杂性。Google首席软件工程师罗布派克(Rob Pike)在介绍Go语言的时候说过:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。

从Google的出发点来看,Go语言是一个便于开发者使用的语言,它有几个突出的特点:

1)快速编译

Go语言作为一个静态语言,它开发安全性高,编译速度几乎与C一样快。

2)自动垃圾回收机制

Go语言能够自动回收垃圾,释放内存,解放了开发者对内存的管理工作。

3)出色的并发性能支持

Go语言非常注重并发性能,它在语言层面上就支持协程(go语言中称为goroutine),这是一个非常轻量级的并发手段,这使得用Go语言实现并发效果变得非常出色并且使用方便。

同时,Go语言能够根据CPU的数量来分布协程的使用情况。GOMAXPROCS()能够设置同时运行的CPU最大数量,这使得Go语言能够充分利用多核处理器来提升更高的性能。

4)简洁、高效的语法

Go语言与语法层面上屏蔽了底层的很多设置,开发者不需要关心底层的具体实现而只需要使用Go提供的语法就能够很方便地进行服务器开发,大大提升了开发效率。

比如goroutine从底层实现上不是真正并行的,但是开发者完全不需要了解它的实现方式,只需要认为,在开发层面上,goroutine就是并行的。

5)跨平台支持

Go语言对多平台的支持非常棒,开发者可以在window/Linux等不同环境下进行开发,而且编译通过的文件能够在多数平台上直接使用,降低了开发者在不同平台上的开发难度。

2.2 Go语言在本模型上的使用

2.2.1 开发环境

本服务器使用Go语言作为全部的开发语言,包括客户端实现、网关服务器实现、逻辑服务器实现以及消息协议的实现等等。

得益于Go语言对于多平台的支持,本模型是在win64的环境下进行开发,使用的编译器是Google推出的轻量级编译器——LiteIDE。

2.2.2 并发策略

实验研究表明,现有的一些服务器的开销主要来源于I/ O的并发策略。重点支出包括:同步,线程的创建和上下文切换。因此,至关重要的是,获得的服务器的性能的关键是高效的并发策略,以下是目前主流的几种并发策略。

  1. 单线程

在这种模式下,所有的连接和控制处理请求由同一个线程。简单单线程去处理请求,这对高流量的服务器是不够的,当用户数量增加时,单线程就不能支持了。目前很多游戏服务器开发使用此方式,用单线程处理客户端请求,当服务器接到不同请求的时候,服务器会不断切换当前线程,这会消耗掉大量的服务器资源。

  1. 一个请求给一个线程

该模式用一个单一的控制线程来处理每个请求,当每一个请求到达服务器,服务器将创建一个新的线程来处理请求。其优点是开发简单,是一个并行的平台。但随着请求个数的快速增加,线程的数目在运行时不受控制的生长,从而耗尽可用内存和CPU资源。因此,它并不适用于那些经常通信的游戏服务器。

  1. 一个会话一个线程

一个会话是一系列由客户端向在网络游戏服务器的请求,是一个客户从登录到退出的全过程。在这种模式下,每一个客户端的请求相应一个的服务器的线程。因为它对每个请求不是在一个单独的衍生线程,所以比以前的模型资源的消耗少,然而,随着客户端的大数量增长,它仍然会消耗大量的资源,并且模式为每个客户端应当创建线程,每个线程需要使用一个完整的堆栈,这将需要大量的内存。

  1. 线程池

在这个模型中,服务器初始化过程将预先推导一组线程,每个线程从作业得到一个任务队列线程处理操作的同时,它是从线程池中取出,在任务完成时,线程返回到池中。线程池的开销,因为成本创建线程通过预衍生进行了评估,但也因为线程池的大小是固定的,所以线程池可消耗的资源的量是有限的。

剩余内容已隐藏,请支付后下载全文,论文总字数:33300字

相关图片展示:

您需要先支付 80元 才能查看全部内容!立即支付

该课题毕业论文、开题报告、外文翻译、程序设计、图纸设计等资料可联系客服协助查找;