golang轻量级高性能游戏服务器框架插件nano的使用

Golang轻量级高性能游戏服务器框架插件nano的使用

Nano是一个易于使用、快速、轻量级的Go语言游戏服务器网络库。它提供了核心网络架构和一系列工具库,可以帮助开发者消除常见底层逻辑的重复工作。

基本概念

Nano应用实际上是一组组件的集合,而组件是一系列处理程序(Handler)的集合。当你将一个组件注册到nano时,nano会将所有可以转换为Handler的方法注册到服务容器中。

Nano应用结构

快速开始

下面是一个简单的Nano服务器示例:

package main

import (
	"github.com/lonng/nano"
	"github.com/lonng/nano/component"
	"github.com/lonng/nano/session"
)

// 定义一个组件
type Room struct {
	component.Base
}

// 组件中的方法会自动注册为Handler
func (r *Room) Join(s *session.Session, msg []byte) error {
	// 新用户加入房间
	return s.Response("欢迎加入房间!")
}

func main() {
	// 创建nano实例
	n := nano.New(
		nano.WithIsWebsocket(true), // 启用WebSocket支持
		nano.WithCheckOrigin(func(_ *http.Request) bool { return true }),
	)
	
	// 注册组件
	n.Register(&Room{})
	
	// 启动服务
	n.Run(":3250")
}

异步任务处理

Nano支持异步任务处理,下面是一个示例:

func (manager *PlayerManager) Login(s *session.Session, msg *ReqPlayerLogin) error {
    var onDBResult = func(player *Player) {
        manager.players = append(manager.players, player)
        s.Push("PlayerSystem.LoginSuccess", &ResPlayerLogin)
    }
    
    // 在新的goroutine中执行慢任务
    go func() {
        player, err := db.QueryPlayer(msg.PlayerId) // 忽略错误处理
        // 在主逻辑goroutine中处理结果
        nano.Invoke(func(){ onDBResult(player) })
    }
    return nil
}

分布式系统

Nano内置了分布式系统解决方案,可以轻松创建分布式游戏服务器。可以参考分布式聊天室示例。

安装

go get github.com/lonng/nano

# 依赖
go get -u github.com/pingcap/check
go get -u github.com/pingcap/errors
go get -u github.com/urfave/cli

go get -u google.golang.org/protobuf/proto
go get -u github.com/gorilla/websocket
go get -u google.golang.org/grpc

协议缓冲区支持

# protoc
# 从 https://github.com/protocolbuffers/protobuf/releases 下载
# protoc-gen-go
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
# delve
go install github.com/go-delve/delve/cmd/dlv@latest

测试

go test -v ./...

性能基准

cd ./benchmark/io
go test -v -tags "benchmark"

Nano是一个功能强大但保持简单的框架,适合各种规模的实时游戏、社交游戏和手机游戏等服务器端应用。


更多关于golang轻量级高性能游戏服务器框架插件nano的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

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


Nano - Golang轻量级高性能游戏服务器框架

Nano是一个用Go语言编写的轻量级、高性能游戏服务器框架,特别适合开发实时多人游戏。下面我将详细介绍Nano的使用方法。

1. Nano的特点

  • 轻量级:核心代码精简,易于理解和扩展
  • 高性能:基于Go语言的goroutine和channel实现高并发
  • 分布式支持:内置集群支持,可轻松扩展
  • 模块化设计:组件可插拔,灵活性强
  • 易用API:提供简洁的API接口

2. 安装Nano

go get github.com/lonng/nano

3. 基本使用示例

3.1 创建简单服务器

package main

import (
	"log"

	"github.com/lonng/nano"
	"github.com/lonng/nano/component"
	"github.com/lonng/nano/serialize/json"
)

// 定义一个组件
type Room struct {
	component.Base
}

// 启动服务器
func main() {
	// 创建nano实例
	n := nano.New(
		nano.WithSerializer(json.NewSerializer()), // 使用JSON序列化
		nano.WithLogger(log.Default()),            // 使用标准日志
		nano.WithDebugMode(),                      // 调试模式
	)

	// 注册组件
	room := &Room{}
	n.Register(room,
		component.WithName("room"),    // 组件名称
		component.WithNameFunc(strings.ToLower), // 名称转换函数
	)

	// 启动服务器
	if err := n.Listen(":3250"); err != nil {
		log.Fatal(err)
	}
}

3.2 处理客户端请求

// 在Room组件中添加处理方法
func (r *Room) Join(s *session.Session, msg *JoinRequest) error {
	log.Printf("New user joined: %v", msg.UserID)
	
	// 向客户端发送欢迎消息
	return s.Push("onWelcome", &WelcomeMessage{
		Text: fmt.Sprintf("Welcome %s to the room!", msg.UserName),
	})
}

// 定义消息结构
type JoinRequest struct {
	UserID   int64  `json:"userId"`
	UserName string `json:"userName"`
}

type WelcomeMessage struct {
	Text string `json:"text"`
}

3.3 客户端连接示例

package main

import (
	"log"
	"time"

	"github.com/lonng/nano/client"
	"github.com/lonng/nano/serialize/json"
)

func main() {
	// 创建客户端
	c := client.New(
		client.WithSerializer(json.NewSerializer()),
		client.WithReconnectInterval(5*time.Second),
	)
	
	// 连接服务器
	if err := c.Connect("127.0.0.1:3250"); err != nil {
		log.Fatal(err)
	}
	
	// 发送加入请求
	req := &JoinRequest{
		UserID:   1001,
		UserName: "Player1",
	}
	
	// 处理服务器推送
	c.On("onWelcome", func(data interface{}) {
		log.Printf("Received welcome: %v", data)
	})
	
	// 发送请求
	if err := c.Notify("room.join", req); err != nil {
		log.Fatal(err)
	}
	
	// 保持连接
	select {}
}

4. 高级功能

4.1 集群支持

// 在服务器启动前配置集群
n := nano.New(
	nano.WithIsWebsocket(true),
	nano.WithComponents(components),
	nano.WithSerializer(json.NewSerializer()),
	nano.WithDebugMode(),
	nano.WithLabel("game-server-1"),
	nano.WithAdvertiseAddr("192.168.1.100:3250"),
)

// 添加集群节点
n.AddNode("gate-server-1", "192.168.1.101:3251")

4.2 定时任务

func (r *Room) AfterInit() {
	// 组件初始化后执行
	r.Group.AddTimer(time.Minute, func() {
		log.Println("This is a periodic task")
	})
}

4.3 广播消息

func (r *Room) Broadcast() {
	r.Broadcast("onBroadcast", &BroadcastMessage{
		Content: "Hello all players!",
	})
}

type BroadcastMessage struct {
	Content string `json:"content"`
}

5. 性能优化建议

  1. 连接池管理:合理设置连接池大小
  2. 消息压缩:对于大量数据传输启用压缩
  3. 批处理:合并小消息为批量消息
  4. 协议优化:使用更高效的协议如protobuf

6. 实际应用场景

  • 实时对战游戏
  • 棋牌类游戏
  • 聊天室应用
  • 物联网实时数据监控

Nano框架通过其简洁的设计和高效的性能,为开发者提供了快速构建游戏服务器的能力。它的轻量级特性使得学习和使用成本较低,同时又不失扩展性和灵活性。

回到顶部