golang可扩展游戏服务器框架插件Pitaya的使用

Golang可扩展游戏服务器框架插件Pitaya的使用

Pitaya是一个简单、快速且轻量级的游戏服务器框架,支持集群功能,并为iOS、Android、Unity等平台提供客户端库。它为分布式多人游戏和服务器端应用程序提供了基本的开发框架。

准备工作

先决条件

  • Go >= 1.16
  • etcd (可选,用于服务发现)
  • nats (可选,用于发送和接收RPC)
  • docker (可选,用于在容器中运行etcd和nats依赖项)

安装

克隆仓库:

git clone https://github.com/topfreegames/pitaya.git

设置Pitaya依赖:

make setup

示例Demo

运行Pitaya示例

  1. 启动etcd(需要docker-compose,将在本地运行一个etcd容器):
cd ./examples/testing && docker compose up -d etcd
  1. 运行集群gRPC示例的连接器前端服务器:
make run-cluster-grpc-example-connector
  1. 运行集群gRPC示例的房间后端服务器:
make run-cluster-grpc-example-room

现在应该有两个Pitaya服务器在运行:一个前端连接器和一个后端房间服务器。要发送请求,可以使用Pitaya的REPL客户端pitaya-cli:

$ pitaya-cli
Pitaya REPL Client
>>> connect localhost:3250
connected!
>>> request room.room.entry
>>> sv-> {"code":0,"result":"ok"}

完整示例代码

以下是一个简单的Pitaya服务器示例:

package main

import (
	"context"
	"log"

	"github.com/topfreegames/pitaya/v2"
	"github.com/topfreegames/pitaya/v2/component"
)

// Room 是一个房间组件
type Room struct {
	component.Base
}

// Entry 是房间的入口处理程序
func (r *Room) Entry(ctx context.Context, msg []byte) ([]byte, error) {
	log.Println("Received message:", string(msg))
	return []byte("ok"), nil
}

func main() {
	// 创建Pitaya应用
	builder := pitaya.NewDefaultBuilder(true, "room", pitaya.Cluster, map[string]string{})
	
	// 注册房间组件
	builder.AddComponent(&Room{})
	
	// 构建应用
	app := builder.Build()
	
	// 启动服务器
	if err := app.Start(); err != nil {
		log.Fatal("Failed to start app:", err)
	}
	
	// 等待服务器关闭
	<-app.Die()
}

运行测试

运行单元测试和端到端测试:

make test

许可证

MIT许可证

安全

如果您发现安全漏洞,请发送电子邮件至security@tfgco.com

资源

  • 其他Pitaya相关项目:

    • libpitaya-cluster
    • libpitaya
    • pitaya-admin
    • pitaya-bot
    • pitaya-cli
    • pitaya-protos
  • 文档:

    • API参考
    • 深入文档
  • 演示:

    • 使用Pitaya和WebSocket在约100行代码中实现聊天室
    • Pitaya集群模式示例
    • 使用protobuf协议的Pitaya集群模式示例

更多关于golang可扩展游戏服务器框架插件Pitaya的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang可扩展游戏服务器框架插件Pitaya的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Pitaya - Golang可扩展游戏服务器框架插件

Pitaya是一个用Go语言编写的分布式游戏服务器框架,专为构建高性能、可扩展的游戏后端服务而设计。它提供了微服务架构、RPC通信、集群管理等功能,非常适合开发MMO、实时对战等类型的游戏服务器。

主要特性

  1. 模块化设计:通过插件系统可轻松扩展功能
  2. 分布式架构:支持水平扩展和负载均衡
  3. 高性能RPC:基于gRPC和NATS实现高效通信
  4. 多种协议支持:WebSocket、TCP等
  5. 内置集群管理:服务发现和自动容错

基本使用示例

安装Pitaya

go get github.com/topfreegames/pitaya/v2

简单服务器示例

package main

import (
	"context"
	"log"

	"github.com/topfreegames/pitaya/v2"
	"github.com/topfreegames/pitaya/v2/component"
	"github.com/topfreegames/pitaya/v2/config"
)

// Room 组件
type Room struct {
	component.Base
}

// Join 处理玩家加入房间
func (r *Room) Join(ctx context.Context, msg []byte) ([]byte, error) {
	s := pitaya.GetApplication()
	session := pitaya.GetSessionFromCtx(ctx)
	
	log.Printf("New player joined: %s", session.UID())
	return []byte("welcome to the room!"), nil
}

func main() {
	// 创建配置
	conf := config.NewDefaultBuilderConfig()
	
	// 创建Pitaya应用
	builder := pitaya.NewDefaultBuilder(false, "game-server", pitaya.Cluster, conf)
	
	// 注册组件
	builder.AddComponent(&Room{})
	
	// 构建应用
	app := builder.Build()
	defer app.Shutdown()
	
	// 注册RPC处理函数
	err := app.Register(&Room{},
		component.WithName("room"),
		component.WithNameFunc(strings.ToLower),
	)
	if err != nil {
		log.Fatal(err)
	}
	
	// 启动服务器
	err = app.Start()
	if err != nil {
		log.Fatal(err)
	}
}

插件系统使用

Pitaya的强大之处在于其插件系统,可以轻松扩展功能:

自定义插件示例

package main

import (
	"context"
	"log"

	"github.com/topfreegames/pitaya/v2"
	"github.com/topfreegames/pitaya/v2/component"
	"github.com/topfreegames/pitaya/v2/plugin"
)

// MetricsPlugin 自定义指标插件
type MetricsPlugin struct {
	plugin.Base
	app pitaya.Pitaya
}

// NewMetricsPlugin 创建新插件
func NewMetricsPlugin(app pitaya.Pitaya) *MetricsPlugin {
	return &MetricsPlugin{app: app}
}

// Start 插件启动
func (m *MetricsPlugin) Start() error {
	log.Println("Metrics plugin started")
	return nil
}

// AfterHandler 在每个handler执行后记录指标
func (m *MetricsPlugin) AfterHandler(ctx context.Context, in interface{}, out interface{}, err error) error {
	log.Printf("Handler executed, recording metrics...")
	return nil
}

func main() {
	// 创建应用
	builder := pitaya.NewDefaultBuilder(false, "game-server", pitaya.Standalone, nil)
	
	// 构建应用
	app := builder.Build()
	defer app.Shutdown()
	
	// 注册插件
	metricsPlugin := NewMetricsPlugin(app)
	app.RegisterPlugin(metricsPlugin)
	
	// 启动服务器
	if err := app.Start(); err != nil {
		log.Fatal(err)
	}
}

内置插件使用

Pitaya提供了一些内置插件,可以直接使用:

使用ETCD服务发现

func main() {
	conf := config.NewDefaultBuilderConfig()
	conf.Groups.EtcdSD = config.EtcdServiceDiscoveryConfig{
		Endpoints:   []string{"localhost:2379"},
		DialTimeout: 3 * time.Second,
		Prefix:      "pitaya/",
		HeartbeatTTL: 60 * time.Second,
	}
	
	builder := pitaya.NewDefaultBuilder(true, "game-server", pitaya.Cluster, conf)
	app := builder.Build()
	defer app.Shutdown()
	
	if err := app.Start(); err != nil {
		log.Fatal(err)
	}
}

使用NATS消息总线

func main() {
	conf := config.NewDefaultBuilderConfig()
	conf.Groups.NatsRPC.Server = "nats://localhost:4222"
	
	builder := pitaya.NewDefaultBuilder(true, "game-server", pitaya.Cluster, conf)
	app := builder.Build()
	defer app.Shutdown()
	
	if err := app.Start(); err != nil {
		log.Fatal(err)
	}
}

最佳实践

  1. 组件拆分:将不同游戏逻辑拆分为独立组件
  2. 合理使用RPC:跨服务通信使用Pitaya的RPC系统
  3. 监控集成:使用插件系统集成Prometheus等监控工具
  4. 分布式追踪:集成Jaeger等分布式追踪系统
  5. 负载测试:使用Locust等工具进行压力测试

Pitaya为游戏服务器开发提供了强大的基础设施,开发者可以专注于游戏逻辑的实现,而不必担心底层通信和分布式系统的复杂性。通过合理使用其插件系统,可以构建出高性能、可扩展的游戏后端服务。

回到顶部