go-pitaya学习笔记(2)-chatDemo分析
学习笔记: 我家别墅靠大海/pitaya-learn
尝试集成功能:我家别墅靠大海/pitaya-game
如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!!
我是按代码的顺序记的笔记
分析chat demo
main.go ->main 首先他声明了一个config的生成器
conf := configApp()func configApp() *config.BuilderConfig {conf := config.NewDefaultBuilderConfig()conf.Pitaya.Buffer.Handler.LocalProcess = 15conf.Pitaya.Heartbeat.Interval = time.Duration(15 * time.Second)conf.Pitaya.Buffer.Agent.Messages = 32conf.Pitaya.Handler.Messages.Compression = falsereturn conf
}
NewDefaultBuilderConfig提供默认生成器配置
当然也可以不用他默认的
看一下配置描述
https://pitaya.readthedocs.io/en/latest/configuration.html
pitaya.buffer.handler.localprocess | 20 | int | 本地消息处理器缓冲区的大小 |
---|
pitaya.heartbeat.interval | 30s | time.Time | 心跳间隔 |
---|
pitaya.buffer.agent.messages | 100 | int | 每个代理缓冲区的大小 |
---|
pitaya.handler.messages.compression | true | bool | 是否压缩消息 |
---|
服务生成器
demo创建了一个默认的服务生成器
builder := pitaya.NewDefaultBuilder(true, "chat", pitaya.Cluster, map[string]string{}, *conf)
当然也有不是默认的
看一下默认服务生成器的参数
true 表示是面向客户端的前端服务器
在集群模式下,服务器既可以是前端服务器,也可以是后端服务器。
前端服务器必须指定用于接收传入客户端连接的侦听器。它们能够根据路由逻辑将接收到的消息转发到适当的服务器。
后端服务器不侦听连接,它们只接收 RPC,要么是转发的客户端消息(sys rpc),要么是来自其他服务器(用户 rpc)的 RPC。
官方解释:Features — Pitaya documentation
“chat” 服务器类型
pitaya.Cluster 集群模式,也有单机模式
map[string]string{} 服务器元数据,不清楚什么意思。可能是服务器运行中存在的数据?
*conf 配置生成器的指针
服务接受
builder.AddAcceptor(acceptor.NewWSAcceptor(":3250"))
添加一个接收器,这里要求服务必须是前端服务
(builder时第一个参数是true)
这里的ac参数是接收器实例,实现了Acceptor接口要求的方法,demo里面是 new一个websocket的接受
源码里面有tcp和ws
tcp例
组管理驱动
这里初始化一个内存组驱动
builder.Groups = groups.NewMemoryGroupService(*config.NewDefaultMemoryGroupConfig())
参数是一个内存组的配置
demo用的依旧是默认的配置
pitaya.groups.memory.tickduration | 30s | time.Duration | 自动检查是否应删除组 |
---|
这里Groups实际上是需要一个接口
可以看到,内部实现了etcd和memory
构建
作者感觉demo配置差不多了
// 构建火龙果app = builder.Build()// 延迟关闭defer app.Shutdown()
他开始构建了,获得一个火龙果的句柄
这个方法还是挺多的,推荐大家去看看,有点简单的英语基础应该就能看懂50%
创建组
然后他这边创建了一个组
err := app.GroupCreate(context.Background(), "room")if err != nil {panic(err)}
组名就是room
源码里我们能看到他组里面到底是什么鬼,打开内存组驱动的源码
实际上就是
内存组管理器->管理一堆组->一堆组管理一堆uid
组件
然后紧接着创建一个room组件,这个组件就是聊天室逻辑啦
room := NewRoom(app)Room struct {component.Basetimer *timer.Timerapp pitaya.Pitaya}// NewRoom returns a Handler Base implementation
func NewRoom(app pitaya.Pitaya) *Room {return &Room{app: app,}
}// AfterInit component lifetime callback
func (r *Room) AfterInit() {r.timer = pitaya.NewTimer(time.Minute, func() {count, err := r.app.GroupCountMembers(context.Background(), "room")logger.Log.Debugf("UserCount: Time=> %s, Count=> %d, Error=> %q", time.Now().String(), count, err)})
}
room 继承了 component.Base ,base默认实现了component的接口,当然可以手写一个覆盖他
这里包含一个组件生命周期调用过程
官方介绍:
可以选择实现以下生命周期方法:
Init()
- 在初始化应用程序时由 Pitaya 调用AfterInit()
- 初始化应用程序后由 Pitaya 调用BeforeShutdown()
- 在关闭组件时由 Pitaya 调用,但在调用 shutdown 之前Shutdown()
- 关闭开始后由 Pitaya 调用
======
NewRoom 就是单纯的返还一个room组件的实例
但是需要把火龙果的实例保存起来给room组件后续使用
在初始化之后,他创建一个定时器,每分钟打印room组里面有多少人
第一个参数,时间间隔
第二个参数,时间到了的回调
time.Duration必须>0否则会panic
字面意思,就是看看组里多少人。。 GroupCountMembers
绑定组件
绑定组件给火龙果
room 组件实例
component.WithName("room") 组件名称
component.WithNameFunc(strings.ToLower) 组件名称方法
名称方法是操作名字的,参数是string,返还也是string
组件消息处理
功能逻辑代码,其实都差不多,主要了解一下内部方法的调用
首先看一下功能 ,三个
onMembers 房间内的人 s->c 1
onNewUser 新用户 s->c 2
onMessage 有人说话了 s ->c 3
room.join 我进到房间了 c -> s
客户端打开网页以后,调用了room.join.然后传过来一个空的msg[]byte,返还一个joinresponse指针和error
其实这是组件约束的写法
参考Pitaya API — Pitaya documentation
参数
context.Context
:请求的上下文,其中包含客户端的会话。pointer or []byte
:请求。
通知处理程序不返回任何内容,而请求处理程序必须返回:
pointer or []byte
: 响应error
: 一个错误变量
获得session信息(链接信息)根据上下文
s := r.app.GetSessionFromCtx(ctx)
s.id()获得sessionID(链接id)
然后他这边用链接id(sid)绑定了上下文
往当前的链接里面推送room组里面的用户sid
当前玩家刚进来时候能看到全部玩家的id , 不含自己
推送给当前组,有新人加入
ctx 上下文
"chat" 服务器类型
"room" 组名
"onNewUser" 路由名
内容
加入链接至组
当链接关闭时从组内移除
message方法就大同小异了。。。
分析的差不多,感觉可以模仿的写了
学习笔记3
go-pitaya学习笔记(3)-小小的测试_冰纳-CSDN博客
go-pitaya学习笔记(2)-chatDemo分析相关推荐
- Qt学习笔记,再次分析EVA源码之后得出的结论-QListView,QListViewItem(Qt3);Q3ListView,Q3ListViewItem(Qt4)...
Qt学习笔记,再次分析EVA源码之后得出的结论-QListView,QListViewItem(Qt3);Q3ListView,Q3ListViewItem(Qt4) 今天再次分析了Eva的源码,也看 ...
- oracle in查询 一直等待,学习笔记:Oracle awr 分析解决inactive transaction branch等待事件...
天萃荷净 通过Oracle AWR报告分析inactive transaction branch等待事件的原因 分析一份awr,发现不太熟悉的等待事件"inactive transactio ...
- RT-1052学习笔记 - GPIO架构分析
RT-1052学习笔记 - GPIO架构分析 一.RT1052之GPIO与IOMUX 二.GPIO架构分析 分析GPIO的外设框架 库函数操作 1.初始化MUX 2.初始化PAD 3.初始化GPIO外 ...
- ARM学习笔记--LPC1788引脚分析
http://zgmgypb.blog.163.com/blog/static/962028192012730104640980/ RM学习笔记--LPC1788引脚分析 一.电源分析 要弄清楚单片机 ...
- HFSS学习笔记 21 扫频分析
HFSS学习笔记之扫频分析-----------锋锋的快乐小窝 通过求解设置,可以对模型结构进行自适应网格剖分,并计算指定的网络剖分频率点处的 S S S参数和场解 b如果需要分析或计算某个频段范围内 ...
- Replica Island 学习笔记 03 - Activity分析
MainMenuActivity Activity界面 MainMenuActivity启动的时候,会用fade in动画逐个显示菜单按钮,并在屏幕最下方显示一个Ticker: 点击任一菜单按 ...
- 学习笔记 | 独立成分分析(ICA, FastICA)及应用
学习笔记 | 独立成分分析[ICA, FastICA]及应用 1 背景说明 2 算法原理 2.1 ICA简介 2.2 形式化表达 3 算法步骤与代码 4 算法改进:FastICA 5 ICA实例与应用 ...
- go-pitaya学习笔记(4)-clusterdemo分析
学习笔记: 我家别墅靠大海/pitaya-learn 尝试集成功能:我家别墅靠大海/pitaya-game 如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!! 我是按代码的顺序记的笔 ...
- go-pitaya学习笔记(5)-clusterdemo分析2
学习笔记: 我家别墅靠大海/pitaya-learn 尝试集成功能:我家别墅靠大海/pitaya-game 如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!! 我是按代码的顺序记的笔 ...
最新文章
- 【Live555】live555源码详解系列笔记
- 关于对cross-browser支持的一些看法
- Activiti部署报错
- Zookeeper命令行操作(常用命令;客户端连接;查看znode路径;创建节点;获取znode数据,查看节点内容,设置节点内容,删除节点;监听znode事件;telnet连接zookeeper)
- html文字添加波浪线,利用css渐变给文字下方加波浪线
- angular8多选框实现点击整行任意位置<tr>就可以选中多选框
- html实体转换成xa0,关于javascript:反应道具:在JSX动态内容中使用HTML实体?
- x64下进程保护HOOK
- 数据库介绍(MySQL安装 体系结构、基本管理)
- vue下载本地静态文件
- sqlserver格式化-年月日
- 【小技巧】如何将PPT的图保持高分辨率导入到Word中
- 程序员也要学英语——限定词、形容词和副词
- Vue + element + Springboot 通过邮箱找回密码
- 更好用计算机怎么打,电脑输入法哪个好用(最受欢迎的7大输入法对比详情)...
- 集团税务共享化、数字化系统如何选型(一)
- ocr文字识别软件:Readiris Corporate 17 Mac中文版
- 坚果X3怎么样好不好值得买吗,和当贝X3哪款好这篇告诉你
- Markdown KaTex 积分符号
- 用bridge创建虚拟网桥
热门文章
- Android下屏幕锁屏弹窗的正确姿势
- 2023年武汉理工大学土木工程建造与管理考研上岸前辈备考经验
- 在脑袋一侧上猛敲一下
- 一文搞懂lookup、vlookup、hlookup函数与index、match函数的使用
- 业界第一 | 华为云视频服务稳居编解码技术领军地位
- 工程伦理(李正风)课后习题答案(1-5章、10章)
- 高通 android 传感器支持,高通:Android手机用户明年将用上刷脸功能
- java显示一张图片不显示_微信图片不可显示java解决方法
- python识别花草_Python识别验证码的另一种花样玩法
- I2C驱动框架分析(3):DW_I2C驱动分析