GameFrameX.Setting,GameFrameX 框架的基础设施框架库.框架文档主页: https://gameframex.doc.alianblank.com
$ dotnet add package GameFrameX.StartUpGameFrameX 是一个基于 C# .NET 8.0 开发的高性能游戏服务器框架,采用 Actor 模型设计,支持跨平台部署。框架内置热更新机制,可以满足绝大部分游戏类型的需求,特别适合与 Unity3D 协同开发。
设计理念:大道至简,以简化繁
┌─────────────────────────────────────────────────────────────┐
│ Client Layer │
├─────────────────────────────────────────────────────────────┤
│ Network Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ TCP │ │ WebSocket │ │ HTTP │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ Message Layer │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Message Handlers │ │
│ └─────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ Actor Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Player │ │ Server │ │ Account │ │
│ │ Actor │ │ Actor │ │ Actor │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ Component Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Component │ │ Component │ │ Component │ │
│ │ + State │ │ + State │ │ + State │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ Database Layer │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ MongoDB │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
克隆项目
git clone https://github.com/GameFrameX/GameFrameX.git
cd GameFrameX/Server
安装依赖
dotnet restore
配置数据库
编译运行
dotnet build
dotnet run --project GameFrameX.Launcher
验证运行
GameFrameX.Server/
├── GameFrameX.Apps/ # 应用层(状态数据)
│ ├── Account/ # 账号模块
│ ├── Player/ # 玩家模块
│ └── Server/ # 服务器模块
├── GameFrameX.Hotfix/ # 热更新层(业务逻辑)
│ ├── Logic/ # 业务逻辑
│ └── StartUp/ # 启动逻辑
├── GameFrameX.Core/ # 核心框架
│ ├── Actors/ # Actor 系统
│ ├── Components/ # 组件系统
│ └── Events/ # 事件系统
├── GameFrameX.NetWork/ # 网络模块
├── GameFrameX.DataBase/ # 数据库模块
├── GameFrameX.Config/ # 配置模块
└── GameFrameX.Launcher/ # 启动器
每个 Entity 都有一个对应的 Actor,所有对 Entity 的操作都通过 Actor 进行,保证线程安全:
// 获取玩家组件代理
var playerAgent = await ActorManager.GetComponentAgent<PlayerComponentAgent>(playerId);
// 调用组件方法(自动入队,线程安全)
var result = await playerAgent.AddExp(1000);
定义状态类(Apps 工程)
public class BagState : StateBase
{
public List<Item> Items { get; set; } = new();
public int MaxSlots { get; set; } = 100;
}
创建组件类(Apps 工程)
public class BagComponent : StateComponent<BagState>
{
// 组件初始化逻辑
}
实现业务逻辑(Hotfix 工程)
public class BagComponentAgent : StateComponentAgent<BagComponent, BagState>
{
public async Task<bool> AddItem(int itemId, int count)
{
// 业务逻辑实现
return true;
}
}
[MessageMapping(typeof(ReqLogin))]
public class LoginHandler : BaseMessageHandler
{
public override async Task<MessageObject> Action(MessageObject message)
{
var request = (ReqLogin)message;
// 处理登录逻辑
return new RespLogin { Success = true };
}
}
# 构建镜像
docker build -t gameframex .
# 运行容器
docker run -d -p 8080:8080 gameframex
本文档详细说明了 OpenTelemetryExtensions.cs 文件中配置的所有 OpenTelemetry 指标,包括指标的来源、用途和配置方式。
Microsoft.AspNetCore.Hosting: ASP.NET Core 主机指标
System.Net.Http: HTTP 客户端指标
System.Runtime: .NET 运行时指标
GameFrameX.Database: 数据库相关指标
gameframex_database_query_total: 数据库查询总次数gameframex_database_query_duration_seconds: 数据库查询持续时间gameframex_database_connection_pool_size: 数据库连接池大小gameframex_database_active_connections: 数据库活跃连接数GameFrameX.Network: 网络相关指标
gameframex_network_connection_total: 网络连接总次数gameframex_network_message_sent_total: 网络消息发送总数gameframex_network_message_received_total: 网络消息接收总数gameframex_network_bytes_sent_total: 网络字节发送总数gameframex_network_bytes_received_total: 网络字节接收总数gameframex_network_current_connections: 当前网络连接数GameFrameX.Session: 会话相关指标
gameframex_session_created_total: 会话创建总数gameframex_session_destroyed_total: 会话销毁总数gameframex_session_duration_seconds: 会话持续时间gameframex_session_active_count: 当前活跃会话数GameFrameX.Business: 业务相关指标
gameframex_player_login_total: 玩家登录总数gameframex_player_register_total: 玩家注册总数gameframex_game_room_created_total: 游戏房间创建总数gameframex_online_player_count: 当前在线玩家数gameframex_active_game_room_count: 当前活跃游戏房间数gameframex_http_api_request_total: HTTP API 请求总数gameframex_http_api_request_duration_seconds: HTTP API 请求持续时间configure.AddMeter("Microsoft.AspNetCore.Hosting")http.server.request.duration - HTTP 服务器请求持续时间http.server.active_requests - 当前活跃的 HTTP 请求数量configure.AddMeter("Microsoft.AspNetCore.Server.Kestrel")kestrel.active_connections - 当前活跃连接数kestrel.connection.duration - 连接持续时间kestrel.rejected_connections - 被拒绝的连接数kestrel.queued_connections - 排队等待的连接数kestrel.queued_requests - 排队等待的请求数configure.AddMeter("System.Net.Http")http.client.request.duration - HTTP 客户端请求持续时间http.client.active_requests - 当前活跃的客户端请求数http.client.open_connections - 打开的 HTTP 连接数http.client.connection.duration - HTTP 连接持续时间configure.AddMeter("System.Net.NameResolution")dns.lookup.duration - DNS 查找持续时间configure.AddMeter("System.Runtime")dotnet.process.cpu.time - 进程 CPU 使用时间dotnet.process.memory.working_set - 进程工作集内存dotnet.gc.collections - GC 收集次数dotnet.gc.heap.total_allocated - 堆总分配内存dotnet.gc.last_collection.memory.committed_size - 最后一次 GC 后提交的内存大小dotnet.gc.last_collection.heap.size - 最后一次 GC 后堆大小dotnet.gc.last_collection.heap.fragmentation.size - 最后一次 GC 后堆碎片大小dotnet.thread_pool.thread.count - 线程池线程数量dotnet.thread_pool.work_item.count - 线程池工作项数量dotnet.thread_pool.queue.length - 线程池队列长度configure.AddMeter("Microsoft.AspNetCore.Components") (当前已注释)configure.AddMeter("Microsoft.AspNetCore.Components.Lifecycle") (当前已注释)configure.AddMeter("Microsoft.AspNetCore.Components.Server.Circuits") (当前已注释)setting.IsOpenTelemetry 和 setting.IsOpenTelemetryMetrics 控制是否启用UseGrafana() 集成 Grafana 监控configure.AddPrometheusExporter()configure.AddConsoleExporter() (仅开发环境)builder.UseGrafana()/health 端点进行健康检查/metrics 端点供 Prometheus 抓取http://{ip}:{port}/metricshttp://{ip}:{port}/health// 在业务代码中使用自定义指标
using GameFrameX.Monitor;
// 记录数据库查询
GameFrameXMetrics.DatabaseQueryCount.Add(1, new KeyValuePair<string, object?>("operation", "find"));
// 记录网络消息
GameFrameXMetrics.NetworkMessageSentCount.Add(1, new KeyValuePair<string, object?>("message_type", "login"));
// 记录玩家登录
GameFrameXMetrics.PlayerLoginCount.Add(1, new KeyValuePair<string, object?>("login_type", "normal"));
为了更好地分析监控数据,建议在记录指标时添加适当的标签:
数据库指标标签:
operation: 操作类型(find, insert, update, delete)collection: 集合名称database: 数据库名称网络指标标签:
message_type: 消息类型protocol: 协议类型(tcp, udp, websocket)endpoint: 端点信息会话指标标签:
session_type: 会话类型user_type: 用户类型业务指标标签:
game_mode: 游戏模式server_region: 服务器区域user_level: 用户等级System.Runtime 指标需要 .NET 9+ 才能正常工作/health: 详细的 JSON 格式健康检查报告/health/simple: 简单的 "OK" 响应(兼容性端点){
"status": "Healthy",
"checks": [
{
"name": "self",
"status": "Healthy",
"description": "应用程序运行正常",
"duration": 0.1234
},
{
"name": "opentelemetry",
"status": "Healthy",
"description": "OpenTelemetry 配置正常",
"duration": 0.0567
}
],
"totalDuration": 0.1801,
"serverName": "GameServer",
"tagName": "Production",
"timestamp": "2024-01-15T10:30:00.000Z"
}
// 在 Program.cs 或 Startup.cs 中配置
builder.Services.AddGameFrameXHealthChecks(appSetting);
// 配置健康检查端点
app.UseGameFrameXHealthChecks(appSetting);
// 或指定自定义路径
app.UseGameFrameXHealthChecks(appSetting, "/api/health");
System.Runtime 指标在 .NET 8 中可能不会产生数据,建议在 .NET 9+ 中使用我们欢迎所有形式的贡献!
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)本项目采用 Apache License 2.0 许可证 - 查看 LICENSE 文件了解详情。
感谢所有为 GameFrameX 做出贡献的开发者们!
如果这个项目对你有帮助,请给我们一个 ⭐