go-pitaya学习笔记(4)-clusterdemo分析
学习笔记: 我家别墅靠大海/pitaya-learn
尝试集成功能:我家别墅靠大海/pitaya-game
如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!!
我是按代码的顺序记的笔记
和之前一样,把demo拿过来
cluster
看一下main.go
映入眼帘的就是是否是前端服务器。。第二节有记到
那我们猜着运行一个前端服务器和一个后端服务器。
估计默认参数就是前端,改了参数就是后端
前端:
后端:
go run main.go -port=3251 -type=room -frontend=false
启动完成后端以后,前端好像检测到了集群,好像启动成功了
html测试不了了,用官方cli测试一下
安装
go get github.com/topfreegames/pitaya-cli
如果出现了
在mod里面把grpc降到1.26
这个包拉完,命令就可以用了
我们先改一下demo里room.go的源码
他这个有点问题
所有人的uid都是一样的,不太好测试,改成chatdemo一样的。
这个entry类似于打开网页自动分配个uid。
只不过chatdemo集成在join里面了
别忘了你的main.go引入的还是线上的services,需要改成本地的。
重新启动一下全部服务器。
按照火龙果cli的demo链接一下
示例:https://github.com/topfreegames/pitaya-cli
我这边启动了多个cli,
测起来是可以的,好像没啥问题。
message没测试,没找到怎么传proto。反正测不测也无所谓了
可以看到,我们实际链接的服务器是前端服务器
我们跳过前端,连下后端服务器room试试
连不过去,好了,我们分析下源码
源码分析1
源码有点太乱了,我们只保留room基础的源码,后续我们再分析别的。
删除 connector.go
main.go代码如下
package mainimport ("context""flag""fmt""game/demo/cluster/services""strings""github.com/topfreegames/pitaya/v2""github.com/topfreegames/pitaya/v2/acceptor""github.com/topfreegames/pitaya/v2/cluster""github.com/topfreegames/pitaya/v2/component""github.com/topfreegames/pitaya/v2/config"// "github.com/topfreegames/pitaya/v2/examples/demo/cluster/services""github.com/topfreegames/pitaya/v2/groups""github.com/topfreegames/pitaya/v2/route"
)var app pitaya.Pitayafunc configureBackend() {room := services.NewRoom(app)app.Register(room,component.WithName("room"),component.WithNameFunc(strings.ToLower),)app.RegisterRemote(room,component.WithName("room"),component.WithNameFunc(strings.ToLower),)
}func configureFrontend(port int) {err := app.AddRoute("room", func(ctx context.Context,route *route.Route,payload []byte,servers map[string]*cluster.Server,) (*cluster.Server, error) {// will return the first serverfor k := range servers {return servers[k], nil}return nil, nil})if err != nil {fmt.Printf("error adding route %s\n", err.Error())}
}func main() {port := flag.Int("port", 3250, "the port to listen")svType := flag.String("type", "connector", "the server type")isFrontend := flag.Bool("frontend", true, "if server is frontend")flag.Parse()builder := pitaya.NewDefaultBuilder(*isFrontend, *svType, pitaya.Cluster, map[string]string{}, *config.NewDefaultBuilderConfig())if *isFrontend {tcp := acceptor.NewTCPAcceptor(fmt.Sprintf(":%d", *port))builder.AddAcceptor(tcp)}builder.Groups = groups.NewMemoryGroupService(*config.NewDefaultMemoryGroupConfig())app = builder.Build()//TODO: Oelze pitaya.SetSerializer(protobuf.NewSerializer())defer app.Shutdown()if !*isFrontend {configureBackend()} else {configureFrontend(*port)}app.Start()
}
room.go 如下
package servicesimport ("context""fmt""strconv""time""github.com/topfreegames/pitaya/v2""github.com/topfreegames/pitaya/v2/component""github.com/topfreegames/pitaya/v2/examples/demo/protos""github.com/topfreegames/pitaya/v2/timer"
)type (// Room represents a component that contains a bundle of room related handler// like Join/MessageRoom struct {component.Basetimer *timer.Timerapp pitaya.PitayaStats *protos.Stats}// UserMessage represents a message that user sentUserMessage struct {Name string `json:"name"`Content string `json:"content"`}// Stats exports the room statusStats struct {outboundBytes intinboundBytes int}// NewUser message will be received when new user join roomNewUser struct {Content string `json:"content"`}// AllMembers contains all members uidAllMembers struct {Members []string `json:"members"`}// JoinResponse represents the result of joining roomJoinResponse struct {Code int `json:"code"`Result string `json:"result"`}
)// NewRoom returns a new room
func NewRoom(app pitaya.Pitaya) *Room {return &Room{app: app,Stats: &protos.Stats{},}
}// Init runs on service initialization
func (r *Room) Init() {r.app.GroupCreate(context.Background(), "room")
}// AfterInit component lifetime callback
func (r *Room) AfterInit() {r.timer = pitaya.NewTimer(time.Minute, func() {count, err := r.app.GroupCountMembers(context.Background(), "room")println("UserCount: Time=>", time.Now().String(), "Count=>", count, "Error=>", err)println("OutboundBytes", r.Stats.OutboundBytes)println("InboundBytes", r.Stats.OutboundBytes)})
}// Entry is the entrypoint
func (r *Room) Entry(ctx context.Context, msg []byte) (*protos.JoinResponse, error) {logger := pitaya.GetDefaultLoggerFromCtx(ctx) // The default logger contains a requestId, the route being executed and the sessionIds := r.app.GetSessionFromCtx(ctx)// err := s.Bind(ctx, "banana")fakeUID := s.ID() // just use s.ID as uid !!!err := s.Bind(ctx, strconv.Itoa(int(fakeUID))) // binding session uidif err != nil {logger.Error("Failed to bind session")logger.Error(err)return nil, pitaya.Error(err, "RH-000", map[string]string{"failed": "bind"})}return &protos.JoinResponse{Result: "ok"}, nil
}// Join room
func (r *Room) Join(ctx context.Context) (*protos.JoinResponse, error) {logger := pitaya.GetDefaultLoggerFromCtx(ctx)s := r.app.GetSessionFromCtx(ctx)err := r.app.GroupAddMember(ctx, "room", s.UID())if err != nil {logger.Error("Failed to join room")logger.Error(err)return nil, err}members, err := r.app.GroupMembers(ctx, "room")if err != nil {logger.Error("Failed to get members")logger.Error(err)return nil, err}s.Push("onMembers", &protos.AllMembers{Members: members})// err = r.app.GroupBroadcast(ctx, "connector", "room", "onNewUser", &protos.NewUser{Content: fmt.Sprintf("New user: %d", s.ID())})err = r.app.GroupBroadcast(ctx, "connector", "room", "onNewUser", &protos.NewUser{Content: fmt.Sprintf("New user: %s", s.UID())})if err != nil {logger.Error("Failed to broadcast onNewUser")logger.Error(err)return nil, err}return &protos.JoinResponse{Result: "success"}, nil
}// Message sync last message to all members
func (r *Room) Message(ctx context.Context, msg *protos.UserMessage) {logger := pitaya.GetDefaultLoggerFromCtx(ctx)err := r.app.GroupBroadcast(ctx, "connector", "room", "onMessage", msg)if err != nil {logger.Error("Error broadcasting message")logger.Error(err)}
}
代码干净了,再测一下
其实发现整套代码和之前的地方没什么不同。
先看一下配置后端
是注册模块,不同的是,分布式要注册一个远程模块。
注册方法和之前注册本地模块一样。
他这个demo是通过转发消息实现的。
后面其实是可以通过rpc实现
文档:Pitaya API — Pitaya documentation
再看看注册前端。
app有个addroute方法,添加一个分布式模块路由 ,消息由 pitaya 转发到适当的服务器类型
“room” 服务器类型
"第二个参数是路由方法"
文档:Pitaya API — Pitaya documentation
路由方法
ctx上下文
route 路由实例
payload 不知道啥玩意
cluster.Server 当前服务器的集群map
返还
一个服务器句柄
demo里面是只要在集群中找到了这个类型的服务器,就返回这个服务器
当然可以我们可以实现其他的负载算法
笔记5:
https://blog.csdn.net/qq_37962920/article/details/122350196
go-pitaya学习笔记(4)-clusterdemo分析相关推荐
- go-pitaya学习笔记(5)-clusterdemo分析2
学习笔记: 我家别墅靠大海/pitaya-learn 尝试集成功能:我家别墅靠大海/pitaya-game 如果你正在看此笔记,请你左边放笔记,右边放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学习笔记(2)-chatDemo分析
学习笔记: 我家别墅靠大海/pitaya-learn 尝试集成功能:我家别墅靠大海/pitaya-game 如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!! 我是按代码的顺序记的笔 ...
最新文章
- 我国在计算机科学领域故事,我国巨型计算机领域的一代天骄
- 初始化全局变量实例说明C语言中初始化和未初始化的全局变量所在不同的段
- 预训练模型参数重载必备!
- 庆祝开博第一天!呵呵!
- Java Integer于Int 进行==双等于的内存比较时的一些问题说明
- HDU4135 HDU2841 HDU1695 求[1,m]中与n互素的数的个数
- 「LibreOJ Round #11」Misaka Network 与求和(杜教筛 + Min_25)
- (43)System Verilog 类中变量随机化
- crontab自动执行任务,失败原因记录
- 游戏化设计:平台用户激励系统——互联网平台建设...
- 不要重启!诺顿居然将系统文件当病毒
- qt编写的mask遮罩的半透明涂抹功能
- 【计算机体系结构-01】指令集体系结构、微体系结构简介
- 第六次作业·团队作业
- HDU-4544-湫湫系列故事——消灭兔子--贪心+优先队列
- PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
- 【每日新闻】国内首个3D缝纫机器人研制成功
- Ubuntu软件安装与更改镜像源(超详细)
- 【转载】uvm前置 · Vim 从入门到精通
- Burpsuite sqlmap插件