Skip to content

mackz-maxw/racon-rust-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 

Repository files navigation

多线程 TCP 服务器骨架

  • Reactor + 非阻塞 I/O(基于 Tokio)
  • 多线程运行时
  • 分层架构:网络层 / 协议层 / 业务层
  • 线程安全任务队列 + 简单共享状态

最小可行代码结构

  • Cargo.toml
  • .gitignore
  • main.rs
  • src/net.rs — 网络层:监听端口、接受连接
  • src/protocol.rs — 协议层:解析简单文本协议
  • src/service.rs — 业务层:处理请求
  • src/state.rs — 共享状态 + 任务队列

如何运行

  • 在 VS Code 的终端运行:
cargo run
# 或者
RUST_LOG=info cargo run # 测试用,通过设置环境变量 `RUST_LOG=info` 控制日志级别
  • 在另一个终端或 VS Code 集成终端用 nc 连接并验证:
nc 127.0.0.1 8080
PING
TIME

执行路径

  1. 启动入口在 main.rs。Tokio 多线程运行时通过 #[tokio::main(flavor = "multi_thread")] 启动;初始化日志后,调用 state::new_state 创建共享状态 state::SharedState 与任务队列接收端,并 spawn 一个后台协程消费 state::Task
  2. 主函数调用网络层的 net::run,绑定到 0.0.0.0:8080 并进入 accept 循环。
  3. 每当有新连接,网络层克隆共享状态并为连接分配 ID,使用 state::State::incr_connections 递增计数,然后为该连接 tokio::spawn 一个任务,交由协议层处理。
  4. 协议层在 protocol.rs 的 protocol::handle_connection 中:
    • 读取字节流;EOF 时调用 state::State::decr_connections 并结束。
    • 将请求文本入队到任务通道(state.task_tx.send(...)),供 main 的后台协程消费。
    • 调用业务层 service::handle_request 生成响应并写回客户端。
  5. 业务层在 service.rs 内实现简单命令:
    • "PING" -> "PONG\n"
    • "TIME" -> 当前秒级时间戳
    • 其他 -> 回显

文件关系与调用链清晰分层:入口 main.rs -> 网络层 net.rs -> 协议层 protocol.rs -> 业务层 service.rs,共享状态由 state.rs 定义并在各层使用。

后续开发计划

按阶段推进,每一步尽量可测可回滚:

  1. 协议层完善

    • 设计明确的应用层协议(长度前缀 / 行分隔 / 二进制帧)。
    • 引入帧编码/解码模块,避免粘包/拆包问题。
    • 增加协议版本、错误码。
  2. 任务队列与并发模型优化

    • 将当前简单 mpsc 队列抽象为任务调度器模块:
      • 多个 worker 协程/线程消费任务。
      • 根据请求类型路由到不同 worker 池。
    • 设计共享状态的读写策略:
      • 尽量使用无锁结构、Atomic*
      • 必须加锁时采用细粒度 RwLock 拆分数据域。
  3. 业务层分层与可测试性

    • 将业务逻辑抽象为 trait(如 Service),方便单元测试与 mock。
    • 建立清晰的 DTO / domain model,避免直接在协议层操作内部结构。
    • 为核心业务写单元测试与集成测试。
  4. 稳定性与压测

    • 引入 metrics(如 Prometheus 导出):QPS、连接数、队列长度、错误率等。
    • 使用 wrk / hey / tcpkali 等工具做压测,目标达到并稳定超过 $300\ \text{req/s}$
    • 在压测中观察:
      • CPU / 内存 / 上下文切换;
      • 队列积压情况;
      • 长尾延迟。
  5. 资源管理与鲁棒性

    • 增加连接超时、空闲连接回收。
    • 实现优雅关闭(graceful shutdown),处理 SIGINT / SIGTERM。
    • 针对 I/O 错误、解码错误、业务异常统一封装错误类型和日志规范。
  6. 可配置与可观测性

    • 用配置文件或环境变量控制:
      • 监听端口、worker 数量、队列大小;
      • 日志级别。
    • 集成结构化日志(traceId / span),便于分布式环境排障。
  7. 扩展与分布式

    • 增加多实例部署支持(无状态 / 轻状态),配合负载均衡器。
    • 如果需要跨节点共享状态,引入外部存储(Redis / 分布式 KV)。

当前这套最小骨架已经支持多线程运行、基本分层和线程安全队列 可以直接 cargo run,用 nc 127.0.0.1 8080 发送 PING / TIME 验证服务器行为。

About

rust TCP server developing...

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages