用途:在 Go 中实现微服务,每个服务(或 worker)一个二进制,边界清晰,客户端带超时。适用于创建或审查 Go 微服务。
主要能力与约定:
- 技术栈:HTTP 用 Gin/chi/stdlib(以项目为准);gRPC 用于低延迟内部契约;消息传递用 Kafka/NATS/Rabbit/SQS(以已采用者为准);DB 用 sqlc/pgx/GORM,每服务一个 DB;可观测性用 otel + slog/zap + Prometheus。保留仓库现有库,未经要求不更换 broker/ORM。
- 按服务布局:services/orders/ 下含 cmd/orders/main.go、internal/(config、http 或 grpc、app 用例、domain、adapter 含 db/queue/clients)、migrations/、Dockerfile。main 负责 wiring 与优雅关闭;domain 不导入 HTTP 框架;跨服务客户端置于接口之后。
- 不可协商规则:所有边界传 context.Context;每个 HTTP/gRPC/DB 客户端设超时;消费者与关键 POST 使用幂等键/去重;提供 /live(进程)与 /ready(关键依赖);启动时类型化配置,无效则 fail-fast;不与其他服务共享数据库。
- 同步:契约版本化、DTO 显式;中间件含 request id、auth、日志、recovery;类型化错误映射稳定状态码;仅幂等操作重试,带 backoff + jitter;gRPC 设 deadline、正确状态码,拦截器不 panic。
- 异步:本地 DB 写入 → Outbox → Publisher → Topic → Consumer(inbox/幂等);Outbox 与业务写入同事务;消费者仅在副作用持久化(或 inbox)后提交 offset/ack;事件 schema 版本化,消费者容忍新字段;毒消息进 DLQ 并告警,不无限循环;消费者处理短小,重活用 errgroup、semaphore 限并发。
- 弹性:关键依赖用 circuit breaker(sony/gobreaker 或 mesh);按依赖做 bulkhead 池/限流;优雅关闭:停止接收 → 排空 → 关闭池/producer;ErrGroup 带取消,不泄漏 goroutine。
- 可观测性:HTTP 与消息传播 trace id/baggage;指标含延迟、错误、队列饱和、消费者 lag;结构化日志不含 PII,每条日志带 service=orders。
- 测试:domain 与 handler 单元测试;风险需要时在边界做契约/集成测试(测试 broker/DB);单元测试中用跨服务客户端 fake。
- 反模式:init() 做全局 I/O;消费者无幂等;http.DefaultClient 无超时;无必要地部署全部耦合的“微”单体仓库;把其他服务 struct 当“内部 API”复制而不版本化。
- 完成标准:服务可启动,含配置、健康与干净关闭;客户端有超时/幂等;事件或 RPC 与 microservices-architecture 对齐;无共享写 DB;关键路径有最小指标/日志/追踪。
限制:资料未提供具体安装命令、收费、价格、平台或效果信息。