小程序原生组件—提升你的小程序体验
1044
2022-10-23
go高性能游戏服务器框架
rhino
go网络基础框架
使用领域
rhino励志打造一个可靠的游戏服务器框架,其核心内容在于
· actor 主要使用在应用层的逻辑部分(actor内部是单线程)例如:日志服务,db服务,游戏服务,网关等等
· network 用于tcp,http,udp的通信,封装读写包
· 其他部分是封装了一些重复劳动的工具
· rpc模块,目前还没有,以后会加入,考虑一个高可用的方案
actor模型
1 核心api在actor中,其主要actor处理逻辑部分在于process
2 process包括邮件(channel)和远程(retome)他们都提供对actor的支持
3 所以一切皆actor
network
net.Conn有个问题需要说下,就是SetReadDeadline/SetWriteDeadline这两个是读写超时的绝对时间
设置读写会超时,那么就需要处理read和write返回值n,查看源码发现net.Conn中write其实是一个write full,所以一般情况不需要设置SetWriteDeadline。
network.stream使用len+body的读取方法,一般处理read/write在单线程比较安全可靠,借助actor模型 由上级actor对其write,来更好的解决和应对分布式中环路堵塞和超时的问题
编写一个简单的服务器
func main(){ network.StartTcpServer(":8088", network.OptionHandler(func(conn net.Conn) (err error) { Stage().ActorOf(WithRemoteStream(func(ctx ActorContext) { switch body := ctx.Any().(type) { case *Started: fmt.Println("connect addr:", conn.RemoteAddr().String()) case *Stopped: case []byte: fmt.Println("message: ", network.ReadBegin(body)) ctx.Send(ctx.Self(), network.WriteBegin(0x102).Flush()) case error: //设置了心跳会被通知 default: fmt.Printf("untreated type %T \n", body) } }, conn)) return })) cli := Stage().ActorOf(WithRemoteAddr(func(ctx ActorContext) { switch body := ctx.Any().(type) { case *Started: fmt.Println("open ok") case *Stopped: case []byte: fmt.Println("cli respond: ", network.ReadBegin(body)) case Failure: //最终错误退出的原因 default: fmt.Printf("other object miss handle %T \n", body) } }, "localhost:8088")) psend := network.WriteBegin(0x101, "who's your daddy!") cli.Tell(psend.Flush())}
(QQ技术群:75205017)
欢迎服务器开发者和爱好者入群交流!阿里,百度,腾讯大牛在线分享经验。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~