Git Product home page Git Product logo

gonet's Introduction

go-server

gonet 游戏服务器架构。

框架优势

actor

每个Actor都是一个独立的计算实体,Actor之间不共享数据,各个Actor只能操作自己的数据,所有的交互全部通过传递消息的方式进行,可以有效避免共享数据带来的并发竞争问题。

virtual actor

降低分布式开发的复杂性,Actor总是存在,即不用关心代码在那个进程上运行,比如gm可以运行任一模块org,rank,activity具体模块actor怎么运行参考下面的stub。

微服务

stub模型微服务,解决微服务每个模块是不同的二进制,导致部署麻烦,新加进程会很繁琐,stub更像是插件模式,启用不同模块调用不同的微服务,在rpc通信上也无需区别rpcorg或者rpcrank, 只需要一个rpcgm即可

玩家actor

每个玩家一个actor,解耦,模块耦合性弱,lease一致性保证分布式一致性问题

orm

区别gorm,方便开发,玩家存储类似文档,玩家内存改变了定时同步给db,可以为各种嵌套结构

高可用

无单点服务,raft一致性同步元数组(mailbox(id->ip+port),stub),stub保证virtual actor高可用模式。 出故障影响部分玩家,高可用在lease内不可用。

分布式

参考下图的stub高可用(hash一致性) 以及player的mailbox(lease一致性)

rpc

rpc模块脱离传统的注册-回调模式,只需要继承actor即可,actor的成员就是消息处理

uuid

采用snowflake + etcd动态分配机器码

时间轮

优势
5级时间轮性能更佳O(1)
对比timer
go的定时器是大小堆,对高精度10毫秒定时器会吃掉大部分cpu

分布式消息队列

微服务,微服务之间使用分布式消息队列

hotfix(进阶版)

不需要数据分离,应用更广泛的textcode jmp

属性同步(进阶版)

基于内存对比的属性同步,不需要写orm,a.b=1自动存盘,自动同步

rpc(进阶版)

类似grpc,写好回调函数,无需定义proto结构,自动生成rpc代码,无需build 如回调函数是:func (p *PlayerMgr) PlayerOnUnRegister(head rpc.RpcHead, playerId int64) 自动生成代码,rpc发起就直接rpcgame.PlayerMgr.PlayerOnUnRegister(rpc.RpcHead{SendType: rpc.SEND_LOCAL}, p.PlayerId)

进阶版有偿提供联系群主

流程图

流程图替代一些配表,比如ai,目前在开发一个web段的流程图编辑器

mailbox

actor之间消息队列采用mpsc的mailbox 
优势
actor适合mpsc的模式,消息队列满足邮件**
对比channel
1.channel弊端在队列满了,投递消息会阻塞,假如actor处理过慢,大家都等着,谁也别想跑

2.性能在多生产者消费者急剧下降(内部是锁)
基准测试
i7 10700 2.9GHZ 16核 执行10万次生产和消费         
channel         
BenchmarkChanPushPop/100000_1-16             252           4715405 ns/op
BenchmarkChanPushPop/100000_2-16             174           6881893 ns/op
BenchmarkChanPushPop/100000_4-16             180           6635532 ns/op
BenchmarkChanPushPop/100000_8-16             142           8440178 ns/op
BenchmarkChanPushPop/100000_16-16            129           9312717 ns/op            
mailbox             
BenchmarkPushPopActor/100000_1-16            252           4748732 ns/op
BenchmarkPushPopActor/100000_2-16            205           5818782 ns/op
BenchmarkPushPopActor/100000_4-16            278           4348560 ns/op
BenchmarkPushPopActor/100000_8-16            297           3986121 ns/op
BenchmarkPushPopActor/100000_16-16           304           3839012 ns/op

WIKI

交流

QQ群:950288306

服务器架构如下:

image

gm stub

image

gonet's People

Contributors

bobohume avatar yanlingbo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gonet's Issues

找不到包

client 编译提示
cannot find package "server/world/game/lmath"

ActorPool.SendMsg中的panic问题

在ActorPool.SendMsg中
pActor := this.GetActor(head.Id)
if pActor != nil && pActor.FindCall(funcName) != nil{
pActor.Send(head, buff)
return
}
在GetActor后,其他groutine DelActor时
在pActor.Send中,Actor执行过了clear, m_CallChan被close,写入chan 发生panic

world之间有通信吗

比如一个玩家在WorldA 一个玩家在WorldB 如果A里面的玩家要加B里面的玩家为自己的好友,有办法处理吗

server config 文件格式

W2FyZW5hXQ==
c3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICA9IDIwMTEtMTAtMTI=
b3BlbkRheSAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0
Y2xvc2VEYXkgICAgICAgICAgICAgICAgICAgICAgICA9IDc=

WzE5Mi4xNjguMTAuMTM1XQ==
TGluZUlEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7
R2F0ZUlEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7
TmV0R2F0ZV9XQU5BZGRyZXNzICAgICAgICAgICAgICA9IDE5Mi4xNjguMTAuMTM1OjIxMDAxOw==
TmV0R2F0ZV9XQU5BZGRyZXNzX1NlbmQgICAgICAgICA9IDE5Mi4xNjguMTAuMTM1OjIxMDAxOw==
TmV0R2F0ZV9XQU5DbGllbnRzICAgICAgICAgICAgICA9IDEwMDAwMDs=
TmV0R2F0ZV9MQU5Qb3J0ICAgICAgICAgICAgICAgICA9IDQxMDAxOw==
RGF0YUFnZW50X0xBTlBvcnQgICAgICAgICAgICAgICA9IDYwMDAwOw==
这是什么格式? 
启动 ./server netgate 加载配置文件报错

ServerSocketClient协程被阻塞

建议不要在Socket的Stop函数中不要去关闭conn,因为有可能导致Run中的conn.Read会阻塞无法返回,导致无法释放
然后最好在conn.Read之前加一个读取超时,可以跟心跳测试的间隔时间一致的30秒,把conn.Stop 放在Socket.Close一起处理
让Run这个协程能够顺利执行和释放,原来的Socket的Stop只是改变一个状态,然后再Run的loop函数中针对状态,如果状态是SSF_STOP 直接退出循环,特别是在KCP模式下很容阻塞不释放。

if this.GetState() != SSF_RUN {
return false
}

this.conn.(kcp.UDPSession).SetDeadline(time.Now().Add(time.SecondHEART_TIME_OUT))
GJ%5OVDFC80$3Y)_QV VTAR

F `B5(P}3FZ7JEA1EU)UY7P

同学,您这个项目引入了87个开源组件,存在2个漏洞,辛苦升级一下

检测到 bobohume/gonet 一共引入了87个开源组件,存在2个漏洞

漏洞标题:go-yaml < 2.2.8拒绝服务漏洞
缺陷组件:gopkg.in/[email protected]
漏洞编号:CVE-2019-11254
漏洞描述:gopkg.in/yaml.v2是go语言中用于处理yaml格式的包。
在2.2.8之前的版本中,处理恶意的yaml数据时,会导致CPU资源耗尽。
漏洞由Kubernetes开发者在fuzz测试中发现并提交修复补丁。
国家漏洞库信息:https://www.cnvd.org.cn/flaw/show/CNVD-2020-35519
影响范围:(∞, 2.2.8)
最小修复版本:2.2.8
缺陷组件引入路径:main@->gopkg.in/[email protected]

另外还有2个漏洞,详细报告:https://mofeisec.com/jr?p=a2214d

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.