基于 Microsoft Orleans 的分布式游戏系统。
ProjectU 是一个使用 C# 和 Orleans 框架构建的分布式游戏系统演示项目。系统包含:
- ProjectU.Cluster: Orleans Silo,托管 PlayerGrain 管理玩家状态
- ProjectU.Game: Console 客户端,处理玩家命令并与集群交互
- 每个玩家登录时获得唯一 Token
- Token 表示操作权限(锁)
- 同一玩家新登录会立即踢掉旧会话
- Game 实例本地累积数据修改
- 定时(10秒)自动 Flush 到服务器
- 支持手动 Flush 命令
- 使用 Orleans Observer 模式
- 新登录立即通知旧 Game 实例
- 旧实例收到通知后清理会话
- .NET SDK 10.0 或更高版本
dotnet run --project src/ProjectU.Cluster你会看到:
Starting ProjectU.Cluster (Orleans Silo)...
ProjectU.Cluster is running.
Press ENTER to stop...
在新的终端窗口中:
dotnet run --project src/ProjectU.Game你会看到:
Connected to Orleans Cluster.
========================================
Welcome to ProjectU.Game Console!
Type 'help' for available commands
=========================================
>
| 命令 | 说明 | 示例 |
|---|---|---|
login <playerId> |
登录指定玩家 | login player1 |
logout |
登出当前玩家 | logout |
addhp <value> |
增加/减少 HP | addhp 10 或 addhp -5 |
status |
显示当前状态 | status |
flush |
手动 flush 数据 | flush |
help |
显示帮助 | help |
exit |
退出程序 | exit |
-
终端 1 启动 Game 实例并登录:
> login player1 Logged in successfully! Welcome, player1! -
终端 2 启动另一个 Game 实例并登录同一玩家:
> login player1 Logged in successfully! Welcome, player1! -
终端 1 应该立即看到:
[!] You have been kicked out: New login from GameInstance_xxxxx
-
登录并修改 HP:
> login player1 > addhp 20 HP increased by 20. Current HP: 120 -
等待 10 秒(自动 flush)或手动 flush:
> flush Flushing data to server... Flush completed. -
重启 Cluster,然后重新登录:
> login player1 > status HP: 120/100 # 数据已持久化
ProjectU/
├── src/
│ ├── ProjectU.Cluster/ # Orleans Silo
│ │ ├── Grains/
│ │ │ ├── Interfaces/ # Grain 接口
│ │ │ │ ├── IPlayerGrain.cs
│ │ │ │ └── IGameSessionObserver.cs
│ │ │ ├── Models/ # 数据模型
│ │ │ │ ├── PlayerData.cs
│ │ │ │ ├── SessionToken.cs
│ │ │ │ ├── LoginResult.cs
│ │ │ │ ├── LogoutResult.cs
│ │ │ │ └── FlushResult.cs
│ │ │ └── Implementations/ # Grain 实现
│ │ │ └── PlayerGrain.cs
│ │ └── Program.cs
│ │
│ └── ProjectU.Game/ # Console 客户端
│ ├── Commands/ # 命令处理器
│ │ └── CommandProcessor.cs
│ ├── Services/ # 服务层
│ │ ├── ClusterClientService.cs
│ │ ├── GameSessionObserver.cs
│ │ └── PlayerSession.cs
│ └── Program.cs
│
├── .gitignore
├── CLAUDE.md # 代码风格和开发指南
└── README.md
- .NET 10.0
- Microsoft Orleans 9.0 - 分布式 Actor 框架
- C# - 编程语言
Token 代表当前 Game 实例对某个玩家的操作权限:
- 玩家登录时,PlayerGrain 生成唯一 Token
- Game 实例持有 Token 并可以操作玩家数据
- 新登录时,旧 Token 失效,旧实例被踢下线
- Token 包含过期时间(默认 30 分钟)
Game 实例 PlayerGrain
│ │
│─── login ─────────────>│
│<── token + data ───────│
│ │
│ [本地修改 HP] │
│ │
│─── flush(data) ───────>│
│<── serverData ──────────│
PlayerGrain 使用 Observer 模式推送通知:
新登录 旧 Game 实例
│ │
│ │
├─── login ──────> PlayerGrain
│ │
│ ├─── OnKickedOut ──> ✗ (被踢下线)
│<── token + data ───────│
参见 CLAUDE.md 了解:
- 代码风格规范
- Git 工作流程
- 测试指南
- Orleans 最佳实践
# 构建整个解决方案
dotnet build
# 清理并重新构建
dotnet clean && dotnet build本项目使用企业级代码质量工具链,包括 Husky.NET Git hooks、代码分析器和自动化格式化。
✨ 零配置体验 - 团队成员首次构建时会自动安装所有工具:
git clone <repository-url>
cd ProjectU
dotnet build # 自动安装工具和 Git hooks# 1. 格式化代码
dotnet format
# 2. 运行测试
dotnet test
# 3. 提交代码(自动运行检查)
git add .
git commit -m "feat: add new feature"- Husky.NET - Git hooks 自动化(pre-commit、commit-msg)
- 代码分析器 - SerilogAnalyzer、StyleCop、NetAnalyzers、SonarAnalyzer
- 自动化格式化 - 基于 .editorconfig 的代码风格检查
- 测试框架 - xUnit、Moq、FluentAssertions
📚 详细文档: docs/code-quality.md - 完整的开发工作流、故障排除和最佳实践
MIT License