如何使用 Go go语言服务器写游戏服务器

[Go语言]采用Go语言作为服务端编程语言的建议书
按:这是我给公司(部门)写的使用推广Go语言的建议书,给领导看了以后,领导同意使用Go语言对一些服务器程序进行改写并部署到外网进行验证。希望这篇文章能够给同样在自己公司内部推广Go语言的技术人员有一些帮助。同时如果发现文章中有疏漏不足错误之处也欢迎提出。
采用Go语言作为服务端编程语言的建议书
一、当前的挑战
随着互联网时代的到来,软件(特别是网络游戏)版本更新产品更迭的速度也在加快,这对软件开发效率和质量提出了更高的要求。只有更快更好更多地拿出产品,软件公司才能在市场上取得一席之地。随着我们公司的战略从端游转向页游和手游,加快产品开发的需求也更加迫切。
目前我们公司的主要开发语言仍为C++。确实在端游领域,C++作为客户端的开发语言是不二之选;但是在服务器端,C++作为编程语言越来越力不从心,我相信在进入页游和手游市场之后,这个问题将会越发严重。C++作为服务端的编程语言,存在如下主要问题:
开发效率低
这个已多有讨论,相信有几年编程经验的C++程序员都会有体会。
C++编程中,内存越界、非法内存引用、内存泄漏、非法类型转换等都是常见的BUG,在每个新人每个项目的成长过程中基本都会重复遇到,严重降低了产品的质量和稳定性。
C++对软件工程的支持不够好,例如很不方便的代码重用、复杂的库依赖、五花八门的代码风格、缺乏良好的单元测试设施、不同的编译器甚至不同版本之间的不兼容特性、冗长的编译时间、贫乏的文档化支持等。
功能贫乏的标准库
虽然C++的库很丰富,但是标准库的功能却很贫乏。既没有正则表达式、也没有加密压缩算法、没有序列化支持、没有WEB支持、没有邮件等支持。
没有国际化、多语言的支持
跨平台支持
虽然C++可以在多个操作系统上编译,但是各个厂商的编译器对C++标准的支持不尽相同;标准库的接口也不尽相同;甚至C++对操作系统的统一化处理也支持不好,例如不同平台上的文件路径的处理。
缺乏高并发和多核的支持
C++语言只支持物理线程,严重制约了系统的并发性,在多核时代如果不同提高软件的并发性,性能将受到很大的影响。虽然有一些第三方C++库号称支持轻量级协程,但是使用起来也有很大的限制。
标准不统一
虽然C++有指定标准,但各个编译器厂商对C++标准的支持程度并不完全,在一些实现细节上也有差异;C++对32位升级到64位程序的支持也不够平滑,如果用C++写的程序需要从32位升级到64位,需要做比较多的修改,也会担心因此产生BUG。
学习曲线陡峭
C++是一门非常复杂的语言,即使是三年编程经验的程序员也不敢说能掌握C++知识的多少。现在我们公司的C++程序员,能看模板代码的有多少?自己能写的又有多少?这导致程序员培训的成本,程序员成长的成本非常非常的高。而众多低水平程序员用容易出错的C++写出来代码质量又能有多高?
如上所述,因为C++存在的一些问题,已经(其实是早就)严重影响了软件的开发效率和软件的质量,甚至因为不能充分利用多核的特性也已经影响到了软件的性能。但是一直没有出现合适的替代品。java的出现的一个主要原因就是要解决C++遇到的问题,但是出于虚拟机执行效率低下以及其他原因,并没有被一些公司采用。但是,2009发明、2010年发布正式版本的Go语言来了,Go言是C++语言一个很好的替代方案。
二、Go语言简介
Go语言是Google开发的一种编译型,并发型,具有垃圾回收功能的系统编程语言,官方支持FreeBSD、Linux、Mac OS X和Windows四大操作系统。[1]
三、为什么要选择Go语言作为服务端开发语言
出身名门,社区支持,前途有保障
Go语言出于Google公司,由众多业界顶尖技术人士主持设计和开发,技术实力自然有保证。Go语言的作者包括:
Ken Thompson()
设计了B语言和C语言,创建了Unix和Plan 9操作系统,1983年图灵奖得主,Go的共同作者。
Rob Pike()
Unix小组的成员,参与Plan 9和Inferno操作系统,参与
Limbo和Go语言的研发。《UNIX编程环境》作者之一。
Robert Griesemer
曾协助制作Java的HotSpot编译器和Chrome浏览器的JavaScript引擎V8。
Russ Cox()
9操作系统的开发,Google Code Search项目负责人。
Ian Lance Taylor
GCC社区的活跃人物。gold连接器和GCC过程间优化LTO的主要设计者,Zembu公司的创始人。
Brad Fitzpatrick()
LiveJournal
的创始人,著名开源项目memcached的作者。
另外,设计Go语言的动机是为了解决Google公司自身在服务器端开发中遇到的一些实际问题,而不是某些人出于兴趣而发明的玩具,所以不存在半途而废的危险,只会不断的发展和完善。
由于Go的优秀特性,加上是开源语言,也吸引了很多开源社区的人士参与开发。Go语言的社区非常活跃,甚至Go语言的主要开发人都经常在社区里参与讨论,并给一些初学者进行解答。作为功成名就的顶尖技术人士还能有这样的热情参与社区的讨论脚轮,只能说他们确实是非常非常的热爱他们自己创造的这门语言。
Go是强类型的编译性语言,从这一点上说,Go的执行效率在理论上会比较好。根据的测试报告[2]显示:C++的效率大约是Go的2~3倍,个别测试项目上则是7~13倍。Go语言主要开发者Rob Pike解释说这是因为Go一些标准库如正则表达式的优化还不够,Go语言编译器生成的代码本身已经足够媲美C/C++[3][4]。
在即将发布的Go1.1中,性能会得到很大的提升。加以时日,Go语言还会进一步改进完善。
开发效率高腾讯soso团队称,在将一个C++程序用Go改写后,代码行缩减为原先的50%[5]。
语言标准统一
Go语言支持FreeBSD、Linux、Mac OS X、Windows四大主流操作系统,用Go语言编写的代码如果没有用到操作系统特定的系统调用,完全可以不做修改在各个系统上编译运行,程序的行为表现完全一致而不会有差异导致BUG;Go语言在设计时就考虑到了对32位和64位程序的兼容,基本上32位程序不需要做特别的修改就可以直接在64位上编译运行。
很方便的与C函数进行交互的接口
Go主要支持与gcc的交互,在Windows平台上需要安装MinGW,而且支持不是很好。
丰富的标准库
Go语言提供了丰富的标准库,可以很好地支付服务器端开发:
网络库(包括 Socket、HTTP、RPC
编码库(包括 JSON、XML、GOB等)
加密库(各种加密算法、摘要算法)
Template、HTML支持)
许式伟(前金山技术总监,现七牛存储CEO)认为,在所有语言中Go语言的标准库是对服务器端开发支持最好最全面的[6]。
国际化支持
Go语言直接在语言层面支持UTF-8。
高并发、多核的支持
采用CSP并发模型,使用轻量级的goroutine。程序员可以创建大量(百万级别)的goroutine同步执行逻辑,简化编程。
良好的软件工程支持
采用包机制管理源代码以及非侵入式接口设计,对代码重用支持非常好
规范的错误处理
对单元测试、性能测试提供了良好的支持
良好的文档化支持。程序员只要按照约定写好注释,工具可以自动生成漂亮的说明文档
强制的代码风格,保证了所有程序员编写的代码在风格上都能保持一致,降低了程序员阅读他人代码的门槛。
编译速度极快,对每日构建、集成测试提供了很好的支持。
语言设计上的改进,避免了C++中很多常见甚至不可避免的BUG
Go语言中对数据类型、指针和字符串处理都做了重新设计,防止了许多在C++中常见的内存处理BUG;同时Go语言提供垃圾收集功能,也防止了C++中常见的内存泄漏的问题。
相比C++更易于深入了解和掌握语言的核心技术
Go语言采用BSD License开源协议,任何人都可以获取并修改代码用于个人或者商业用途;同时Go语言语法简洁、核心小而精炼,易于了解和学习其内部实现机制。
学习曲线平缓
Go语言属于C家族系列,因此C/C++程序员对于Go语言的语法会有一种熟悉的感觉;同时因为Go语言的语法比较简洁,程序员可以较快掌握其语法;另外Go语言官方还提供了交互式的学习平台,程序员通过做一些交互练习可以很快上手。
四、成功案例
目前Go语言已经获得了相对广泛的使用:
Google公司的云计算平台GAE(实验性支持)[7]:
为Google公司的下载网站提供支持[8]
Google公司内部未作说明的一些项目[9]
YouTuBe使用Go语言来访问MySQL数据库[10]
上海七牛信息技术有限公司,使用Go语言作为云存储技术的核心实现语言,代码规模在100K行以上。[11]
奇虎360公司使用Go语言实现千万级在线实时消息推送服务。[12]
五、Go语言目前存在的一些问题:
Linux内核版本
Go语言需要Linux内核版本在2.6.23及以上,因此CentOS 5.X系列均不支持。
数据库驱动
目前对于一些常见和主要的数据库MySQL、Oracle、PostgreSQL,尚没有官方的支持。但是已经有一些第三方的数据库驱动可以使用,YouTuBe也开源了一个Go连接MySQL的驱动[10]。
IDE和调试支持
目前类似Visual
Studio那样强大的商业性的IDE支持Go语言开发。但是有一些小型或者免费的IDE可以使用,基本上可以满足开发需求。调试器为GDB,在Windows上需要使用对应的Windows版本的GDB。
Go语言本身的性能和问题
根据目前使用Go语言的情况反馈来看,当前Go语言的1.0.3版本的垃圾回收存在一些问题,在32位平台上可能导致程序内存不足而崩溃[13],但是这个问题已经在开发版本和2013年上半年将发布的Go1.1中修正;当前的垃圾收集算法效率也不够高,但是也已经在开发版本和2013年上半年将发布的Go1.1中修正[14]。
六、风险及规避
可能的风险
并发编程容易导致程序死锁
采用良好的编程规范、代码框架和结构
并发编程容易增加调试难度
采用良好的编程规范、代码框架和结构;记录完整充分的日志
从单线程编程转向并发编程需要转换思维模式
从一些小项目、实验项目来积累并发编程模式的知识和经验
Go语言不稳定或者性能上存在问题
已经有实际的其他公司(七牛、360等)产品在运营,稳定性得到验证;可以从一些小项目、实验项目开始、从少到多,从点到面,逐渐验证Go语言的性能和稳定性
Go语言开发人员不足
对C++程序员来说,Go语言其实很容易上手,可以逐渐开始并加强相关培训;开始一些工具
小项目和实验项目的编程
Go语言一些特性(字符串、goroutine、channel等)的滥用误用影响性能
采用良好的编程规范;加强程序员培训、代码评审;使用Go语言自带的性能测试工具进行回归测试
七、目前我对Go语言编程的实践和感受
目前我已经实现了一个从SPR中提取PNG的工具,已经在版本发布的打包流程中实际使用,运行良好;另外出于验证性的目的,用Go语言改写了玩家登录服务器程序,未投入外网使用。
我的主要感受是:
Go语言来写代码非常的简洁。特别是原来玩家登录服务器中复杂的异步处理和状态检查,用Go语言中用阻塞式顺序执行的流程很简单就实现了,业务逻辑处理一目了然非常清晰,不用再竭尽脑力去考虑有没有什么状态忘了处理,导致卡号重复登录等BUG。
Go语言很容易实现代码重用。用C++写工具都需要去主工程里抠代码然后拷贝粘贴到新的工程,但是在Go语言里,通过包管理机制和非侵入式接口,代码重用很容易就实现了。
下一个实践内容是打算用Go语言实现机器人测试工具。项目内先后曾经有过多个机器人,但是都废弃了。一个主要原因是不好用,占用内存和CPU高,一台物理机跑不了几个机器人;因为用的少,代码也慢慢没有人维护了,现在是否能编译通过还是一个问题。但是如果用Go语言支持高并发的特性可以很好地用于实现机器人,甚至还很容易实现几个机器人之间的交互,因此可以用机器人来测试玩家交易等有交互性的功能。这个机器人实现以后,可以比较容易地用于性能测试。
Go是一门出身名门、很有前途的通用性编程语言,特别适合于多核时代的服务器端开发,被誉为是互联网时代的C语言;此外它改进了C/C++语言的许多不足之处,在软件工程上也提供了优秀的支持。使用Go语言,能够更快更好地开发出软件产品。现阶段,Go语言还不能完全立刻替换掉C++语言作为公司的主要开发语言,但是我建议公司能够早日对Go语言进行考察使用,并推广到需要的项目和产品中去。&
[6]许式伟演讲:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。话说,已经很久没有在博客园更新博客了,之前写的关于go语言的系列学习文章《让我们一起Go》也由于种种原因一度中断。但是,正如我之前在文章中所写,可以慢慢来,但是对于Go语言的学习却不会停止,当然不只是Go语言,对于.net技术还有其它等等等都不会停止。或许文章题目取得不太好(实在想不好名字了),因为题目中我特意强调了下是Go语言,不过我确实没有想表达XX语言更好的意思哦(或许是我想多了^_^)。因为经常有人会挑起语言或者技术之争,而且为了争论XXX语言更好而争的面红耳赤甚至人生攻击。如果只是单纯的技术讨论当然也是很好的,但是就是有些人会特别可怕,所以为了码农界的和平,这里需要澄清下--这里强调Go语言只是之前博主一直在学,然后确实是用它搞了一个小玩意罢了。对于用起来怎么样,因为虽然学很久,但是都是碎片时间学的,也算是新手,所以我也不说了,谁用谁知道嘛。而且对于像我这样什么都喜欢搞搞的,才不在乎有没有XXX有木有前途呢。正如刚来博客园时候,博主热情的学习silverlight一样,虽然现在它似乎不行了,但是我从来没后悔过(因为当时玩得很开心,也学到了很多),如果你也和我一样,喜欢玩玩这玩玩那,那我们或许是同一类人。很久没写东西,一上来就那么多废话,请谅解啊,太就没说话,太饥渴了。下面进入正题吧:
一 您是否知道Go语言?
这是第一步,如果您知道Go语言(这里的知道指的是可以用Go写点小程序,可以看懂Go写的程序代码),那么您可以跳过这,直接下一环节吧。如果您还不知道或者不了解,那你可以Google下,或者看看&。当然实在没有,也可以看看博主写的《让我们一起Go》(不过不建议看了,因为Go更新较快,有些内容可能过时了,而且写的似乎不怎么好)。
二 我为什么要用Go语言自己搞一个小网站?
到这里,我有必要说明下为什么我要自己搞一个网站(博客)呢?因为我瞎折腾,哈哈。其实博客园挺好的,除了博客园还有其它一些博客也挺好。但是呢,我就是喜欢折腾,于是通过jekyll在github上搞了下博客,似乎没什么难度。然后呢,不正学这Go语言嘛,就萌生了用Go试试看的想法,于是打算找个Go实现的类似东西,结果找到了一个叫的项目,一看项目,我去,文件还挺多。但是对于我这样爱钻牛角尖的,用别人的东西,如果只是看下文档使用,似乎满足不了我,我必须得把它源码全搞明白。而且之前计划春节前必须用Go做点小东西实践下,于是乎我就开始纠结了,是重新造个破轮子呢还是用别人的?大概纠结了一天,我终于决定造个破轮子吧(^_^)。于是在接下来长达一个多的星期里,还是利用工作之余的时间完成了&这个简单的Go实现的静态网站生成器(或许可以叫静态博客引擎,但是我觉得目前功能太简单,还是叫生成器比较适合)。相比前面提到的hugo,确实功能简单了很多,当然代码除去模版文件,代码也是非常简单和少的。虽然简单,但是对于我自己来说,目前已经够用了,当然需求总是会变的,以后还会继续修改完善。目前已经使用它部署了自己的一个小站,如果你已经迫不及待想看看效果可以&。博主最终决定,虽然是个破轮子,但是还是分享出来吧,对开源事业做点贡献呀。如果您是高手或者对这种折腾的事情没兴趣,似乎可以不用往下看了,因为下面我主要会介绍gosk的一些使用方法而不会介绍如何去造一个这样的轮子(因为这样不够一篇文章就能搞定的,或许以后博主学的再深入点会写一些这样的文章),同时非常抱歉浪费您那么多时间,一直从文章开头读到了这里:) 。如果你是新手,或者喜欢折腾,也想试试造轮子,可以随便fork gosk的源码并修改或者参考gosk的源码造自己的轮子,因为gosk是采用MIT License的。接下来,将为新手提供一个简单的使用教程。
三 使用gosk快速生成自己的博客
首先点&,然后下载编译好的可执行文件(这里只介绍直接使用编译好的应用,而且在windows平台下,如果你想自己编译或者要使用其它平台,请点查看详细如何通过源码编译)。
如上图所示,可以下载可执行文件。
下载到本地后。
可以看到如上图的目录结构, 其中root目录下就是待生成的模版文件和各种资源文件,现在不用去管它。通过windows的命令提示行,进入到gosk.exe所在的目录,然后
1.运行gosk build
该命令是一个编译命令,如果一切顺利,您将看到在当前目录下会生成一个叫publish的目录,里面就是根据root目录中模板生成的html页面。
2.运行gosk run
这个命令将运行gosk的一个本地测试服务器,用来在本地调样式的时候,方便本地预览。运行后,可以打开 就可以浏览生成的站点了。如果要在其它端口运行静态资源服务器,可以执行gosk run :8080 ,这里将会运行在8080端口。当然在真实环境不建议使用内置服务器(虽然博主的站点在使用),因为性能可能不够高,建议使用nginx等更合适的服务器。
四 如何自定义自己的个性化网站
gosk提供了自定义主题的功能,可以方便的编写自己的模板和主题。gosk默认提供了两个主题(其实是一个,只是语言不同)。如果想使用更多主题可以访问,这是一个gosk的辅助项目,主要用来提供主题的。里面有详细介绍如何使用新的主题。如果您想编写自己的主题,如果懂点Go语言和Css还要javascript,应该是很简单的,由于时间原因,今天就不具体介绍如何定制自己的主题了。如果您有好的主题,欢迎提交到与大家分享哦。
好吧,你还想问如何可以像博主一样将网站发布到公网,然后有自己的域名。这方法就很多了,可以用vps,可以用虚拟主机,甚至可以用树莓派。对于喜欢折腾的你相信这点应该难不倒你,这里就不详细说了(我怕dudu生气,万一我把用户全搞出去了,博客园不是没人了?其实博客园很好的,嘿嘿)。
今天就介绍到这里了,行文仓促啊,可能很写的很多不对的地方,没办法,因为马上要春节了,这也算是完成了今年自己的一个任务,虽然是急急忙忙的,总算赶着春节前搞定了。----谨以此文献给所有喜欢开源和喜欢折腾的小伙伴们,最后祝博客园越来越好,祝所有的园友们新年快乐!
阅读(...) 评论()

我要回帖

更多关于 go语言服务器 的文章

 

随机推荐