railgun单个服务器APP的结构

这里是单个服务器APP的结构图

红色模块表示此模块可有可无

黄色模块表示是至少要有一个

蓝色模块表示一定要有

回到之前的架构图,GATEAPP是有(1)(2)(3)(5)模块,ROUTERAPP是有(1)(3)(5)模块,

一般业务模块是必有(2)(3)(5)模块,(4)(6)模块如果需要连数据库就会有不连数据库就没有

 

模块1package ListenManager是网络监听模块

TcpManager.go

每AcceptTCP()成功一个remote连接就新建一个StructConnectionSession会话,每个会话新建两个goroutine协程,一个RecvPackege()协程用于接收来自remote的消息,一个SendPackege()协程用于向remote发送消息

ConnectionSession.connId是这个会话的唯一标识符

ConnectionSession.MsgWriteCh是sendPackege()使用的channel

当需要向remote发送消息时MsgPool层会向ConnectionSession.MsgWriteCh推送消息


 

DealStickPkg.go

处理粘包的源文件

关于粘包的处理原理可以参考这个链接:http://www.cnblogs.com/smark/p/3284756.html

 

 

模块2package DialManager是网络拨号模块

DialManager.go:

在开始以remote的身份去尝试连接某个IP地址,连接成功后就新建一个ConnectionSession会话,其他部分与TcpManager.go相似

 

 

模块34package PoolAndAgent是消息队列管理模块

MsgPool.go

声明为Struct SingleMsgPool类型的对象主操作对象,这个相当于整个APP的入口对象,从入口函数main()进入后就是直接操作这个SingleMsgPool类型的对象

SingleMsgPool.bindingNetAgent是绑定的监听代理,这个是package ListenManager的抽象,这个GateAppRouterApp有,业务App一般没有必要有

SingleMsgPool.bindingRouterAgent是绑定的连接routerApp的代理,这个是package DialManager的抽象。这个除了RouterApp没有,只要需要与其他App进行相互通信的App都要有,因为都需要通过RouterApp来转发

SingleMsgPool.bindingDBProcess是绑定的数据库代理,如果有数据库操作那么会有这个对象,反之没有。

SingleMsgPool.bindingLogicProcesses是绑定的业务逻辑处理对象,这个是程序猿根据自己的业务需求写的,这个必须要有。可以说SingleMsgPool与bindingLogicProcesses事实上是一体的

 

PS:SingleMsgPool.bindingDBProcess和SingleMsgPool.bindingLogicProcesses都是slice类型,如果有数据库操作的话,这两个成员变量的len()长度相等,一般来说是大于1的,因为数据库操作通常IO较慢会阻塞需要多个协程并发操作。

而不需要读写数据库的APP则是SingleMsgPool.bindingDBProcess为nilSingleMsgPool.bindingLogicProcesses因为主业务逻辑里不存在阻塞,就只需要一个协程就行了,如果多协程共享数据会很麻烦。

小结:如果有数据库操作(3)(4)模块均存在,就需要声明2SingleMsgPool类型的变量。

没有数据操作就只有(3)存在,只需要声明1SingleMsgPool类型的变量。

 

Agent.go

实际上有4struct类型,现在都放在一起了,可能不太直观,将来应该会把这个文件拆分成多个.go文件

 

 

模块56package main是逻辑处理模块

随便简单说一下,后面在应用举例时会详细介绍

main.go

入口函数文件,这里在将各种agentprocess绑定到msgpool上,并启动运行msgpool

PrivateMsg.go:

私有报文的定义文件,这里定义的报文是在App内部传输使用的,因为protobuf是不能定义指针类型的。私有报文的最大的作用是可以定义指针类型,私有报文是不用于跨APP传输的,即不发送到routerApp,每个App根据自己的实际业务需求定义

XXXMsgFilter.go:

这个文件用于报文过滤,只处理业务逻辑模块需要的报文,其他报文丢弃

XXXLogic.go:

主业务逻辑代码文件

XXXDBLogic.go:

数据库业务逻辑代码文件

 

 

其他Package:

Protodefinepackage bs_protopackage bs_XXX

都是和protobuf报文相关的源文件PublicFun.go,SetBaseInfo.go手写,其他源文件都是由protobuf工具自动生成

PublicFun.go:

一些公共函数,其实与proto不太相关了,将来如果公共函数多了,可能会另外建一个目录和package

SetBaseInfo.go:

对报文的.Base成员变量进行操作的函数,这里每个proto的报文都会有.base的成员变量,里面包含着报文的大类ID,小类IDconnId等基本信息,bs_types.BaseInfo类型的.base成员变量会在后面的报文篇里详细说明

 

我的邮箱:914509007@qq.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值