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

https://github.com/sydnash/lotou

目前代码比较粗糙,欢迎各种改进建议。 最近一直想学习一些关于游戏服务器的知识,显示看了一下云风的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语言社区(Golangweb)

原文发表时间:2017-05-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沈玉琛的专栏

当 MySQL 连接池遇上事务(二):消失的记录

ySQL连接池是一个很好的设计,通过将大量短连接转化为少量的长连接,从而提高整个系统的吞吐率。但是当跟事务一起使用时,如果使用方式不恰当时,就会发生一些奇怪的事...

63630
来自专栏FreeBuf

移动APP安全在渗透测试中的应用

这篇文章从去年很早就想写,一直没时间,刚好过段时间有沙龙是讲这方面的东西,整理了下就有了下文。 以往安全爱好者研究的往往是app的本地安全,比如远控、应用破解、...

46570
来自专栏蓝天

选择设置好ext3日志模式

Linux是一种开放的、因Internet而产生的操作系统。Internet的发展、以网络为中心的计算模式如电子商务被迅速接受和普及,都为 Linux提供了更巨...

12820
来自专栏tiane12

Linux/CentOS定期清空指定目录脚本

30840
来自专栏大魏分享(微信公众号:david-share)

VMware软件定义数据中心分析工具介绍----第三终结篇

在本文连载的第一篇中,我向大家介绍了vROps的基本架构、vROps的指标含义,以及如何自定义告警。第二篇中,介绍了如何自定义仪表盘。在本篇中,我将介绍如何自定...

40880
来自专栏Java架构

阿里双十一秒杀系统架构设计,有哪些技术关键点?

秒杀活动只是网站营销的一个附加活动,特点是:时间短、并发访问量大,如果和网站原有应用部署在一起,必然会对现有业务造成冲击。

22330
来自专栏月色的自留地

mac电脑进行可见光通信实验要点

12660
来自专栏安恒信息

Nginx爆发超级漏洞,已修复

近日,Nginx官方更新邮件列表,对外通报Nginx0.8.41-1.5.6版本存在两类高危漏洞,经过安全机构研究团队确认,漏洞确实存在。 使用受...

41770
来自专栏FreeBuf

挖洞经验|雅虎小企业服务平台Luminate身份认证漏洞

对内容管理系统的开发来说,一个重要和关键的步骤就是账户的身份认证实现。身份认证功能可以管理用户登录行为和会话,作出有效的登录访问控制。通常,这种认证功能一般由用...

32340
来自专栏www.96php.cn

[ecshop模板]如何清除测试数据

Ecshop的后台是很强大的,我们只需要把ecshop的所有测试商品删除就可以了。请看详细教程: 1、删除ecshop测试商品数据 在登入后台,找到商品列表,勾...

39070

扫码关注云+社区

领取腾讯云代金券