railgun单个服务器APP的结构
这里是单个服务器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 UI结构的系列的文章有一段时间没有更新了,因为最近在学一些新东西和看一些新书籍,适当的给自己充电也是为了更好的输出,言归正传,今天想跟大家聊的是和首页相关的一些内容,可能有些内容最近有的小伙伴 ...
- 图解:从单个服务器扩展到百万用户的系统
作者 | Wolfram Hempel 翻译 | Join 你开发了一个网站(例如网上商店.社交网站或者其他任何东西),之后你把它发布到了网上,网站运行良好,每天有几百的访问量,能快速地相响应用户的请 ...
- 如何从单个服务器扩展到百万用户的系统?
假如你开发了一个网站(例如网上商店.社交网站或者其他任何东西),之后你把它发布到了网上,网站运行良好,每天有几百的访问量,能快速地响应用户的请求. 但是有一天,不知道什么原因,你的网站出名了! 每分每 ...
- 【Android】Android Studio中新创建的app目录结构
安装Android Studio后,然后创建一个app项目.对于初学者来说,我们希望了解app目录结构,然后更好的进行开发工作. 但是要想了解一个app的目录结构,首先需要明确两个概念 Project ...
- 监听服务器app登录用户信息,监控服务器状态app
监控服务器状态app 内容精选 换一换 AOM可与消息通知服务.分布式消息服务.云审计等服务配合使用.例如,通过消息通知服务您可将AOM的阈值规则状态变更信息通过短信或电子邮件的方式发送给相关人员.同 ...
- app网站换服务器,app切换服务器
app切换服务器 内容精选 换一换 通过华为云创建的ECS服务器默认使用华为云提供的内网DNS进行解析.内网DNS不影响ECS服务器对公网域名的访问.同时,还可以不经Internet,直接通过内网DN ...
- iOS App 目录结构
最近公司在招聘新人,难免要问的一个问题就是关于沙盒的,这个问题也是我在第一次面试的时候被问到的.沙盒的目录结构,今天晚上就更新一篇吧,希望对新手有一定的帮助. 模拟器沙盒路径 - - /Users/ ...
- APP 文档服务器,app服务器
app服务器 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 调用接口出错后,将 ...
- ftp服务器app配置文件,Ubuntu FTP服务器配置与应用
一.基本概念介绍 FTP(File Transfer Protocol)文件传输协议,用于控制文件的双向传输,同时也是一个应用程序,可以实现在主机间共享文件,它属于ISO网络结构中的应用层. 当启动F ...
最新文章
- 【复盘】升级打怪第一关,冲啊!
- Php-SPL库中的迭代器类详解(转)
- ES6之路第九篇:Set和Map数据结构
- 别名、浅复制与深复制
- 你觉得python很难嘛?那只是你没有理解而已
- 测试音频质量的软件,音频质量PESQ得分评估原理与步骤
- Linux 最全的添加开机启动方法
- Python练手项目:计算机自动还原魔方视频
- Spring Boot 接入支付宝,实战来了
- python制作万年历
- 【bzoj4372】 烁烁的游戏【动态树分治】
- 三次握手与四次挥手简介
- Dynamic Debug [dyndbg] 概述
- 最新PHP全自动发信投稿系统源码+带后台
- 东财《社会学X》综合作业
- 上海封控区全职妈妈:疫情让邻里更加和睦
- MyEclipse 8.5 中 MTJ 的安装
- 曙光I620-g20服务器装WinServer2016
- Python模拟超级大乐透随机选号
- svn系统找不到指定的文件