go实现一个简单的游戏服务器框架(lotou)起源

原创 2016年12月08日 15:30:30

代码仓库,目前代码比较粗糙,欢迎各种改进建议。
最近一直想学习一些关于游戏服务器的知识,显示看了一下云风的skynet框架,从而对于一个游戏服务器框架有了一个基本概要了解。先来说说我对于skynet的一些理解吧。

skynet理解

skynet只完成了服务器最核心的一部分功能,必须消息分发,必须服务的创建、销毁以及服务间的通信。
skynet中最核心的两个部分,网络和消息分发。

消息分发

skynet中有一个消息队列的队列,这个队列保存了每一个服务的消息队列,当发送消息的时候,将消息放入指定服务器的消息队列中,然后有1-N个工作线程,负责从队列中取出一个服务器的消息,然后在这个线程中对这些消息进行处理,当处理完毕之后又放回到消息队列中,这样就保证一个服务的消息,每次分发都只会在一个线程中执行,从而避免了一些不必要的资源竞争(因为一个服务的逻辑只会同时在一个线程中执行,所以在一个服务逻辑内部不需要考虑资源竞争)。
当然这里进行消息分发还有一些其他原则来保证一个服务不会太长时间占用工作线程。
当然,针对服务器,云风还在lua层做了很多重要的处理,这里就不细说了。

网络

所有的网络操作,最终都统一到了一个网络线程中,在这个线程中使用了epoll模式来实现高并发的网络模型,在socket中,每一个fd都会和一个服务相关联,当该fd上有消息到来的时候,对应的消息会被转发到fd对应的服务的消息队列中,这样服务就可以对网络消息进行处理了,同时对fd的写操作也会被分发到该线程,并在fd可写的时候,进行消息发送。

多节点

然后在基于上述消息分发和网络的基础上,skynet还构建了一个基于master-slave的多节点系统,通过服务的全局名字和节点ID|服务ID,将消息从一个节点分发到另外一个节点对应的服务中。

在看完skynet之后,当然也只是一知半解,不过基本还是达到了可以使用的程度了。但是当准备开始用它来写一个游戏服务器的时候,还是发现有点力不从心,一是skynet只是一个核心,真要用他来实现功能,其实还需要很多其他的东西,比如数据库,比如http,通信协议…等等,当然这些都是可以解决的,也已经有很多人用skynet写了游戏服务器,但是中最要的一点还是我不太习惯动态语言,使用lua来写代码,让我很没有底气。一个简单的大小写都要等到运行时才能检测得到。
就是在这样一种心态下,我开始接触了go语言,一个静态类型、编译、类C的语言,并且支持高并发和一样很好的封装了通信和网络接口。
通过几天的go语言学习,我决定用它来实现自己的第一个游戏服务器框架,因为以前没有怎么接触过游戏服务器编程,所以就只好模拟一下skynet的行为了。

【开源】golang高性能分布式游戏服务器框架-mqant

2016年底的时候对即时通讯以及游戏开发产生了一些兴趣,而且自己这方面的知识掌握也非常少,在未来很多产品应该都会使用到长连接技术(物联网IOT),因此很有必要掌握这方面的技术。于是就在网络上查询相关的...
  • o1587790525
  • o1587790525
  • 2017-02-27 18:10:46
  • 10851

使用Golang开发手游服务器的感想

从最初决定使用Golang开发游戏服务器(参考这里),到服务器基本成型,经过了两个多礼拜的时间。这里记录一下感想和心得。具体Golang的使用经验将来有时间会再开篇文章来写。         两个礼...
  • langresser
  • langresser
  • 2016-01-11 11:30:00
  • 9395

GoWorld – 用Golang写一个分布式可扩展、可热更的游戏服务器

GoWorld是一个使用Golang实现的可扩展的分布式游戏服务器引擎。GoWorld提供对象(Entity)框架来为服务端逻辑开发提供便利。Entity可以在多个场景(Space)之间进行跳转,并且...
  • xiaonanln
  • xiaonanln
  • 2017-08-03 21:56:31
  • 2235

golang Leaf 游戏服务器框架简介

Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏服务器框架。Leaf 适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器。Leaf 的关注点:良好的使用...
  • Kaitiren
  • Kaitiren
  • 2017-11-04 11:43:43
  • 600

go实现一个简单的游戏服务器框架(lotou)基本设计

代码仓库,目前代码比较粗糙,欢迎各种改进建议。 以为go语言原生支持高并发(goroutine)和通信机制(channel),所以首先想到的就是使用这两个东西来构建我的消息分发机制。 核心思路: ...
  • sydnash
  • sydnash
  • 2016-12-08 16:08:01
  • 2095

游戏服务器框架简述

游戏服务器框架简述 框架 目前游戏类型千差万别(卡牌,arpg,mmo,moba等),每种类型游戏设计的侧重点不相同导致框架上的差异,不过即使相同类型游戏,不同设计师实现的框架也不经相同。...
  • huangshulang1234
  • huangshulang1234
  • 2017-12-10 09:37:50
  • 1257

Go游戏服务器开发的一些思考(一):语言层面

Go是比C++更好用的高级语言使用Go作为服务器开发的主语言前,首先需要对Go语言做下定性。在接触Go前,可能给人的印象(至少是我),Go是一门脚本语言。看了 官方文档 ,才知道Go是一门高级语言。与...
  • u013272009
  • u013272009
  • 2017-06-10 13:25:08
  • 2112

Go游戏服务器开发的一些思考(十):goroutine和coroutine

概要go语言的特色之一就是goroutine。也就是go协程。由于协程这个东西在go语言之前,用到相对比较少,大家对协程的理解程度不一,或有偏差。比如本人刚接触goroutine时,就对其比较畏惧,因...
  • u013272009
  • u013272009
  • 2017-07-28 17:52:05
  • 1742

Go游戏服务器开发的一些思考(四):综合考察(下)

(接下来的内容,大部分都是纯逻辑问题,与语言没有多大关系。Go语言的作用就是利用它的语言特性,提供接口来应对变化)世界场景搭建 Cell服务器拆出Cell服务,是业内公认的。MMO RPG最核心的玩法...
  • u013272009
  • u013272009
  • 2017-06-11 19:28:23
  • 1043

Go游戏服务器开发的一些思考(二十六):Go Redis ORM库

ORM对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping)。通常指,数据库到程序内类对象的映射。程序中使用ORM的好处 使用OR...
  • u013272009
  • u013272009
  • 2017-11-19 14:20:17
  • 687
收藏助手
不良信息举报
您举报文章:go实现一个简单的游戏服务器框架(lotou)起源
举报原因:
原因补充:

(最多只允许输入30个字)