这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Go 语言编程实战》18.1 架构复盘与容量规划
上线前的最后一道算术题是「这台机器到底能扛多少」。本节用本机真实的基准数据(M1 Pro 上 536.6 ns/op、1 alloc/op,并发 8 路 135.7 ns/op)做架构复盘与容量规划:从实测吞吐推算单副本容量,用安全系数与依赖瓶颈算出需要的副本数,并给出成本与冗余的权衡表。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
上线前的最后一道算术题是「这台机器到底能扛多少」。本节用本机真实的基准数据(M1 Pro 上 536.6 ns/op、1 alloc/op,并发 8 路 135.7 ns/op)做架构复盘与容量规划:从实测吞吐推算单副本容量,用安全系数与依赖瓶颈算出需要的副本数,并给出成本与冗余的权衡表。
日志的价值不在数量而在质量。本节讲清该记什么、不该记什么(密码、令牌、身份证、完整卡号绝不上日志,并给出脱敏示例),如何为事件选对级别,为什么用参数化写法记录异常才不会丢堆栈,占位符 {} 的延迟求值与 isDebugEnabled 的真正用途,异步日志的收益与丢日志风险,并附一份可直接落地的日志规范 checklist。
本附录把 Go 学习与实战中最常见的错误按「报错原文 → 原因 → 修法」整理:declared and not used、类型不匹配、nil map 写入、切片别名、goroutine 泄漏、context deadline exceeded、module path 不匹配、missing go.sum entry、import cycle 与中文乱码,每条都给出最小复现代码与修法。
本附录整理 go 命令与工具链的用法:build/run/test/vet/fmt/mod/get/work/generate/doc/env 各子命令、GOTOOLCHAIN 多版本、GOOS/GOARCH/CGO_ENABLED/GOFLAGS/GOPROXY 等环境变量,以及 -ldflags/-gcflags/-race/-cover 等构建标志,命令与输出均在 go1.27.0 实测。
本附录按「想做什么 → 用哪个包哪个函数」整理 Go 标准库常用 API:strings、strconv、bytes、time、encoding/json、os、io、fmt、errors、slices、maps、cmp、sync、context、net/http 与 log/slog,函数签名均用 go doc 在本机 go1.27.0 上核实,并配可运行的最小示例。
本附录把全书用到的 Go 语法与惯用法压缩成一组速查表:类型与零值、变量与常量、控制流、函数与 defer、切片与 map、字符串与 rune、结构体与方法、接口、错误处理、泛型与并发原语,每段片段都按「想做什么 → 怎么写」组织,并在 go1.27.0 上实测输出。
文本日志检索困难,本节把图书服务日志改成结构化 JSON:用 logback-spring.xml 配合 logstash-logback-encoder 输出字段化日志,讲清 MDC 用法与线程池不传递的陷阱及 TaskDecorator 解法,用 Filter 把请求 ID 写进 MDC 串联一次请求,并对比 logback-spring.xml 与 logback.xml 的差别。
《Go 语言编程入门》全书导航页:说明本书定位、读者画像与前置知识、三条学习路径与六个部分之间的依赖关系,并按六个部分列出 18 章 54 节的完整章节索引,另含序、前言、附录 A–D 与常见问题速查表,方便读者按需定位、跳读与随时查阅全书。
《Go 语言编程入门》的序。从 Go 今天在语言生态中的位置谈起,说明站内既有的 Go 专题做的是「单点深挖」、这本书补的是「从零到能干活」的递进路径,并交代本书的三个刻意取舍、对「Go 啰嗦」等常见误解的回应,以及不同起点的读者该从哪一章进入这趟旅程。
《Go 语言编程入门》前言:说明本书的目标读者与前置知识、六部分 18 章的结构分工、每一节的组织方式、代码与工具链约定、Go 1.27 的版本基线与三种阅读路径,并给出各部分的学习时长估算,以及发现疏漏时该如何提交勘误与反馈意见,方便你快速建立对全书的整体预期。
为 TaskAPI 收口上线:跑 vet 与 -race 测试、看逐函数覆盖率、写发布构建脚本产出多平台静态二进制、打包 tar.gz 并生成 sha256 校验和,配发布检查清单与上线后验证,最后回顾全卷 18 章的演进与下一步学习方向。
把 TaskAPI 的四层装配成完整链路并实跑:从 main 的手工 DI 到 httpapi 的路由、store 的实现、领域校验,补齐 PATCH/DELETE 与统一错误响应,用 -race 跑测试、用 curl 走一遍创建到删除的端到端,复盘装配顺序与并发安全的关键决策。
对 TaskAPI 做一次完整复盘:从用户故事与非功能需求出发,梳理分层架构、包边界与 HTTP 契约,回顾从第 1 章到第 17 章的演进轨迹,并逐条复盘关键架构取舍——接口抽象的判据、内存到数据库的平滑迁移、错误分层与并发安全,最后列出收口清单。
客户端用 fetch 发 POST,检查 HTTP 状态与 Content-Type,再逐字节解码并交给有状态 SSEParser。原生 EventSource 的 GET 接口不适合这个 POST 演示。空行才派发事件;流结束时 flush TextDecoder,未终止的残帧按规范丢弃。心跳注释忽略,帧长度与总请求时间有上限;finally 释放 reader。协议中的 id/retry 与自动重连尚未实现。
本节固定 FakeModel 只回答预设加法,验证 /run、/stream 与 OpenAPI 接线,不理解任意问题。HTTP/SDK 都是核心之外的可选环境。StreamingResponse 按帧传输不等于模型增量流;complete 阶段仍等完整响应。原生 EventSource 是 GET,本节 POST 用 fetch。同步线程不因连接断开就被杀死,真实服务需另设计异步调用和取消。
本节把 minagent 从「一堆模块」整理成「一个库」:用 __init__.py 收敛出稳定的公开 API 面,用 __all__ 与下划线前缀划清公开契约与内部实现的边界,并定下 SemVer 版本策略——破坏性变更何时允许、哪些名字属于契约。最后用 import minagent as ma 真跑一段只碰公开面的稳定性示例。
《Spring Boot 高级》全书导航页:说明本卷面向已经能独立交付服务、想理解框架内部机制的读者,给出三条学习路径与一份八周计划,讲清四个部分之间的依赖关系,并按部分列出 11 章 33 节的完整索引,每一节都配一句话说明,另含面向排查场景的常见问题速查表,方便按需跳读与随时查阅。
队长掉线了,谁带队进副本?本节把「掉线」与「退队」拆成两件事:掉线只灭在线标志、保留座位等重连,超时未回才回收;队长一掉线立刻按加入顺序把队长位交给下一位在线成员,且重连后不归还。全部用 go test -race 真跑,并讲清它与卷一顶号、重连的衔接。
上一节把入口控制收成了一处判断,但「先 Count 再 Add」这个写法本身在并发下就是错的:两个邀请可能都看到空位,把队伍撑到 5 人。本节把满员判断与写入压进同一个临界区,再把「满员校验 + 匹配锁定」也做成原子操作,用 go test -race 复现并证明修复。
副本、排位、世界 Boss 都要先问一句:这个玩家能不能进这支队伍。本节把队伍建成一个带生命周期状态机的服务端对象,用状态、队长身份、成员集合三道闸把入口控制钉死,并用 Go 标准库写出可直接 go test 的 L1 实现,再把每道门逐一撞开。