为自己而写,也为同路人而记
RSS 订阅这里整理系统、网络、C++、Go、Rust 与软件架构相关的长期笔记,重点不是追热点,而是把复杂问题讲清楚。
很多文章本来来自我自己的知识库,后来逐步整理成系列化内容。对我来说,这座博客既是公开的技术归档,也是持续校准认知的过程。
精选文章
-
Rust 异步生态(总览):从 mio 到 axum 的分层架构
Rust 的异步网络栈是 mio → tokio → hyper → tower → axum 五层,每层职责单一、可独立替换。C++ Asio 把事件通知、调度、定时器、buffer、协程支持打包在一个库里。两种设计没有绝对优劣——Rust 的分层来自语言特性(ownership 使模块边界天然清晰),Asio 的一体化来自 C++ 生态的碎片化(没有统一运行时,不如自己全做)。
-
可观测性(一):三大支柱-Logs、Traces、Metrics
出了问题 │ ┌──────────────┼──────────────┐ ▼ ▼ ▼ Metrics Traces Logs "有问题" "哪里慢" "为什么错"
-
整洁架构(二):核心原则-依赖方向永远从外向内
Clean Architecture 只有一条铁律:内层不能 import 外层的任何东西。通过接口定义在消费方(依赖反转),实现内层调用外层能力、却不依赖外层实现。其余分层、命名都是这条规则的推论。
-
C++ 工程化(一):Modern CMake 的核心是 target-based 与传递性语义
CMake 不是构建系统而是构建系统生成器(读 CMakeLists.txt → 生成 Makefile / Ninja / VS 工程 / Xcode 工程)。Old-Style CMake 靠 includedirectories、adddefinitions 这种全局命令驱动,无作用域、无传递性、无法组合;Modern CMake(3.15+ 是真正的基线)把一切挂在 target 上,用 PUBLIC/PRIVATE/INTERFACE 显式表达"这个使用需求是只给我自己用,还是要传递给 consumer"。掌握这三个关键字 + generator expressions($<...>)+ CMakePresets.json + FetchContent,就写得出 2026 年的 idiomatic CMake。
-
Go 运行时(一):GMP 调度模型
Go 运行时通过 G(goroutine)、M(OS thread)、P(logical processor)三级抽象实现 M:N 线程调度。P 的引入(Go 1.1)解决了全局锁竞争,work-stealing 保证负载均衡,异步抢占(Go 1.14+,SIGURG 信号)消除了 CPU 密集型 goroutine 的饥饿问题。Go 1.25 起 GOMAXPROCS 自动感知容器 cgroup CPU 限制。
-
asio(一):Proactor模式-为什么Asio不用Reactor
Proactor 模式以「操作完成通知」为核心,恰好是 Windows IOCP 的原生语义;而 Linux epoll/macOS kqueue 是 Reactor(就绪通知),可以在其上模拟 Proactor。反过来在 IOCP 上模拟 Reactor 极其别扭。Asio 选 Proactor 作为公共 API,是唯一能同时高效映射所有主流操作系统的选择。
最新文章
-
云原生基础:Twelve-Factor App 作为应用设计契约
Twelve-Factor App(2011, Heroku)定义了 SaaS 应用与运行平台之间的契约:声明式配置、无状态进程、环境无关的构建产物、日志作为事件流。它不是银弹——环境变量存密钥有安全隐患、严格无状态忽略了合理的本地缓存、Admin Processes 在 K8s 时代已过时——但其核心洞察(代码与配置分离、进程与状态分离、构建与运行分离)至今仍是云原生应用的设计基线。
-
Rust 基础:类型转换 as、From/Into 与 Turbofish
三个容易混淆的东西,各自干不同的事。
-
Rust 基础:类型获得 Trait 方法的三种方式
为什么有时候 use 一个 trait 就能直接调方法,有时候要 #[derive],有时候要手写 impl?
-
Rust 基础:Serde 序列化框架
serde(框架层) 定义两个 trait: Serialize, Deserialize 定义中间数据模型: bool, i64, string, seq, map, struct, enum... 提供 #[derive] 宏 + #[serde(...)] 属性