学习笔记: 我家别墅靠大海/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分析相关推荐

  1. go-pitaya学习笔记(5)-clusterdemo分析2

    学习笔记: 我家别墅靠大海/pitaya-learn 尝试集成功能:我家别墅靠大海/pitaya-game 如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!! 我是按代码的顺序记的笔 ...

  2. Qt学习笔记,再次分析EVA源码之后得出的结论-QListView,QListViewItem(Qt3);Q3ListView,Q3ListViewItem(Qt4)...

    Qt学习笔记,再次分析EVA源码之后得出的结论-QListView,QListViewItem(Qt3);Q3ListView,Q3ListViewItem(Qt4) 今天再次分析了Eva的源码,也看 ...

  3. oracle in查询 一直等待,学习笔记:Oracle awr 分析解决inactive transaction branch等待事件...

    天萃荷净 通过Oracle AWR报告分析inactive transaction branch等待事件的原因 分析一份awr,发现不太熟悉的等待事件"inactive transactio ...

  4. RT-1052学习笔记 - GPIO架构分析

    RT-1052学习笔记 - GPIO架构分析 一.RT1052之GPIO与IOMUX 二.GPIO架构分析 分析GPIO的外设框架 库函数操作 1.初始化MUX 2.初始化PAD 3.初始化GPIO外 ...

  5. ARM学习笔记--LPC1788引脚分析

    http://zgmgypb.blog.163.com/blog/static/962028192012730104640980/ RM学习笔记--LPC1788引脚分析 一.电源分析 要弄清楚单片机 ...

  6. HFSS学习笔记 21 扫频分析

    HFSS学习笔记之扫频分析-----------锋锋的快乐小窝 通过求解设置,可以对模型结构进行自适应网格剖分,并计算指定的网络剖分频率点处的 S S S参数和场解 b如果需要分析或计算某个频段范围内 ...

  7. Replica Island 学习笔记 03 - Activity分析

    MainMenuActivity Activity界面 MainMenuActivity启动的时候,会用fade in动画逐个显示菜单按钮,并在屏幕最下方显示一个Ticker:     点击任一菜单按 ...

  8. 学习笔记 | 独立成分分析(ICA, FastICA)及应用

    学习笔记 | 独立成分分析[ICA, FastICA]及应用 1 背景说明 2 算法原理 2.1 ICA简介 2.2 形式化表达 3 算法步骤与代码 4 算法改进:FastICA 5 ICA实例与应用 ...

  9. go-pitaya学习笔记(2)-chatDemo分析

    学习笔记: 我家别墅靠大海/pitaya-learn 尝试集成功能:我家别墅靠大海/pitaya-game 如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!! 我是按代码的顺序记的笔 ...

最新文章

  1. 我国在计算机科学领域故事,我国巨型计算机领域的一代天骄
  2. 初始化全局变量实例说明C语言中初始化和未初始化的全局变量所在不同的段
  3. 预训练模型参数重载必备!
  4. 庆祝开博第一天!呵呵!
  5. Java Integer于Int 进行==双等于的内存比较时的一些问题说明
  6. HDU4135 HDU2841 HDU1695 求[1,m]中与n互素的数的个数
  7. 「LibreOJ Round #11」Misaka Network 与求和(杜教筛 + Min_25)
  8. (43)System Verilog 类中变量随机化
  9. crontab自动执行任务,失败原因记录
  10. 游戏化设计:平台用户激励系统——互联网平台建设...
  11. 不要重启!诺顿居然将系统文件当病毒
  12. qt编写的mask遮罩的半透明涂抹功能
  13. 【计算机体系结构-01】指令集体系结构、微体系结构简介
  14. 第六次作业·团队作业
  15. HDU-4544-湫湫系列故事——消灭兔子--贪心+优先队列
  16. PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
  17. 【每日新闻】国内首个3D缝纫机器人研制成功
  18. Ubuntu软件安装与更改镜像源(超详细)
  19. 【转载】uvm前置 · Vim 从入门到精通
  20. Burpsuite sqlmap插件

热门文章

  1. macbook pro 2015 15.6 inch mid 更换 intel 760p ssd
  2. 嘉立创EDA专业版PCB丝印的快速调整方法
  3. 69-记单词软件及网站开发(一)
  4. 探究ORACLE的SCN机制(3):Begin Backup
  5. BEGIN_MESSAGE_MAP宏
  6. 宝付跨境电商不断创建,呈现支付多元化
  7. JS计算数组(几个数字)中的最大值
  8. 计算机网络中不同层的服务,计算机网络——网络层
  9. Chrome浏览器 charset插件使用
  10. uni开发的电影票返利系统 完美可运营