railgun单个服务器APP的结构
来源:互联网 发布:华硕笔记本怎么样 知乎 编辑:程序博客网 时间:2024/06/05 15:27
这里是单个服务器APP的结构图
红色模块表示此模块可有可无
黄色模块表示是至少要有一个
蓝色模块表示一定要有
回到之前的架构图,GATEAPP是有(1)(2)(3)(5)模块,ROUTERAPP是有(1)(3)(5)模块,
一般业务模块是必有(2)(3)(5)模块,(4)(6)模块如果需要连数据库就会有不连数据库就没有
模块1:package 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
模块2:package DialManager是网络拨号模块
DialManager.go:
在开始以remote的身份去尝试连接某个IP地址,连接成功后就新建一个ConnectionSession会话,其他部分与TcpManager.go相似
模块3和4:package PoolAndAgent是消息队列管理模块
MsgPool.go:
声明为Struct SingleMsgPool类型的对象主操作对象,这个相当于整个APP的入口对象,从入口函数main()进入后就是直接操作这个SingleMsgPool类型的对象
SingleMsgPool.bindingNetAgent是绑定的监听代理,这个是package ListenManager的抽象,这个GateApp和RouterApp有,业务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为nil,SingleMsgPool.bindingLogicProcesses因为主业务逻辑里不存在阻塞,就只需要一个协程就行了,如果多协程共享数据会很麻烦。
小结:如果有数据库操作(3)(4)模块均存在,就需要声明2个SingleMsgPool类型的变量。
没有数据操作就只有(3)存在,只需要声明1个SingleMsgPool类型的变量。
Agent.go:
实际上有4个struct类型,现在都放在一起了,可能不太直观,将来应该会把这个文件拆分成多个.go文件
模块5和6:package main是逻辑处理模块
随便简单说一下,后面在应用举例时会详细介绍
main.go:
入口函数文件,这里在将各种agent和process绑定到msgpool上,并启动运行msgpool
PrivateMsg.go:
私有报文的定义文件,这里定义的报文是在App内部传输使用的,因为protobuf是不能定义指针类型的。私有报文的最大的作用是可以定义指针类型,私有报文是不用于跨APP传输的,即不发送到routerApp,每个App根据自己的实际业务需求定义
XXXMsgFilter.go:
这个文件用于报文过滤,只处理业务逻辑模块需要的报文,其他报文丢弃
XXXLogic.go:
主业务逻辑代码文件
XXXDBLogic.go:
数据库业务逻辑代码文件
其他Package:
Protodefine的package bs_proto、package bs_XXX
都是和protobuf报文相关的源文件PublicFun.go,SetBaseInfo.go手写,其他源文件都是由protobuf工具自动生成
PublicFun.go:
一些公共函数,其实与proto不太相关了,将来如果公共函数多了,可能会另外建一个目录和package
SetBaseInfo.go:
对报文的.Base成员变量进行操作的函数,这里每个proto的报文都会有.base的成员变量,里面包含着报文的大类ID,小类ID,connId等基本信息,bs_types.BaseInfo类型的.base成员变量会在后面的报文篇里详细说明
我的邮箱:914509007@qq.com
- railgun单个服务器APP的结构
- 单个App的UI测试
- 如何检测单个APP的耗电量
- 单个服务器和客户端的通信
- metasploit通过附加的Railgun组件操作Windows API
- Android单个app的aidl跨进程调用
- C-关于结构体中字符数组的单个赋值
- railgun项目的不足和将来会逐步新增的模块
- 快速搭建APP的服务器
- railgun游戏服务端架构
- railgun报文层级
- 服务器结构探讨 -- 最简单的结构
- 服务器结构探讨 -- 最终的结构
- 服务器结构探讨(5) -- 最终的结构
- 服务器结构探讨(5) -- 最终的结构
- 服务器结构探讨(5) -- 最终的结构
- tomcat 服务器的结构介绍
- 解决angular单个页面只能加载一个ng-app的问题
- Maven多web模块工程构建各种Error listenerStart启动失败情况及最终解决过程记录
- 封装的个人总结
- C++学习【原创】stable_partition函数的应用
- Java Web应用——监听器初识
- C++ 模板类(廿三)--template模板类使用
- railgun单个服务器APP的结构
- 半个小时学会使用svn命令行进行团队协作
- Java 中BufferedReader & InputStreamReader 用法
- sqlserver删除
- 获取并输出当前安卓设备的系统信息
- mysql 如何插入一列自增序号
- python爬取亚马逊简单的书籍信息
- 浅谈社交网络
- Eclipse使用Maven tomcat:run命令启动web项目时修改默认端口