Back to Go Zero

Example 01: Basic RPC Service

tools/goctl/rpc/example/01-basic/README.md

1.10.12.5 KB
Original Source

Example 01: Basic RPC Service

This is the simplest example of generating an RPC service with goctl.

Proto Definition

A single greeter.proto file with one service and one RPC method, no external imports.

The go_package uses a full module path:

protobuf
option go_package = "example.com/demo/greeter";

Generation Commands

Method 1: Quick Start with goctl rpc new

bash
# Create a complete RPC project with one command
goctl rpc new greeter

This generates the proto file and service code together:

greeter/
├── etc
│   └── greeter.yaml
├── greeter
│   ├── greeter.pb.go
│   └── greeter_grpc.pb.go
├── greeter.go
├── greeter.proto
├── greeterclient
│   └── greeter.go
└── internal
    ├── config
    │   └── config.go
    ├── logic
    │   └── pinglogic.go
    ├── server
    │   └── greeterserver.go
    └── svc
        └── servicecontext.go

Method 2: Generate from an Existing Proto

First, initialize the output directory with a go.mod:

bash
mkdir -p output && cd output && go mod init example.com/demo && cd ..

Then generate the code:

bash
goctl rpc protoc greeter.proto \
  --go_out=output \
  --go-grpc_out=output \
  --zrpc_out=output \
  --go_opt=module=example.com/demo \
  --go-grpc_opt=module=example.com/demo \
  --module=example.com/demo \
  -I .

Generated directory structure:

output/
├── etc
│   └── greeter.yaml
├── go.mod
├── greeter
│   ├── greeter.pb.go
│   └── greeter_grpc.pb.go
├── greeter.go
├── greeterclient
│   └── greeter.go
└── internal
    ├── config
    │   └── config.go
    ├── logic
    │   └── sayhellologic.go
    ├── server
    │   └── greeterserver.go
    └── svc
        └── servicecontext.go

Key Points

  • This is the simplest scenario: one proto file, one service, one RPC method.
  • The go_package uses a full module path (example.com/demo/greeter), not a relative path.
  • The --module flag tells goctl the Go module name; --go_opt=module=... and --go-grpc_opt=module=... tell protoc to strip the module prefix from output paths.
  • The --zrpc_out flag specifies where the goctl-generated service code goes.
  • The --go_out and --go-grpc_out flags specify where protoc-generated code goes.
  • Edit the logic file (internal/logic/sayhellologic.go) to implement your business logic.