学习目标
本文不是「教程」,而是一份 pkg/ 公共库开发标准(目录契约)。读它时你应带着下面三个目标:
- 知道这份文档覆盖哪些能力:它定义了 Go 微服务框架里
pkg/下 30+ 模块的职责边界——从熔断、限流、服务发现,到日志、链路、优雅停机、幂等等横切关注点。 - 学会怎么用这份文档:当你要新建一个公共能力(比如要加分布式锁),先来这里查是否已有
lock/模块,避免重复造轮子;写新代码时严格按「目录 → 文件 → 职责」三层对照实现。 - 建立「接口在 biz、实现在 data/具体包」的纪律:本文隐含一条铁律——通用能力以接口/抽象形式暴露,具体实现(Redis/etcd/MySQL)下沉到对应子包,方便替换与单测。
前置知识:
- 已熟悉 Go 工程结构(module / package / internal)
- 了解微服务常见中间件(熔断、限流、注册发现、链路追踪)
- 建议配合「Kitex 电商微服务」「Kratos 用户模块」一起看,本文是它们的「底层能力清单」
怎么用这份文档:把它当「索引」——遇到「这个能力该放哪」或「框架已经提供了什么」时来查表;不要从头背,用到哪查到哪。
| 目录 | 用途说明 | 需要完成的功能 |
|---|---|---|
cache/ | 分布式缓存抽象 | 本地缓存 + Redis 二级缓存、缓存穿透/击穿/雪崩防护、自动过期与刷新 |
circuit/ | 熔断器 | 失败率/慢调用/错误数熔断策略、半开探测、自动恢复、gRPC 与 HTTP 统一接入 |
circuit/breaker.go | 熔断器核心接口 | Closed/Open/HalfOpen 状态机、滑动窗口统计 |
circuit/grpc.go | gRPC 熔断拦截器 | 客户端 UnaryInterceptor,接入 Breaker |
circuit/http.go | HTTP 熔断中间件 | Gin 中间件 + HTTP Client 包装器 |
concurrent/ | 并发工具包 | Goroutine 池管理、流水线处理 |
concurrent/pool.go | Goroutine Pool | 并发数控制、worker 复用、任务队列、优雅关闭 |
concurrent/pipeline.go | 批处理流水线 | 多阶段并发处理、批量聚合、流式传递 |
config/ | 配置管理 | 多格式加载(YAML/JSON/ENV)、热更新监听、分层覆盖 |
config/loader.go | 配置加载器 | 文件读取、环境变量注入、默认值合并 |
config/watch.go | 配置热更新 | 文件变更监听、回调通知、原子切换 |
constant/ | 全局常量定义 | 错误码、环境标识、元数据 Key |
constant/code.go | 错误码定义 | 业务错误码枚举、HTTP/gRPC 状态映射 |
constant/env.go | 环境常量 | dev/staging/prod 环境标识 |
constant/meta_key.go | 元数据 Key 常量 | HTTP Header / gRPC Metadata Key 统一定义 |
convert/ | 类型转换工具 | 基本类型互转、安全转换、零值兜底 |
ctxutil/ | 上下文工具 | 元数据存取、请求上下文传播 |
ctxutil/ctx_keys.go | Context Key 定义 | 自定义 Key 类型,避免 Key 冲突 |
ctxutil/get.go | 上下文取值 | 从 context 提取 UserID、RequestID、TraceID 等 |
ctxutil/set.go | 上下文设值 | 向 context 注入元数据,支持链式传播 |
eventbus/ | 消息总线 / MQ 抽象 | 发布订阅接口、Kafka/RocketMQ 适配、可靠投递、消费重试 |
fileutil/ | 文件工具 | 文件读写、路径处理、文件存在性检查、目录遍历 |
grpcx/ | gRPC 核心 SDK | 客户端、服务端、拦截器、服务发现、状态转换 |
grpcx/client/ | gRPC 客户端 | 连接池管理、拨号、重试策略 |
grpcx/client/conn_pool.go | 连接池 | 连接复用、健康检查、空闲回收 |
grpcx/client/dialer.go | 拨号器 | 超时控制、TLS 配置、Keepalive |
grpcx/client/retry_policy.go | 重试策略 | 指数退避、抖动、最大重试次数、可重试错误判定 |
grpcx/interceptor/ | gRPC 拦截器 | 日志、元数据、恢复、超时、链路 |
grpcx/interceptor/logging.go | 日志拦截器 | 请求/响应日志、耗时统计 |
grpcx/interceptor/metadata.go | 元数据拦截器 | 上下游元数据透传 |
grpcx/interceptor/recovery.go | 恢复拦截器 | panic 捕获,调用 recovery/ 核心 |
grpcx/interceptor/timeout.go | 超时拦截器 | 请求级超时控制 |
grpcx/interceptor/trace.go | 链路拦截器 | TraceID 注入与提取 |
grpcx/metadata/ | gRPC 元数据工具 | Carrier 适配、MD 复制 |
grpcx/metadata/carrier.go | Carrier 适配 | 实现 propagation.TextMapCarrier 接口 |
grpcx/metadata/copy.go | MD 复制 | 深拷贝 metadata.MD,避免并发修改 |
grpcx/resolver/ | 服务发现解析器 | etcd 地址解析 |
grpcx/resolver/etcd_resolver.go | etcd 解析器 | 监听 etcd 服务列表变更、实时更新连接目标 |
grpcx/server/ | gRPC 服务端 | Server 构建、拦截器注册、服务注册 |
grpcx/server/server_builder.go | Server 构建器 | 链式配置、拦截器组装、生命周期管理 |
grpcx/status/ | gRPC 状态转换 | 业务错误码 ↔ gRPC status 转换 |
grpcx/status/convert.go | 状态转换器 | code ↔ status 映射、details 填充 |
httppx/ | HTTP/Gin 网关 SDK | 中间件、响应、路由、绑定、客户端 IP |
httppx/binder.go | 请求绑定器 | Proto/JSON 请求参数绑定与校验 |
httppx/clientip.go | 客户端 IP 提取 | 解析 X-Forwarded-For、X-Real-IP |
httppx/router.go | 路由工具 | 路由分组、注册辅助、前缀管理 |
httppx/middleware/ | Gin 中间件集合 | 认证、限流、CORS、恢复、链路 |
httppx/middleware/auth.go | 认证中间件 | JWT/Token 校验、权限判断 |
httppx/middleware/cors.go | CORS 中间件 | 跨域头设置、预检请求处理 |
httppx/middleware/limiter.go | 限流中间件 | 薄封装调用 sentinel/ 限流核心 |
httppx/middleware/recover.go | 恢复中间件 | 薄封装调用 recovery/ 核心 |
httppx/middleware/trace.go | 链路中间件 | TraceID 注入、请求日志关联 |
httppx/response/ | 统一响应 | 响应体封装、错误映射 |
httppx/response/resp.go | 响应体 | 统一 JSON 结构、成功/失败封装 |
httppx/response/error_mapper.go | 错误映射 | 业务错误码 → HTTP 状态码 + 错误详情 |
idempotency/ | 请求幂等控制 | 幂等 Key 生成、Redis 去重、超时过期 |
job/ | 分布式定时任务 | Cron 调度、分布式锁防重复、任务状态管理 |
lock/ | 分布式锁 | 通用接口 + Redis/etcd 实现 |
lock/lock.go | 锁接口 | Lock/Unlock/TryLock 通用定义 |
lock/redis_lock.go | Redis 锁实现 | SET NX EX、自动续期、解锁校验 |
lock/etcd_lock.go | etcd 锁实现 | Lease + TXN、公平锁 |
logger/ | 结构化日志 | Zap 封装、日志分级、动态级别 |
logger/zap.go | Zap 核心封装 | 日志初始化、字段注入、采样配置 |
logger/log_helper.go | 日志辅助 | 上下文日志(关联 RequestID/TraceID) |
metric/ | 指标采集 | Prometheus 指标定义与暴露 |
metric/prom.go | Prometheus 实现 | Counter/Histogram/Gauge 注册、/metrics 端点 |
mysql/ | MySQL 数据层 | 连接池、事务管理 |
mysql/client.go | MySQL 客户端 | 连接池配置、慢查询日志、健康检查 |
mysql/transaction.go | 事务管理 | Begin/Commit/Rollback、嵌套事务、超时控制 |
orm/ | ORM 封装 | 业务 CRUD、事务传播 |
orm/gorm.go | GORM 封装 | 分页查询、软删除、钩子、批量操作 |
orm/tx_propagate.go | 事务传播 | 跨 Repository 事务共享、传播行为 |
recovery/ | Panic 恢复核心 | 统一恢复逻辑、回调处理 |
recovery/panic.go | 恢复核心 | panic 捕获、堆栈记录、错误转换 |
recovery/handler.go | 恢复回调 | 日志记录、指标上报、告警通知 |
redis/ | Redis 数据层 | 客户端连接、Pipeline |
redis/client.go | Redis 客户端 | 连接池、哨兵/集群支持、命令封装 |
registry/ | 服务注册发现 | 注册接口 + etcd 实现 |
registry/registry.go | 注册接口 | Register/Deregister/Discover 通用定义 |
registry/etcd_registry.go | etcd 实现 | 服务注册、TTL 续约、实例发现 |
registry/model.go | 数据模型 | ServiceInstance 定义(名称、地址、端口、权重) |
security/ | 安全工具 | 加解密、签名、认证 |
security/aes.go | AES 加解密 | 对称加密、CBC/GCM 模式 |
security/jwt.go | JWT 工具 | Token 生成、解析、过期校验 |
security/md5.go | MD5 工具 | 哈希计算、盐值混淆 |
sentinel/ | 限流降级 | 多种限流算法 + 统一接入点 |
sentinel/token_bucket.go | 令牌桶 | QPS 限流、突发流量允许、分布式模式 |
sentinel/leaky_bucket.go | 漏桶 | 平滑限流、下游保护 |
sentinel/hotspot.go | 热点参数限流 | 用户/IP/商品维度细粒度控制 |
sentinel/middleware.go | 统一接入点 | HTTP/gRPC 限流降级中间件 |
shutdown/ | 优雅停机 | 信号监听 + 平滑关闭 |
shutdown/shutdown.go | 停机核心 | 停止接收新请求、等待存量请求、资源释放 |
shutdown/signal.go | 信号监听 | SIGTERM/SIGINT 捕获、触发停机流程 |
strs/ | 字符串工具 | 截取、拼接、驼峰转换、随机生成 |
times/ | 时间工具 | 格式化、时区转换、时间差计算、定时器 |
tracer/ | 链路追踪 | OpenTelemetry 集成 |
tracer/provider.go | Tracer Provider | 初始化 Tracer、采样率配置 |
tracer/otel.go | OTel 封装 | Span 创建、属性注入、上下文传播 |
tracer/propagator.go | 传播器 | W3C TraceContext / B3 传播协议 |
validate/ | 参数校验 | 字段校验、结构体验证、自定义规则 |
internal/testutil/ | 测试工具(项目级) | Mock 工具、TestContainer、测试 fixtures |
pkg/
├── circuit/ # 熔断器
├── concurrent/ # 并发工具 (Pool + Pipeline)
├── config/ # 配置加载与热更新
├── constant/ # 全局常量
├── convert/ # 类型转换
├── ctxutil/ # 上下文工具
├── eventbus/ # 消息总线 / MQ
├── fileutil/ # 文件工具
├── grpcx/ # gRPC 核心 SDK
│ ├── client/ # 连接池、拨号、重试
│ ├── interceptor/ # 拦截器
│ ├── metadata/ # 元数据工具
│ ├── resolver/ # 服务发现
│ ├── server/ # 服务端构建
│ └── status/ # 状态转换
├── httppx/ # HTTP/Gin 网关
│ ├── middleware/ # 中间件
│ └── response/ # 统一响应
├── idempotency/ # 幂等控制
├── job/ # 分布式定时任务
├── lock/ # 分布式锁
├── logger/ # 结构化日志
├── metric/ # 指标采集
├── mysql/ # MySQL 数据层
├── orm/ # ORM 封装
├── recovery/ # Panic 恢复核心
├── redis/ # Redis 数据层
├── registry/ # 服务注册发现
├── security/ # 安全工具
├── sentinel/ # 限流降级
├── shutdown/ # 优雅停机
├── strs/ # 字符串工具
├── times/ # 时间工具
├── tracer/ # 链路追踪
└── validate/ # 参数校验
```text
## 自测题与动手练习
**自测题(合上书能答出来,才算懂)**:
面试官
这份 pkg/ 标准文档的核心纪律是什么?为什么"接口上提、实现下沉"?
候选人
核心纪律是"接口 / 抽象上提、具体实现下沉"——通用能力以接口暴露(lock/lock.go、circuit/breaker.go),Redis / etcd / MySQL 等具体实现落在对应子包(如 lock/redis_lock.go、lock/etcd_lock.go)。好处是便于替换实现、便于 mock 单测;新增公共能力前先查表,避免重复造轮子。
面试官
熔断和限流分别由哪个模块负责?它们怎么接入 gRPC 和 HTTP?
候选人
熔断由 circuit/ 负责(circuit/grpc.go 是 gRPC UnaryInterceptor、circuit/http.go 是 Gin 中间件 + HTTP Client 包装器);限流由 sentinel/ 负责(令牌桶 / 漏桶 / 热点参数,sentinel/middleware.go 统一接入 HTTP / gRPC)。两者都通过拦截器 / 中间件统一接入,状态机与限流算法和传输层解耦。
面试官
分布式锁和幂等控制怎么分工?各自防止什么问题?
候选人
lock/ 提供通用分布式锁接口(Redis SET NX EX 自动续期、etcd Lease + TXN 公平锁),防止并发临界区被多节点同时进入;idempotency/ 做请求级幂等(幂等 Key + Redis 去重 + 超时过期),防止重试 / 重复消息导致业务双写(如重复扣款)。锁防"同时",幂等防"重复"。
面试官
gRPC 的链路追踪和元数据透传靠哪些模块串起来?
候选人
链路靠 tracer/(provider / otel / propagator,支持 W3C TraceContext / B3);元数据透传靠 ctxutil/(context 存取 UserID / RequestID / TraceID)和 grpcx/metadata/(Carrier 适配、MD 深拷贝)。拦截器侧:grpcx/interceptor/trace.go 注入 / 提取 TraceID,grpcx/interceptor/metadata.go 透传上下游 metadata,HTTP 侧由 httppx/middleware/trace.go 关联。
面试官
优雅停机由谁负责?它和 recovery 的关系是什么?
候选人
shutdown/ 负责优雅停机(signal.go 捕获 SIGTERM / SIGINT,shutdown.go 停止接收新请求、等待存量请求、释放资源)。recovery/ 是 Panic 恢复核心(panic 捕获、堆栈记录、错误转换),被 grpcx/interceptor/recovery.go 与 httppx/middleware/recover.go 薄封装调用。recovery 保证单请求不崩,shutdown 保证进程退出时不丢在途请求,两者互补。
**动手练习(建议真做一遍)**:
1. 挑 `circuit/` 和 `sentinel/` 各读一个实现文件(如 `breaker.go` 状态机、`token_bucket.go`),画出"请求进来 → 统计 → 决策"的链路,标注它如何被 gRPC / HTTP 拦截器接入。
2. 在 `lock/` 下为某一存储(如 MySQL 乐观锁)新增一个实现文件,严格按"通用接口在 `lock.go`、实现下沉子包"的纪律写,并补一个 mock 单测。
3. 打开 `grpcx/interceptor/` 的几个拦截器(logging / metadata / recovery / timeout / trace),确认它们如何共用 `ctxutil` 在 context 里传播 UserID / RequestID / TraceID,画一张请求上下文传播图。
## 本章小结
复习提示:
- 本文是一份
pkg/ 模块职责契约,覆盖缓存、熔断、并发、配置、gRPC/HTTP SDK、限流、锁、日志、链路、优雅停机等 30+ 公共能力,是微服务项目的基础设施清单。
- 使用纪律是「接口/抽象上提、具体实现下沉」:通用能力以接口暴露,Redis/etcd/MySQL 等实现落在对应子包,便于替换与 mock。
- 落地时先查表、再动手:新增公共能力前确认是否已有对应模块,避免重复建设;代码严格对照「目录 → 文件 → 功能」三层实现。
- 下一份文档可进入具体模块的实现细节(如
circuit/、sentinel/、grpcx/),本文作为总览与检索入口。