← 返回 Skills 市场
samber

Golang Grpc

作者 Samuel Berthe · GitHub ↗ · v1.1.3 · MIT-0
cross-platform ✓ 安全检测通过
212
总下载
0
收藏
0
当前安装
3
版本数
在 OpenClaw 中安装
/install golang-grpc
功能描述
Provides gRPC usage guidelines, protobuf organization, and production-ready patterns for Golang microservices. Use when implementing, reviewing, or debugging...
使用说明 (SKILL.md)

Persona: You are a Go distributed systems engineer. You design gRPC services for correctness and operability — proper status codes, deadlines, interceptors, and graceful shutdown matter as much as the happy path.

Modes:

  • Build mode — implementing a new gRPC server or client from scratch.
  • Review mode — auditing existing gRPC code for correctness, security, and operability issues.

Go gRPC Best Practices

Treat gRPC as a pure transport layer — keep it separate from business logic. The official Go implementation is google.golang.org/grpc.

This skill is not exhaustive. Please refer to library documentation and code examples for more information. Context7 can help as a discoverability platform.

Quick Reference

Concern Package / Tool
Service definition protoc or buf with .proto files
Code generation protoc-gen-go, protoc-gen-go-grpc
Error handling google.golang.org/grpc/status with codes
Rich error details google.golang.org/genproto/googleapis/rpc/errdetails
Interceptors grpc.ChainUnaryInterceptor, grpc.ChainStreamInterceptor
Middleware ecosystem github.com/grpc-ecosystem/go-grpc-middleware
Testing google.golang.org/grpc/test/bufconn
TLS / mTLS google.golang.org/grpc/credentials
Health checks google.golang.org/grpc/health

Proto File Organization

Organize by domain with versioned directories (proto/user/v1/). Always use Request/Response wrapper messages — bare types like string cannot have fields added later. Generate with buf generate or protoc.

Proto & code generation reference

Server Implementation

  • Implement health check service (grpc_health_v1) — Kubernetes probes need it to determine readiness
  • Use interceptors for cross-cutting concerns (logging, auth, recovery) — keeps business logic clean
  • Use GracefulStop() with a timeout fallback to Stop() — drains in-flight RPCs while preventing hangs
  • Disable reflection in production — it exposes your full API surface
srv := grpc.NewServer(
    grpc.ChainUnaryInterceptor(loggingInterceptor, recoveryInterceptor),
)
pb.RegisterUserServiceServer(srv, svc)
healthpb.RegisterHealthServer(srv, health.NewServer())

go srv.Serve(lis)

// On shutdown signal:
stopped := make(chan struct{})
go func() { srv.GracefulStop(); close(stopped) }()
select {
case \x3C-stopped:
case \x3C-time.After(15 * time.Second):
    srv.Stop()
}

Interceptor Pattern

func loggingInterceptor(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) {
    start := time.Now()
    resp, err := handler(ctx, req)
    log.Printf("method=%s duration=%s code=%s", info.FullMethod, time.Since(start), status.Code(err))
    return resp, err
}

Client Implementation

  • Reuse connections — gRPC multiplexes RPCs on a single HTTP/2 connection; one-per-request wastes TCP/TLS handshakes
  • Set deadlines on every call (context.WithTimeout) — without one, a slow upstream hangs goroutines indefinitely
  • Use round_robin with headless Kubernetes services via dns:/// scheme
  • Pass metadata (auth tokens, trace IDs) via metadata.NewOutgoingContext
conn, err := grpc.NewClient("dns:///user-service:50051",
    grpc.WithTransportCredentials(creds),
    grpc.WithDefaultServiceConfig(`{
        "loadBalancingPolicy": "round_robin",
        "methodConfig": [{
            "name": [{"service": ""}],
            "timeout": "5s",
            "retryPolicy": {
                "maxAttempts": 3,
                "initialBackoff": "0.1s",
                "maxBackoff": "1s",
                "backoffMultiplier": 2,
                "retryableStatusCodes": ["UNAVAILABLE"]
            }
        }]
    }`),
)
client := pb.NewUserServiceClient(conn)

Error Handling

Always return gRPC errors using status.Error with a specific code — a raw error becomes codes.Unknown, telling the client nothing actionable. Clients use codes to decide retry vs fail-fast vs degrade.

Code When to Use
InvalidArgument Malformed input (missing field, bad format)
NotFound Entity does not exist
AlreadyExists Create failed, entity exists
PermissionDenied Caller lacks permission
Unauthenticated Missing or invalid token
FailedPrecondition System not in required state
ResourceExhausted Rate limit or quota exceeded
Unavailable Transient issue, safe to retry
Internal Unexpected bug
DeadlineExceeded Timeout
// ✗ Bad — caller gets codes.Unknown, can't decide whether to retry
return nil, fmt.Errorf("user not found")

// ✓ Good — specific code lets clients act appropriately
if errors.Is(err, ErrNotFound) {
    return nil, status.Errorf(codes.NotFound, "user %q not found", req.UserId)
}
return nil, status.Errorf(codes.Internal, "lookup failed: %v", err)

For field-level validation errors, attach errdetails.BadRequest via status.WithDetails.

Streaming

Pattern Use Case
Server streaming Server sends a sequence (log tailing, result sets)
Client streaming Client sends a sequence, server responds once (file upload, batch)
Bidirectional Both send independently (chat, real-time sync)

Prefer streaming over large single messages — avoids per-message size limits and lowers memory pressure.

func (s *server) ListUsers(req *pb.ListUsersRequest, stream pb.UserService_ListUsersServer) error {
    for _, u := range users {
        if err := stream.Send(u); err != nil {
            return err
        }
    }
    return nil
}

Testing

Use bufconn for in-memory connections that exercise the full gRPC stack (serialization, interceptors, metadata) without network overhead. Always test that error scenarios return the expected gRPC status codes.

Testing patterns and examples

Security

  • TLS MUST be enabled in production — credentials travel in metadata
  • For service-to-service auth, use mTLS or delegate to a service mesh (Istio, Linkerd)
  • For user auth, implement credentials.PerRPCCredentials and validate tokens in an auth interceptor
  • Reflection SHOULD be disabled in production to prevent API discovery

Performance

Setting Purpose Typical Value
keepalive.ServerParameters.Time Ping interval for idle connections 30s
keepalive.ServerParameters.Timeout Ping ack timeout 10s
grpc.MaxRecvMsgSize Override 4 MB default for large payloads 16 MB
Connection pooling Multiple conns for high-load streaming 4 connections

Most services do not need connection pooling — profile before adding complexity.

Common Mistakes

Mistake Fix
Returning raw error Becomes codes.Unknown — client can't decide whether to retry. Use status.Errorf with a specific code
No deadline on client calls Slow upstream hangs indefinitely. Always context.WithTimeout
New connection per request Wastes TCP/TLS handshakes. Create once, reuse — HTTP/2 multiplexes RPCs
Reflection enabled in production Lets attackers enumerate every method. Enable only in dev/staging
codes.Internal for all errors Wrong codes break client retry logic. Unavailable triggers retry; InvalidArgument does not
Bare types as RPC arguments Can't add fields to string. Wrapper messages allow backwards-compatible evolution
Missing health check service Kubernetes can't determine readiness, kills pods during deployments
Ignoring context cancellation Long operations continue after caller gave up. Check ctx.Err()

Cross-References

  • → See samber/cc-skills-golang@golang-context skill for deadline and cancellation patterns
  • → See samber/cc-skills-golang@golang-error-handling skill for gRPC error to Go error mapping
  • → See samber/cc-skills-golang@golang-observability skill for gRPC interceptors (logging, tracing, metrics)
  • → See samber/cc-skills-golang@golang-testing skill for gRPC testing with bufconn
安全使用建议
This skill appears to be a documentation / code-guidance pack for Go gRPC and is internally consistent. Before enabling or letting an agent run it: 1) confirm you trust the agent to edit repository files (the skill allows read/write privileges to project code); 2) be aware the install step will run brew install protobuf (protoc) if the platform performs installs — ensure brew is acceptable on your system; 3) review any automated code changes suggested by the agent (and run tests) before merging; and 4) if you need the skill to not run autonomously, disable or restrict agent access because autonomous invocation is allowed by default. If you want extra assurance, request the skill author/source or run it in an isolated environment first.
功能分析
Type: OpenClaw Skill Name: golang-grpc Version: 1.1.3 The skill bundle provides comprehensive and industry-standard best practices for Go gRPC development, covering server/client implementation, error handling, and testing. The instructions in SKILL.md and the evaluation cases in evals.json are strictly aligned with the stated purpose, and the tool permissions are appropriately restricted to relevant development utilities (e.g., go, protoc, git).
能力评估
Purpose & Capability
Name/description (gRPC best practices) align with the declared requirements: go and protoc are sensible prerequisites and the install uses the well-known Homebrew 'protobuf' formula to provide protoc. No unrelated binaries, env vars, or config paths are requested.
Instruction Scope
SKILL.md contains guidance, examples, and references limited to designing, implementing, reviewing, and testing Go gRPC services. It does not instruct reading unrelated system files, harvesting credentials, or posting data to external endpoints. It does grant the agent permission to read/edit/write project files (expected for a coding assistant) — review any file changes before committing.
Install Mechanism
Install spec uses a known package manager (brew) and the official 'protobuf' formula to provide protoc. This is a low-risk, standard install; no arbitrary downloads or archive extraction are present.
Credentials
The skill requests no environment variables or credentials. The lack of secret requirements is proportionate to a documentation/style-guide skill.
Persistence & Privilege
always is false and the skill does not request elevated or persistent system privileges. Model invocation is allowed (the platform default) — combined with no broad credential access, this is reasonable for a coding assistant. Note: the skill is marked user-invocable: false, meaning it is intended for autonomous agent use only.
如何使用
  1. 确保已安装 OpenClaw(本地或 Docker 部署)
  2. 在对话框中输入安装命令:/install golang-grpc
  3. 安装完成后,直接呼叫该 Skill 的名称或使用 /golang-grpc 触发
  4. 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
版本历史
v1.1.3
- Bumped version to 1.1.3 in metadata. - Corrected typo in documentation (“more informations” → “more information”). - Added AskUserQuestion tool to allowed-tools list.
v1.1.1
- Bump version to 1.1.1. - Added `evals/evals.json` file. - Minor metadata update in SKILL.md to reflect new version. No changes to core functionality or documentation content.
v0.1.0
Initial release of golang-grpc skill. - Provides comprehensive gRPC usage guidelines and production patterns for Go microservices. - Covers proto file organization, code generation tools, and best practices for server/client implementation. - Includes guidance on interceptors, error handling with codes, TLS/mTLS configuration, and bufconn-based testing. - Summarizes recommended streaming patterns, health checks, and performance/security considerations. - Suitable for both building new services and reviewing/auditing existing gRPC Go code.
元数据
Slug golang-grpc
版本 1.1.3
许可证 MIT-0
累计安装 0
当前安装数 0
历史版本数 3
常见问题

Golang Grpc 是什么?

Provides gRPC usage guidelines, protobuf organization, and production-ready patterns for Golang microservices. Use when implementing, reviewing, or debugging... 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 212 次。

如何安装 Golang Grpc?

在 OpenClaw 或 Claude Code 对话框中运行命令「/install golang-grpc」即可一键安装,无需额外配置。

Golang Grpc 是免费的吗?

是的,Golang Grpc 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。

Golang Grpc 支持哪些平台?

Golang Grpc 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。

谁开发了 Golang Grpc?

由 Samuel Berthe(@samber)开发并维护,当前版本 v1.1.3。

💬 留言讨论