Go to file
kercylan98 e7692a4aff Merge branch 'develop' 2023-10-08 12:29:20 +08:00
.github docs: README.md 增加配置道具工具相关说明 2023-10-08 12:26:31 +08:00
configuration feat: 重构 config 和 configexport 包 2023-07-17 13:28:17 +08:00
examples/internal docs: 优化文档内容兼容 WithShunt 2023-09-18 16:01:45 +08:00
game style: 常量调整为从 1 开始 2023-09-06 20:09:25 +08:00
notify refactor: room 包移除大量 error 返回,增加易于房间操作 Helper 数据结构,可通过 Manager.GetHelper 和 room.NewHelper 获取 2023-07-28 10:48:45 +08:00
planner docs: README.md 增加配置道具工具相关说明 2023-10-08 12:26:31 +08:00
server docs: 部分注释优化 2023-10-08 10:30:35 +08:00
utils feat: 新增 xlsx 配置导出工具及模板,可手动编译后使用 2023-10-08 12:16:05 +08:00
.gitignore 有限状态机实现 2023-05-26 10:49:16 +08:00
CHANGELOG.md chore(master): release 0.2.3 2023-10-07 10:38:21 +08:00
CODE_OF_CONDUCT.md Create CODE_OF_CONDUCT.md 2023-05-30 14:29:59 +08:00
CONTRIBUTING.md docs: README.md 及 CONTRIBUTING.md 完善 2023-08-02 18:43:12 +08:00
LICENSE LICENSE 2023-05-29 20:35:03 +08:00
README.md docs: README.md 增加配置道具工具相关说明 2023-10-08 12:26:31 +08:00
go.mod feat: 新增 xlsx 配置导出工具及模板,可手动编译后使用 2023-10-08 12:16:05 +08:00
go.sum feat: 新增 xlsx 配置导出工具及模板,可手动编译后使用 2023-10-08 12:16:05 +08:00
local-doc.bat 文档及许可 2023-05-29 20:15:13 +08:00
local-doc.sh 代码扫描问题处理 (#3) (#4) 2023-05-30 14:24:03 +08:00
qodana.yaml build: 更新依赖版本 2023-08-23 19:46:02 +08:00

README.md

Minotaur

Go doc

Minotaur 是一个基于Golang 1.20 编写的服务端开发支持库,其中采用了大量泛型设计,用于游戏服务器开发。

目录结构概况

mindmap
  root((Minotaur))
    /configuration 配置管理功能
    /game 游戏通用功能
      /builtin 游戏通用功能内置实现
    /notify 通知功能接口定义
    /planner 策划相关工具目录
      /pce 配置导表功能实现
    /server 网络服务器支持
      /cross 内置跨服功能实现
      /router 内置路由器功能实现
    /utils 工具结构函数目录
    /examples 示例代码目录

Server 架构预览

server-gdi.jpg

安装

注意:依赖于 Go 1.20 +

运行以下 Go 命令来安装软件包:minotaur

$ go get -u github.com/kercylan98/minotaur

用法

本地文档

可使用 godoc 搭建本地文档服务器

安装 godoc

git clone golang.org/x/tools
cd tools/cmd
go install ...

使用 godoc 启动本地文档服务器

godoc -http=:9998 -play

Windows

.\local-doc.bat

Linux or MacOS

chmod 777 ./local-doc.sh
./local-doc.sh

文档地址

简单回响服务器

创建一个基于Websocket创建的单线程回响服务器。

package main

import (
	"github.com/kercylan98/minotaur/server"
)

func main() {
	srv := server.New(server.NetworkWebsocket)
	srv.RegConnectionReceivePacketEvent(func(srv *server.Server, conn *server.Conn, packet server.Packet) {
		conn.Write(packet)
	})
	if err := srv.Run(":9999"); err != nil {
		panic(err)
	}
}

访问 WebSocket 在线测试 进行验证。

Websocket地址: ws://127.0.0.1:9999

分流服务器

分流服务器可以将客户端分流到不同的分组上,每个分组中为串行处理,不同分组之间并行处理。

package main

import "github.com/kercylan98/minotaur/server"

func main() {
	srv := server.New(server.NetworkWebsocket,
		server.WithShunt(func(conn *server.Conn) (guid int64, allowToCreate bool) {
			guid, allowToCreate = conn.GetData("roomId").(int64)
			return
		}),
	)
	srv.RegConnectionReceivePacketEvent(func(srv *server.Server, conn *server.Conn, packet []byte) {
		conn.Write(packet)
	})
	if err := srv.Run(":9999"); err != nil {
		panic(err)
	}
}

该示例中假设各房间互不干涉,故通过server.WithShunt将连接通过roomId进行分组,提高并发处理能力。

服务器死锁检测

Minotaur内置了服务器消息死锁检测功能,可通过server.WithDeadlockDetect进行开启。

package main

import (
	"github.com/kercylan98/minotaur/server"
	"time"
)

func main() {
	srv := server.New(server.NetworkWebsocket,
		server.WithDeadlockDetect(time.Second*5),
	)
	srv.RegConnectionReceivePacketEvent(func(srv *server.Server, conn *server.Conn, packet []byte) {
		time.Sleep(10 * time.Second)
		conn.Write(packet)
	})
	if err := srv.Run(":9999"); err != nil {
		panic(err)
	}
}

在开启死锁检测的时候需要设置一个合理的死锁怀疑时间,该时间内消息没有处理完毕则会触发死锁检测,并打印WARN级别的日志输出。

计时器

在默认的server.Server不会包含计时器功能,可通过server.WithTicker进行开启,例如:

package main

import "github.com/kercylan98/minotaur/server"

func main() {
	srv := server.New(server.NetworkWebsocket, server.WithTicker(50, false))
	if err := srv.Run(":9999"); err != nil {
		panic(err)
	}
}

也可以通过timer.GetTicker获取计时器进行使用,例如:

package main

import (
	"fmt"
	"github.com/kercylan98/minotaur/utils/timer"
	"github.com/kercylan98/minotaur/utils/times"
	"sync"
)

func main() {
	var ticker = timer.GetTicker(10)
	var wait sync.WaitGroup
	wait.Add(3)
	ticker.Loop("LOOP", timer.Instantly, times.Second, timer.Forever, func() {
		fmt.Println("LOOP")
		wait.Done()
	})
	wait.Wait()
}

流操作

可以通过 stream 包快速开启对切片map的流式操作,例如:

package main

import (
	"fmt"
	"github.com/kercylan98/minotaur/utils/stream"
	"github.com/kercylan98/minotaur/utils/streams"
)

func main() {
	s := stream.WithSlice([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}).
		Copy().
		Shuffle().
		Filter(true, func(index int, item int) bool {
			return item%2 == 0
		}).
		Zoom(20).
		Each(true, func(index int, item int) bool {
			t.Log(index, item)
			return false
		}).
		Chunk(3).
		EachT(func(index int, item stream.Slice[int]) bool {
			t.Log(item)
			return false
		}).
		Merge().
		FillBy(func(index int, value int) int {
			if value == 0 {
				return 999
			}
			return value
		})
	
	fmt.Println(s)
}

基于xlsx文件的配置导出工具

该导出器的xlsx文件配置使用JSON语法进行复杂类型配置,具体可参考图例

持续更新的示例项目

贡献者列表

参与贡献请参考 CONTRIBUTING.md 贡献指南。

联系方式

JetBrains OS licenses

Minotaur had been being developed with GoLand IDE under the free JetBrains Open Source license(s) granted by JetBrains s.r.o., hence I would like to express my thanks here.