关于 grpc-golang
面向 Go 开发者的技能,指导设计和实现生产级 gRPC 服务,涵盖 Protobuf 与 Buf 契约、mTLS 安全、流式处理和 OpenTelemetry 可观测性。
主要功能
- 01Go gRPC 服务设计
- 02Protobuf 契约版本管理
- 03Buf 检查与破坏性变更验证
- 04mTLS 服务身份验证
- 05OpenTelemetry 插桩
适用场景
- 01设计 Go 微服务通信
- 02构建基于 Protobuf 的内部 API
- 03实现一元或流式 RPC
- 04为 gRPC 服务添加追踪和指标
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill grpc-golang安装后在 Claude Code 中输入/grpc-golang确认已加载。
附带文件resources/implementation-playbook.md
详细介绍
gRPC Golang(gRPC-Go)
概述
全面介绍如何在 Go 中设计和实现生产级 gRPC 服务。涵盖使用 Buf 标准化契约、通过 mTLS 实现传输层安全,以及借助 OpenTelemetry 插桩实现深入的可观测性。
适用场景
- 使用 Go 和 gRPC 设计微服务通信。
- 使用 Protobuf 构建高性能内部 API。
- 实现流式工作负载(单向或双向)。
- 使用 Protobuf 和 Buf 标准化 API 契约。
- 配置 mTLS 以进行服务间身份验证。
不适用场景
- 构建不需要 gRPC 的纯 REST/HTTP 公共 API。
- 修改旧版
.proto文件,但无法引入新的 API 版本(例如api.v2)或确保向后兼容。 - 管理服务网格流量路由(例如 Istio/Linkerd),这超出了应用代码的范围。
分步指南
- 确认技术背景:确定 Go 版本、gRPC-Go 版本,以及项目使用的是 Buf 还是原生 protoc。
- 确认需求:确定 mTLS 需求、负载模式(单次调用/流式)、SLO 和消息大小限制。
- 规划 Schema:定义包版本(例如
api.v1)、资源类型和错误映射。 - 安全设计:实现 mTLS,以进行服务间身份验证。
- 可观测性:配置拦截器,以实现追踪、指标和结构化日志记录。
- 验证:在完成代码生成前,始终运行
buf lint和破坏性变更检查。
详细模式、代码示例和反模式请参阅 resources/implementation-playbook.md。
示例
示例 1:定义服务和消息(v1 API)
syntax = "proto3";
package api.v1;
option go_package = "github.com/org/repo/gen/api/v1;apiv1";
service UserService {
rpc GetUser(GetUserRequest) returns (GetUserResponse);
}
message User {
string id = 1;
string name = 2;
}
message GetUserRequest {
string id = 1;
}
message GetUserResponse {
User user = 1;
}
最佳实践
- ✅ 应做: 使用 Buf,通过
buf.yaml和buf.gen.yaml标准化工具链和 lint 检查。 - ✅ 应做: 始终在包路径中使用语义化版本(例如
package api.v1)。 - ✅ 应做: 对所有内部服务间通信强制使用 mTLS。
- ✅ 应做: 在所有流式处理程序中处理
ctx.Done(),以防止资源泄漏。 - ✅ 应做: 将领域错误映射为标准 gRPC 状态码(例如
codes.NotFound)。 - ❌ 不应做: 向 gRPC 客户端返回原始内部错误字符串或堆栈跟踪。
- ❌ 不应做: 每个请求都创建新的
grpc.ClientConn;应始终复用连接。
故障排查
- 错误:生成结果不一致:如果生成的代码与 Schema 不匹配,请运行
buf generate并检查go_package选项。 - 错误:上下文超时:检查客户端超时设置,并确保服务器不会在流式处理程序中无限阻塞。
- 错误:mTLS 握手失败:确保客户端和服务器两端都已将 CA 证书正确添加到
x509.CertPool。
限制
- 不涵盖服务网格流量路由(Istio/Linkerd 配置)。
- 不涵盖 gRPC-Web 或基于浏览器的 gRPC 集成。
- 提供的是特定版本的示例,而非受支持版本矩阵;请确认当前 Go/gRPC-Go 模块要求和 API(例如
grpc.Dial与grpc.NewClient)。 - 不涵盖 L7 gRPC 感知型负载均衡器配置(例如 Envoy、NGINX)。
- 不涉及 Protobuf Schema 注册表或 Buf lint 之外的大规模 Schema 治理。
资源
resources/implementation-playbook.md:详细模式、代码示例和反模式。- Google API 设计指南
- Buf 文档
- gRPC-Go 文档
- OpenTelemetry Go 插桩
相关技能
- @golang-pro - gRPC 层之外的通用 Go 模式和性能优化。
- @go-concurrency-patterns - 流式处理程序的高级 goroutine 生命周期管理。
- @api-design-principles - 编写
.proto文件前的资源命名和版本控制策略。 - @docker-expert - 将 gRPC 服务容器化,并通过 Docker secrets 配置 TLS 证书注入。
评论
支持 Markdown