# GameFrameX.Server.Source
**Repository Path**: gameframex/GameFrameX.Server.Source
## Basic Information
- **Project Name**: GameFrameX.Server.Source
- **Description**: High-performance game server framework built on .NET 10.0 with Actor model | 基于 .NET 10.0 与 Actor 模型的高性能游戏服务器框架
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: https://gameframex.doc.alianblank.com/
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2026-05-17
- **Last Updated**: 2026-11-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README

# GameFrameX Server
[](LICENSE)
[](https://github.com/GameFrameX/GameFrameX.Server.Source/releases)
[](https://dotnet.microsoft.com/download/dotnet/10.0)
[](https://gameframex.doc.alianblank.com)
[](https://discord.gg/VDWUjWMDw9)
[](https://github.com/GameFrameX/gameframex)
[](https://www.bilibili.com/video/BV1yrpeepEn7)
[](https://gitee.com/GameFrameX/gameframex)
**独立游戏前后端一体化解决方案 · 独立游戏开发者的圆梦大使**
[文档](https://gameframex.doc.alianblank.com) · [快速开始](#快速开始) · QQ群: 467608841 / 233840761
[English](README.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [한국어](README.ko.md)
## 目录
- [项目简介](#项目简介)
- [功能特性](#功能特性)
- [快速开始](#快速开始)
- [环境要求](#环境要求)
- [安装](#安装)
- [使用示例](#使用示例)
- [配置管理](#配置管理)
- [业务逻辑开发](#业务逻辑开发)
- [热更新机制](#热更新机制)
- [Docker 部署](#docker-部署)
- [多进程跨进程联调](#多进程跨进程联调)
- [监控与可观测性](#监控与可观测性)
- [测试](#测试)
- [架构概览](#架构概览)
- [项目结构](#项目结构)
- [进程拓扑同构](#进程拓扑同构)
- [多角色启动](#多角色启动)
- [Docker Compose 文件](#docker-compose-文件)
- [依赖](#依赖)
- [文档与资源](#文档与资源)
- [社区与支持](#社区与支持)
- [贡献指南](#贡献指南)
- [更新日志](#更新日志)
- [开源协议](#开源协议)
---
## 项目简介
GameFrameX Server 是基于 C# .NET 10.0 开发的高性能、跨平台游戏服务器框架,采用 Actor 模型设计,支持热更新机制。专为多人在线游戏开发而设计,支持 Unity3D、Godot、LayaBox 等多种客户端平台集成。
**设计理念**:大道至简,以简化繁
---
### 功能特性
#### 高性能架构
- **Actor 模型**:基于 TPL DataFlow 构建的无锁高并发系统,通过消息传递机制避免传统锁性能损耗
- **全异步编程**:完整的 async/await 异步编程模型
- **零锁设计**:Actor 内部状态通过消息队列串行化访问,无需加锁
- **批量持久化**:支持批量数据库写入,可配置批量大小和超时时间
- **雪花 ID 生成**:内置分布式唯一 ID 生成器,支持工作节点和数据中心配置
#### 热更新系统
- **零停机更新**:运行时加载新逻辑程序集,无需停止服务
- **状态逻辑分离**:持久化状态数据(Apps 层)与可热更业务逻辑(Hotfix 层)严格分离
- **优雅过渡**:旧程序集保留 10 分钟宽限期,等待进行中请求完成后卸载
- **版本管理**:支持通过 HTTP 端点指定版本号加载
#### 多协议网络通信
- **TCP**:基于 SuperSocket 的高性能 TCP 服务器,主要游戏通信协议
- **UDP**:可选的 UDP 协议支持
- **WebSocket**:基于 SuperSocket WebSocket 的双向通信
- **HTTP/HTTPS**:基于 Kestrel 的 HTTP 服务,支持 Swagger 文档、CORS、健康检查
- **KCP**:升级为正式支持(opt-in)的 UDP 可靠传输;`KcpPort` 为 `0` 时与 TCP 共用端口
- **跨进程消息**:内置 RemoteMessaging 模块,支持断路器、重试策略、一致性哈希分片
#### 数据库与持久化
- **数据库 Provider 三档**:`PostgreSql` 与 `Mongo` 为双主线(两家均全验证——条件写原语、可翻译子集查询、事务原子性在两家双绿,作为发布门禁),外加 `Sqlite` 零依赖上手 + 测试档
- **MongoDB Provider**:完整的 MongoDB 集成,支持健康状态机(Healthy → Degraded → Unhealthy → Recovering)
- **PostgreSQL Provider**:基于 Npgsql,具备与 MongoDB Provider 相同的重试 / 恢复 / 可用性 / 健康检查能力
- **透明持久化**:StateComponent 自动序列化/反序列化,通过定时批量 upsert 操作持久化
- **连接池管理**:可配置的连接池和重试策略
- **OpenTelemetry 集成**:数据库操作指标(延迟、重试次数、健康状态)
#### 监控与可观测性
- **OpenTelemetry**:全面的指标(Metrics)、追踪(Tracing)和日志(Logging)
- **Prometheus**:原生指标导出端点
- **Grafana Loki**:日志聚合输出支持
- **Serilog**:结构化日志,支持控制台、文件、Loki 多输出
---
## 快速开始
### 环境要求
- 仅支持 [.NET 10.0 SDK](https://dotnet.microsoft.com/download/dotnet/10.0),不支持 .NET 8/9。
- 零依赖启动无需安装任何数据库(SQLite 内嵌,示例配置 `Configs/app_config.json` 默认即 Sqlite);完整生产 Provider 为 MongoDB 与 PostgreSQL,仅在选用对应 Provider 时才需要安装——通过修改配置文件中的两行选择项切换(见[数据库 Provider 三档定位与边界](#数据库-provider-三档定位与边界))
- Visual Studio 2022 或 JetBrains Rider(推荐)
### 安装
1. **克隆仓库**
```bash
git clone https://github.com/GameFrameX/GameFrameX.Server.Source.git
cd GameFrameX.Server.Source
```
2. **构建并进入输出目录**
启动器以工作目录为基准解析 `Configs/` 与 `hotfix/`,因此请从构建输出目录运行(`quick_start-game.bat` 也在该目录):
```bash
dotnet build
cp -r Configs bin/app_debug/Configs
cd bin/app_debug
```
3. **五分钟零依赖启动(SQLite)**
无需安装数据库、无需 Docker——一条命令在单进程中拉起全部角色(示例配置默认即 SQLite,命令行取值与配置文件一致):
```bash
dotnet GameFrameX.Launcher.dll -- \
--AllInOne \
--DatabaseProvider=Sqlite \
--DataBaseUrl="Data Source=data/gameframex.db"
```
- 启动日志会打印 HTTP 入口以及解析出的**数据文件绝对路径**和它的读写检查结果。
- 健康检查:`http://localhost:28080/health`(存活探针:`/alive`)——示例配置开启了开发模式才会映射这些端点(生产环境请关闭 `HttpIsDevelopment`;安全说明见 `ServiceDefaultsExtensions`)。
- 数据落在工作目录下的 `data/gameframex.db`(与 Docker 的 `/app/data` 卷根对齐)。停止并重启进程,账号与状态依然存在。
- 想要一个用完即弃的临时数据库?改用 `--DataBaseUrl="Data Source=:memory:"`——启动日志会警告**不做任何持久化**(进程退出后全部丢失)。
- 在把部署规模扩展到单进程之外前,请先阅读[数据库 Provider 三档定位与边界](#数据库-provider-三档定位与边界)。
4. **使用 MongoDB / PostgreSQL 启动(完整 Provider)**
示例 `Configs/app_config.json` 默认为零依赖的 SQLite 档;切换 Provider 只需改配置文件中的两行选择项(启动校验器要求命令行参数与配置文件一致,因此配置文件才是选择载体):
```bash
# 1. 启动数据库(以 MongoDB 为例;PostgreSQL 同理)
docker run -d -p 27017:27017 --name mongo mongo:8.2
# 2. 修改 Configs/app_config.json 中的选择项(对每个要启动的角色都要生效):
# "DatabaseProvider": "Mongo",
# "DataBaseUrl": "mongodb://127.0.0.1:27017"
# (现成样例:Configs/app_config.mongo.json / Configs/app_config.postgres.json)
# 3. 运行
dotnet GameFrameX.Launcher.dll -- --ServerType=Game
```
5. **验证启动**
- 健康检查:`http://localhost:28080/health`(存活探针:`/alive`)
- 查看控制台日志确认启动成功
**零 JSON 默认通(黄金路径)**:不写任何 `Online.Settings` 配置直接起服,RPS 样例对局全链(撮合 → 对局 → 结算 → 发奖 → 上榜)默认贯通——`MatchSettledBoardId` 默认投影到默认榜 `match-settled`(装配期自动预建);如需关闭投影,在 `Online.Settings` 中将 `online-competition.LeaderboardProjection.MatchSettledBoardId` 显式置空即可。
---
## 使用示例
以下示例覆盖从配置、业务逻辑、热更新到部署与调试的完整开发流程。
---
### 配置管理
GameFrameX 使用命令行参数 (`--Key=Value`) 进行配置,所有配置项定义在 `StartupOptions` 类中。
#### 服务器配置
| 配置项 | 说明 | 默认值 | 示例 |
|:------|:-----|:------|:----|
| `ServerType` | 服务器类型(必填) | 无 | `Game`、`Social` |
| `ServerId` | 服务器唯一标识 ID | 无 | `1000` |
| `ServerInstanceId` | 服务器实例 ID(区分同类型不同实例) | `0` | `1001` |
| `MinModuleId` | 业务模块起始 ID(模块分片) | `0` | `100` |
| `MaxModuleId` | 业务模块结束 ID(模块分片) | `0` | `1000` |
| `TimeZone` | 服务器时区 | `Asia/Shanghai` | `UTC` |
| `IsUseTimeZone` | 是否启用自定义时区 | `false` | `true` |
| `Language` | 语言设置 | 无 | `zh-CN` |
#### 网络配置
| 配置项 | 说明 | 默认值 | 示例 |
|:------|:-----|:------|:----|
| `InnerHost` | 内部通信 IP(集群间) | `0.0.0.0` | `0.0.0.0` |
| `InnerPort` | 内部通信端口 | `8888` | `29100` |
| `OuterHost` | 外部通信 IP(面向客户端) | `0.0.0.0` | `0.0.0.0` |
| `OuterPort` | 外部通信端口 | 无 | `29100` |
| `IsEnableTcp` | 是否启用 TCP 服务 | `true` | `true` |
| `IsEnableUdp` | 是否启用 UDP 服务 | `false` | `true` |
| `IsEnableKcp` | 是否启用 KCP 服务(仅配置文件) | `false` | `true` |
| `KcpPort` | KCP 端口(`0` 时与 TCP 共用端口) | `0` | `29120` |
| `InterNodeAuthSecret` | 节点间 RPC 鉴权共享密钥(协议握手帧 HMAC;空 = 不启用)。集群内所有节点必须配置一致 | 无 | `s3cr3t` |
| `IsEnableWebSocket` | 是否启用 WebSocket | `false` | `true` |
| `WsPort` | WebSocket 端口 | `8889` | `29300` |
| `IsEnableHttp` | 是否启用 HTTP 服务 | `true` | `true` |
| `HttpPort` | HTTP 服务端口 | `8080` | `28080` |
| `HttpsPort` | HTTPS 服务端口 | 无 | `443` |
| `HttpsCertPath` | HTTPS 证书文件路径(PFX),`HttpsPort > 0` 时必填 | 无 | `/path/cert.pfx` |
| `HttpsCertPassword` | HTTPS 证书密码(可选) | 无 | |
| `HttpSignSecret` | HTTP 签名密钥(HMAC-SHA256),开启签名校验后必填;为空时一律拒绝(fail-closed) | 无 | `a-strong-secret` |
| `HttpUrl` | API 接口根路径 | `/game/api/` | `/game/api/` |
| `HttpIsDevelopment` | HTTP 开发模式(启用 Swagger) | `false` | `true` |
| `Online` | Online 能力族配置段:`EnableRuntime` / `EnableAdminApi`(缺省 `false`)、`EnableRoles`(缺省 `["Game"]`)、`Capabilities` / `Disable` 过滤、`UseGameDbStores`、按能力 Id 寻址的 `Settings` | 无 | 见 `Configs/app_config.json` |
| `OnlineAdminPort` | Online 管理 API 监听端口 | `28090` | `28090` |
| `OnlineAdminApiPrefix` | Online 管理 API 路由前缀 | `online/admin` | `online/admin` |
| `OnlineTenantId` | Online Runtime 授权租户 ID(作用域三元组) | `0` | `1` |
| `OnlineAppId` | Online Runtime 授权应用 ID(作用域三元组) | `0` | `1` |
#### 数据库配置
| 配置项 | 说明 | 默认值 | 示例 |
|:------|:-----|:------|:----|
| `DatabaseProvider` | 数据库 Provider | `Sqlite` | `PostgreSql` |
| `DataBaseUrl` | 数据库连接字符串 | 无 | `mongodb://localhost:27017` |
| `DataBaseName` | 数据库名称 | 无 | `gameframex` |
| `DataBasePassword` | 数据库密码 | 无 | `your_password` |
#### 数据库 Provider 三档定位与边界
- **三档定位**:`PostgreSql` 与 `Mongo` 为双主线全验证档——条件写原语、可翻译子集查询、事务原子性等全部特性在两家 Provider 双实现双验证,契约套件双绿是发布门禁;`Sqlite` 为零依赖上手 + 测试档(quickstart / demo 黄金路径的默认载体,嵌入式、无需安装任何数据库),不承诺生产拓扑。
- **无数据迁移工具**:仓库不提供 Mongo ↔ PostgreSQL 的数据搬迁实现。切换 Provider 是新装/新服的选型动作(改两行配置);存量生产库换型需自行完成数据搬迁。
- **双主线维护代价**:后续每个数据库特性都要在两家 Provider 双实现、双验证(维护面约为单主线的 ×1.5–2);契约测试套件在 CI 中于 PostgreSQL + MongoDB 双跑,回归由双绿门禁兜底。
#### Actor 配置
| 配置项 | 说明 | 默认值 | 示例 |
|:------|:-----|:------|:----|
| `ActorTimeOut` | Actor 任务执行超时(毫秒) | `30000` | `60000` |
| `ActorQueueTimeOut` | Actor 队列超时(毫秒) | `30000` | `60000` |
| `ActorRecycleTime` | Actor 空闲回收时间(分钟) | `15` | `30` |
| `ActorLimitRule` | Actor 调用限制规则(None/NoBidirectionCall) | `None` | `NoBidirectionCall` |
| `HotfixVerifyEnabled` | 热更程序集装载 SHA-256 校验开关 | `false` | `true` |
| `SaveDataInterval` | 数据保存间隔(毫秒) | `30000` | `60000` |
| `SaveDataBatchCount` | 批量保存数量 | `500` | `1000` |
| `SaveDataBatchTimeOut` | 批量保存超时(毫秒) | `30000` | `60000` |
#### 日志配置
| 配置项 | 说明 | 默认值 | 示例 |
|:------|:-----|:------|:----|
| `IsDebug` | 调试日志总开关 | `false` | `true` |
| `LogIsConsole` | 输出到控制台 | `true` | `false` |
| `LogIsWriteToFile` | 输出到文件 | `true` | `false` |
| `LogEventLevel` | 日志级别 | `Debug` | `Information` |
| `LogRollingInterval` | 日志滚动间隔 | `Day` | `Hour` |
| `LogIsFileSizeLimit` | 限制单个文件大小 | `true` | `false` |
| `LogFileSizeLimitBytes` | 文件大小限制 | `104857600` (100MB) | `52428800` |
| `LogRetainedFileCountLimit` | 保留文件数量 | `31` | `90` |
| `LogIsGrafanaLoki` | 输出到 Grafana Loki | `false` | `true` |
| `LogGrafanaLokiUrl` | Grafana Loki 地址 | `http://localhost:3100` | — |
#### 监控配置
| 配置项 | 说明 | 默认值 | 示例 |
|:------|:-----|:------|:----|
| `IsOpenTelemetry` | 启用 OpenTelemetry | `false` | `true` |
| `IsOpenTelemetryMetrics` | 启用指标收集 | `false` | `true` |
| `IsOpenTelemetryTracing` | 启用分布式追踪 | `false` | `true` |
| `MetricsPort` | Prometheus 指标端口 | `0`(复用 HTTP 端口) | `9090` |
| `IsMonitorMessageTimeOut` | 监控消息处理超时 | `false` | `true` |
| `MonitorMessageTimeOutSeconds` | 超时阈值(秒) | `1` | `5` |
#### ID 生成配置
| 配置项 | 说明 | 默认值 | 示例 |
|:------|:-----|:------|:----|
| `WorkerId` | 雪花 ID 工作节点 ID | `1` | `2` |
| `DataCenterId` | 雪花 ID 数据中心 ID | `1` | `2` |
#### 启动命令示例
```bash
# 最小启动参数
dotnet GameFrameX.Launcher.dll \
--ServerType=Game \
--ServerId=1000 \
--DataBaseUrl=mongodb://127.0.0.1:27017 \
--DataBaseName=game_db
# 完整启动参数
dotnet GameFrameX.Launcher.dll \
--ServerType=Game \
--ServerId=1000 \
--ServerInstanceId=1 \
--InnerHost=0.0.0.0 \
--InnerPort=29100 \
--OuterHost=0.0.0.0 \
--OuterPort=29100 \
--HttpPort=28080 \
--IsEnableHttp=true \
--HttpIsDevelopment=true \
--IsEnableWebSocket=false \
--DataBaseUrl=mongodb://127.0.0.1:27017 \
--DataBaseName=gameframex \
--IsDebug=true \
--IsOpenTelemetry=true \
--IsOpenTelemetryMetrics=true \
--LogIsConsole=true \
--LogIsWriteToFile=true
```
---
### 业务逻辑开发
#### 组件-代理模式
框架的核心设计模式是**状态-逻辑分离**,将持久化状态(Apps 层,不可热更)与业务逻辑(Hotfix 层,可热更)严格分离。
**1. 定义状态(Apps 层)**
```csharp
// GameFrameX.Apps/Player/BagState.cs
public class BagState : BaseCacheState
{
public List