学习笔记: 我家别墅靠大海/pitaya-learn

尝试集成功能:我家别墅靠大海/pitaya-game

如果你正在看此笔记,请你左边放笔记,右边放chatdemo的代码!!

我是按代码的顺序记的笔记

我们自己写一个聊天室,测试一下集群tcp登录和聊天。

第四个demo了

这次我们只有3个服务器

game 登录与聊天室逻辑(前端服务器)

log 日志(后端服务器)

worker

目录结构如下,代码在gitee中

account.go ,处理用户登录

package servicesimport ("context""github.com/topfreegames/pitaya/v2""github.com/topfreegames/pitaya/v2/component"pb "github.com/topfreegames/pitaya/v2/examples/demo/cluster_protobuf/protos"
)type Account struct {component.Baseapp pitaya.Pitaya
}// 暂时用这个存贮账号密码
var AccountMap map[string]string = map[string]string{"123123": "123123","abc":    "abc",
}// 实例化一个句柄
func NewAccount(app pitaya.Pitaya) *Account {return &Account{app: app}
}// 登录参数
type ReqLogin struct {UserName string `json:"username"`Password string `json:"password"`
}// req就用json了(用proto的话,client不知道咋写啊。。。)
// proto返还就用demo里面的了
func (a *Account) Login(ctx context.Context, req *ReqLogin) (*pb.Response, error) {// 没找到用户password, ok := AccountMap[req.UserName]if !ok {return ReplayError("account not found")}// 密码错误if password != req.Password {return ReplayError("password error")}// 登录成功了的话,绑定一下我的uidsession_ := a.app.GetSessionFromCtx(ctx)err := session_.Bind(ctx, req.UserName)if err != nil {return ReplayError("bind session error")}return &pb.Response{Code: 0,Msg:  "success",}, nil
}

common.go

package servicesimport ("errors""github.com/topfreegames/pitaya/v2"pb "github.com/topfreegames/pitaya/v2/examples/demo/cluster_protobuf/protos"
)func ReplayError(msg string) (*pb.Response, error) {return &pb.Response{Code: 1,Msg:  msg,}, pitaya.Error(errors.New(msg), "1")
}

log.go

package servicesimport ("context""fmt""github.com/topfreegames/pitaya/v2/component"pb "github.com/topfreegames/pitaya/v2/examples/demo/cluster_protobuf/protos"
)type Log struct {component.Base
}func (log *Log) RecordLog(ctx context.Context, req *pb.Response) (*pb.Response, error) {fmt.Println("record log:", req)return &pb.Response{Code: 0,Msg:  "Success",}, nil
}

room.go

package servicesimport ("context""fmt""github.com/topfreegames/pitaya/v2""github.com/topfreegames/pitaya/v2/component"pb "github.com/topfreegames/pitaya/v2/examples/demo/cluster_protobuf/protos"
)type Room struct {component.Baseapp pitaya.Pitaya
}var RoomGroupName string = "RoomGroupName"// 句柄
func NewRoom(app pitaya.Pitaya) *Room {app.GroupCreate(context.Background(), RoomGroupName)return &Room{app: app,}
}// 加入房间
func (room *Room) Join(ctx context.Context, req []byte) (*pb.Response, error) {session_ := room.app.GetSessionFromCtx(ctx)uid := session_.UID()if uid == "" {return ReplayError("not login")}if have, _ := room.app.GroupContainsMember(ctx, RoomGroupName, uid); have {return ReplayError("i in room , uid:" + uid)}room.app.GroupAddMember(ctx, RoomGroupName, uid)room.app.GroupBroadcast(ctx, "game", RoomGroupName, "joinPush", pb.Response{Msg: fmt.Sprintf("------------------\n--user: %sjoin\n------------------\n", uid),})// 为了方便,请求和返还,都用response...replay := pb.Response{}room.app.ReliableRPC("log.log.recordlog", nil, &replay, &pb.Response{Msg: "uid:" + uid + ",join room"})return &pb.Response{Code: 0,Msg:  "Join Success",}, nil
}// 聊天参数
type ReqMessage struct {Msg string `json:"msg"`
}// 发送消息
func (room *Room) Message(ctx context.Context, req *ReqMessage) (*pb.Response, error) {session_ := room.app.GetSessionFromCtx(ctx)uid := session_.UID()if uid == "" {return ReplayError("not login")}if have, _ := room.app.GroupContainsMember(ctx, RoomGroupName, uid); !have {return ReplayError("i not in room")}room.app.GroupBroadcast(ctx, "game", RoomGroupName, "messagePush", pb.Response{Msg: fmt.Sprintf("%s say: %s\n", uid, req.Msg),})// 为了方便,请求和返还,都用response...replay := pb.Response{}room.app.ReliableRPC("log.log.recordlog", nil, &replay, &pb.Response{Msg: "uid:" + uid + ", send message :" + req.Msg})return &pb.Response{Code: 0,Msg:  "Send Message Success",}, nil
}

worker.go

package servicesimport ("context""github.com/golang/protobuf/proto""github.com/topfreegames/pitaya/v2""github.com/topfreegames/pitaya/v2/component""github.com/topfreegames/pitaya/v2/examples/demo/worker/protos"
)// Worker server
type Worker struct {component.Base
}// Configure starts workers and register rpc job
func (w *Worker) Configure(app pitaya.Pitaya) {app.StartWorker()app.RegisterRPCJob(&RPCJob{app: app})
}// RPCJob implements worker.RPCJob
type RPCJob struct {app pitaya.Pitaya
}// ServerDiscovery returns a serverID="", meaning any server
// is ok
func (r *RPCJob) ServerDiscovery(route string,rpcMetadata map[string]interface{},
) (serverID string, err error) {return "", nil
}// RPC calls pitaya's rpc
func (r *RPCJob) RPC(ctx context.Context,serverID, routeStr string,reply, arg proto.Message,
) error {return r.app.RPCTo(ctx, serverID, routeStr, reply, arg)
}// GetArgReply returns reply and arg of LogRemote,
// since we have no other methods in this example
func (r *RPCJob) GetArgReply(route string,
) (arg, reply proto.Message, err error) {return &protos.Arg{}, &protos.Response{}, nil
}

main.go

package mainimport ("flag""fmt""game/mydemo/demo4/services""strings""github.com/spf13/viper""github.com/topfreegames/pitaya/v2""github.com/topfreegames/pitaya/v2/acceptor""github.com/topfreegames/pitaya/v2/component""github.com/topfreegames/pitaya/v2/config"
)type srvConfig struct {port     intfrontend bool
}var scs map[string]srvConfig = map[string]srvConfig{"game": {port:     3250,frontend: true,},"worker": {port:     3251,frontend: false,},"log": {port:     3252,frontend: false,},
}var app pitaya.Pitayafunc main() {srvType := flag.String("type", "game", "server type")flag.Parse()srvConfig, ok := scs[*srvType]if !ok {fmt.Println("not found type:", *srvType)return}// 启动workerconf := viper.New()conf.SetDefault("pitaya.worker.redis.url", "localhost:6379")conf.SetDefault("pitaya.worker.redis.pool", "3")config := config.NewConfig(conf)// 构造器builder := pitaya.NewBuilderWithConfigs(srvConfig.frontend, *srvType, pitaya.Cluster, map[string]string{}, config)// 如果是前端服务器的话if srvConfig.frontend {builder.AddAcceptor(acceptor.NewTCPAcceptor(fmt.Sprintf(":%d", srvConfig.port)))}// 构建火龙果app = builder.Build()switch *srvType {case "game":app.Register(services.NewRoom(app), component.WithName("room"), component.WithNameFunc(strings.ToLower))app.Register(services.NewAccount(app), component.WithName("account"), component.WithNameFunc(strings.ToLower))case "log":app.RegisterRemote(&services.Log{}, component.WithName("log"), component.WithNameFunc(strings.ToLower))case "worker":worker := services.Worker{}worker.Configure(app)}// 延迟关闭defer app.Shutdown()// 启动app.Start()}

启动

game PS D:\Work\pitaya-test-game\mydemo\demo4> go run .\main.go

worker PS D:\Work\pitaya-test-game\mydemo\demo4> go run .\main.go -type worker

log PS D:\Work\pitaya-test-game\mydemo\demo4> go run .\main.go -type log

测试

笔记:

go-pitaya学习笔记(12) - 看一看火龙果内置模块_冰纳-CSDN博客

go-pitaya学习笔记(11) - 测试集群rpc相关推荐

  1. Redis 学习笔记八:集群模式

    Redis 学习笔记八:集群模式 作者:Grey 原文地址: 博客园:Redis 学习笔记八:集群模式 CSDN:Redis 学习笔记八:集群模式 前面提到的Redis 学习笔记七:主从复制和哨兵只能 ...

  2. Hadoop学习笔记—13.分布式集群中节点的动态添加与下架

    Hadoop学习笔记-13.分布式集群中节点的动态添加与下架 开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如 ...

  3. ZooKeeper学习笔记(八):ZooKeeper集群写数据原理

    写数据原理 写流程直接请求发送给Leader节点 这里假设集群中有三个zookeeper服务端 ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种 ...

  4. ES学习笔记(二):集群配置与启动 --mac环境

    1 环境准备: 复制原有es文件,分别为三个文件夹:Node-8001,Node-8002,Node-8003 删除三个文件夹中的data文件,清除log文件 修改配置文件 1.1修改配置文件 配置文 ...

  5. 【删】【Kubernetes视频学习笔记】Kubernetes集群YAML文件详解

    文章目录 概述 YAML文件介绍 YAML概述 YAML 基本语法 YAML 支持的数据结构 对象 数组 YAML文件组成部分 控制器的定义 被控制的对象 属性说明 如何快速编写YAML文件 使用ku ...

  6. 如何使用Kubernetes官网的免费测试集群学习Kubernetes操作

    Kubernetes官网提供了业界良心的测试集群供我们练习. 链接: https://kubernetes.io/docs/tutorials/kubernetes-basics/create-clu ...

  7. 尚硅谷云原生学习笔记(1-75集)

    笔记列表: 尚硅谷云原生学习笔记(1-75集) 尚硅谷云原生学习笔记(76~143集) 尚硅谷云原生学习笔记(144~172集) 尚硅谷云原生学习笔记(173~XXX集) 目录 1.什么是云计算 1. ...

  8. 【阿里云EMR实战篇】以EMR测试集群版本为例,详解 Flink SQL Client 集成 Hive 使用步骤

    简介: 以测试集群版本为例(EMR-4.4.1)-- Flink SQL Client 集成 Hive 使用文档 作者:林志成,阿里云EMR产品团队技术支持,拥有多年开源大数据经验 1.以测试集群版本 ...

  9. HALCON 20.11:深度学习笔记(11)---目标检测

    HALCON 20.11:深度学习笔记(11)---目标检测 HALCON 20.11.0.0中,实现了深度学习方法. 本章讲解了如何使用基于深度学习的对象检测. 通过对象检测,我们希望在图像中找到不 ...

最新文章

  1. 6 个理由,让我不顾一切撑腰 Python!
  2. java redis 生成唯一id_Redis在集群环境中生成唯一ID
  3. 比较标签 php,比较标签 · ThinkPHP5.0完全开发手册 · 看云
  4. python3.8使用pyttsx3报错_使用pyttsx3实现python语音播报
  5. zebradesginer zpl代码_斑马打印机连三菱PLC与VB.NET
  6. 腾讯云OSS使用指南
  7. 怎么查看电脑系统的初始安装日期
  8. PTA-数据库作业题(二)
  9. Istio中的流量管理
  10. Linux如何永久以命令行界面形式登录
  11. Quartz——简介和使用
  12. Ubuntu20.04安装英伟达驱动
  13. Linux 笔记本电脑选购指南
  14. c# ffmpeg视频转换
  15. 【商品架构day5】淘宝:TOP1的商品系统长什么样子
  16. idea使用大全 idea快捷键大全
  17. 什么是CHINANET
  18. 016-OpenCV 图像对比度亮度调整
  19. Happy Time~~
  20. 10.17-10.21周总结

热门文章

  1. RV1126----新增sensor--imx214
  2. 网上搜索技巧集(1)(转)
  3. 手机端python ide_python ide
  4. Android 12.0 系统Settings去掉开发者模式功能
  5. Vue——Mall项目初始化及登录模块(九)
  6. android 类似QQ 换皮肤 实现思路 apk资源共享
  7. dwr3实现消息精准推送详细步骤
  8. 推荐几个好用的网站导航
  9. 昨天晚上4点用手机遥控电脑关机
  10. 阿里双十一大屏六年路