这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Go 语言编程实战》3.2 密钥管理不落盘
数据库密码、JWT 私钥、对象存储凭证一旦进了 git 历史或镜像层,就等于永久泄露。本节给 TaskHub 实现一个只认环境变量与权限受限文件的密钥加载器,实测 0600 文件放行、0644 文件拒绝、缺失报错的完整行为,并给出日志脱敏、密钥轮换与常见反模式清单。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
数据库密码、JWT 私钥、对象存储凭证一旦进了 git 历史或镜像层,就等于永久泄露。本节给 TaskHub 实现一个只认环境变量与权限受限文件的密钥加载器,实测 0600 文件放行、0644 文件拒绝、缺失报错的完整行为,并给出日志脱敏、密钥轮换与常见反模式清单。
同一个 TaskHub 二进制要跑在开发机、CI、预发、生产四种环境,靠改代码区分是灾难。本节给 TaskHub 建立四层配置优先级——默认值 < 配置文件 < 环境变量 < 命令行,用 YAML 文件加 os.LookupEnv 与 flag 实测每一层如何覆盖上一层,并给出环境变量命名与类型解析的工程约定。
深入零知识证明的数学核心与工程实践:Groth16/PLONK 证明系统对比、Circom 电路编写、Tornado 隐私交易原理、zkRollup 与 zkEVM 扩容,以及可验证凭证在身份体系中的应用。
本节讲解 NestJS 应用的两件「非业务」大事:配置如何按环境分层、用 schema 在启动时校验、并以类型安全的方式读取;生命周期钩子如何在模块与应用的启停节点执行初始化与清理,配合优雅关闭让进程在收到信号后体面退出。读完本节,你能让应用在配置错误时快速失败,也能保证关停时不丢连接、不漏任务。
本节讲解 NestJS 请求处理流水线里的三类横切组件:管道负责校验与转换入参,守卫决定请求能否放行,拦截器在方法前后织入日志、响应包装与超时控制。我们给出它们的执行顺序、手写实现与全局注册方式,并对比各自的适用边界。读完本节,你能把校验、鉴权与日志从控制器里抽干净,写出无重复样板的后端接口。
本节讲解 NestJS 的模块、提供者与依赖注入三件套如何协作:用 @Injectable 与构造函数声明依赖,用 @Module 划清边界,用自定义提供者与注入令牌替换实现,并处理循环依赖与作用域陷阱。读完本节,你能为真实后端项目设计出层次清晰、可测试、可替换的模块结构,也能看懂任意一个 NestJS 项目的装配图。
把「图书借阅管理服务」的动作式接口重写成资源式接口:讲清资源命名的判据、URL 层级与扁平化的取舍、HTTP 方法与状态码的语义,以及批量操作、自定义动作和统一错误响应该在什么条件下破例,并给出可直接复用的 Controller 与 ProblemDetail 代码。
前端从 5173 端口调用 8080 的图书接口,浏览器报跨域,可服务端日志里请求明明到了。本节讲清同源策略拦的到底是谁、简单请求与预检请求的区别,贴出真实的 OPTIONS 预检头,演示 @CrossOrigin、addCorsMappings、CorsFilter 三种配置,并说透 allowedOriginPatterns 与 allowCredentials 的坑。
用 lifespan 管理应用级资源(连接池、后台任务),在 SIGTERM 下实现优雅关闭让在途请求跑完,并按 Kubernetes 语义设计 liveness 与 readiness 两类健康探针;全部用 uvicorn 0.54.0 真实进程实测。
用中间件把日志、请求 ID、耗时统计等横切关注点从业务里抽出来:对比 BaseHTTPMiddleware 与纯 ASGI 两种写法,用 request.state 与 contextvars 传递请求上下文,并实测中间件的洋葱顺序与并发下的上下文隔离。
用 FastAPI 0.143.0 搭一个分层后端:把 api / service / repository / schema 四层拆开,用 APIRouter 分文件装配,用 Depends 区分请求级与进程级依赖,用 lru_cache 做单例,并用 dependency_overrides 做测试隔离;每一步都给出真实运行结果。
本节处理 TaskAPI 的中文标题:先立住「string 是不可变 UTF-8 字节序列」这个事实,用实测数据说明 len 与字符数为何不同、按字节切会切出非法 UTF-8,再讲 range 如何解码、[]byte 与 []rune 的转换代价,最后用 strings 包与 Builder 写出按字符校验、按字符截断的标题处理函数。
本节给 TaskAPI 加上 map[int64]Task 索引,让按 ID 查找从遍历降为常数时间:从字面量与 make 起步,讲透 comma-ok 惯用法与「读不存在的键返回零值」这个经典陷阱,再说明键的约束、遍历顺序随机、用 map 做集合,最后用 maps 包与双结构索引组装出内存版存储。
本节让 TaskAPI 拥有真正的任务列表:先用数组与切片的语义差异(值类型 vs 描述符)立住概念,再拆解 len/cap 与 append 的扩容实测数据,重点讲清共享底层数组导致的数据污染与三索引切片的解法,最后用 slices 包给 []Task 排序、查找并组装出内存版存储。
用标准库按完整用户轮次裁剪历史,保留系统指令和最近一轮,将工具描述及裁剪说明计入近似预算;超限无法满足时在调用模型前明确失败。
本节让同一个 Model 协议接入 Anthropic SDK,重点是双向转换、工具结果成批回填和显式拒绝不支持的响应。适配器不做业务重试。普通文本和客户端 tool_use 是本例支持的范围。thinking、server_tool_use 等块以及 refusal、pause_turn 等停止原因需要独立协议设计;本例明确拒绝,不把它们折成正常 final。Message 只保存拼接文本与工具列表,不能无损保留任意供应商 block 的交错顺序。
本节把「调用大模型」抽象成 minagent 的 Model 协议:用一个 complete(messages, tools) 方法屏蔽供应商差异,用统一的 ModelResponse 承载回复、停止原因与用量。我们讲清协议为什么存在、complete 与 stream 如何取舍,再给出 EchoModel 与 ScriptedModel 两个可运行实现,并验证它们可以互换。
本节区分契约测试与集成测试的边界,说明消费者驱动契约在 Spring Cloud Contract 与 Pact 之间的选型,并给出数据隔离三策略(事务回滚、@Sql、每测试独立 schema/容器)的对比、测试数据构造规范,以及 @DirtiesContext 的真实代价。
协作式抢占和异步抢占的区别、sysmon 干什么,站内专题讲过概念。本节只写增量:用两组真实实验量化抢占——关闭异步抢占后 GC 的 STW 从 0.3ms 暴涨到 1.8s,以及 GOMAXPROCS=1 下阻塞系统调用被 sysmon 夺回 P;再定位到 proc.go:sysmon/retake/preemptone 与 preempt.go:asyncPreempt。
调度循环长什么样、work stealing 怎么工作,站内专题讲过原理。本节只写增量:用 schedtrace 的每-P 队列长度和 runtime/metrics 的 goroutine 状态计数,实测窃取的痕迹;再顺着 proc.go:schedule→findRunnable→stealWork→runqsteal 把代码走一遍;最后给一张「队列分布→结论」的决策表。