Skip to content

A distributed game system built with Microsoft Orleans using Actor model

Notifications You must be signed in to change notification settings

fanxiao92/ProjectU

Repository files navigation

ProjectU

基于 Microsoft Orleans 的分布式游戏系统。

项目概述

ProjectU 是一个使用 C# 和 Orleans 框架构建的分布式游戏系统演示项目。系统包含:

  • ProjectU.Cluster: Orleans Silo,托管 PlayerGrain 管理玩家状态
  • ProjectU.Game: Console 客户端,处理玩家命令并与集群交互

核心特性

1. Token 机制保证数据一致性

  • 每个玩家登录时获得唯一 Token
  • Token 表示操作权限(锁)
  • 同一玩家新登录会立即踢掉旧会话

2. 数据 Flush 模式

  • Game 实例本地累积数据修改
  • 定时(10秒)自动 Flush 到服务器
  • 支持手动 Flush 命令

3. 实时踢下线通知

  • 使用 Orleans Observer 模式
  • 新登录立即通知旧 Game 实例
  • 旧实例收到通知后清理会话

快速开始

前置要求

  • .NET SDK 10.0 或更高版本

运行项目

1. 启动 Cluster

dotnet run --project src/ProjectU.Cluster

你会看到:

Starting ProjectU.Cluster (Orleans Silo)...
ProjectU.Cluster is running.
Press ENTER to stop...

2. 启动 Game 实例

在新的终端窗口中:

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 10addhp -5
status 显示当前状态 status
flush 手动 flush 数据 flush
help 显示帮助 help
exit 退出程序 exit

测试分布式场景

场景 1: 登录冲突(踢下线)

  1. 终端 1 启动 Game 实例并登录:

    > login player1
    Logged in successfully! Welcome, player1!
    
  2. 终端 2 启动另一个 Game 实例并登录同一玩家:

    > login player1
    Logged in successfully! Welcome, player1!
    
  3. 终端 1 应该立即看到:

    [!] You have been kicked out: New login from GameInstance_xxxxx
    

场景 2: 数据持久化

  1. 登录并修改 HP:

    > login player1
    > addhp 20
    HP increased by 20. Current HP: 120
    
  2. 等待 10 秒(自动 flush)或手动 flush:

    > flush
    Flushing data to server...
    Flush completed.
    
  3. 重启 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 机制

Token 代表当前 Game 实例对某个玩家的操作权限:

  1. 玩家登录时,PlayerGrain 生成唯一 Token
  2. Game 实例持有 Token 并可以操作玩家数据
  3. 新登录时,旧 Token 失效,旧实例被踢下线
  4. Token 包含过期时间(默认 30 分钟)

数据 Flow

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 - 完整的开发工作流、故障排除和最佳实践

License

MIT License

About

A distributed game system built with Microsoft Orleans using Actor model

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages