Defining gRPC Services

1. Creating Service Definitions

ElementConvention
Service namePascalCase + Service suffix
Method namePascalCase verb-first: CreateUser, ListUsers
Request/ResponseMethodName + Request / + Response

2. Defining Unary RPCs

Example: Unary RPC

rpc GetUser(GetUserRequest) returns (GetUserResponse);
PropertyDetail
Pattern1 request → 1 response
UseDefault for CRUD-like ops

3. Defining Server Streaming RPCs

Example: Server stream

rpc ListEvents(ListEventsRequest) returns (stream Event);
Use CaseDetail
Large result setAvoid huge single response
Real-time feedPush updates as they happen

4. Defining Client Streaming RPCs

Example: Client stream

rpc UploadFile(stream FileChunk) returns (UploadResult);
Use CaseDetail
File uploadChunked transfer
Telemetry ingestBatch metrics

5. Defining Bidirectional Streaming RPCs

Example: Bidi stream

rpc Chat(stream ChatMessage) returns (stream ChatMessage);
Use CaseDetail
Chat / collaborationFull-duplex
Real-time pricingSubscribe + send updates

6. Using Request Messages

Best PracticeReason
Always use a dedicated request messageFuture-proof — can add fields
Avoid scalar parametersNot extensible
Include pagination fieldspage_size, page_token

7. Using Response Messages

Best PracticeReason
Dedicated response messageExtensibility
Include next_page_tokenPagination cursor
Avoid leaking server internalsStable contract

8. Defining Multiple Services

Example: Multiple services in one file

service UserService { rpc GetUser(...) returns (...); }
service AdminService { rpc DeleteUser(...) returns (...); }
TipDetail
Split by audiencePublic vs internal services
One service per fileEasier ownership & versioning

9. Using Custom Method Options

OptionUse
(google.api.http)REST mapping
idempotency_levelEnables safe retries
Custom auth tagsDrive interceptor behavior

10. Defining Empty Request or Response

OptionTrade-off
google.protobuf.EmptyShortest, but cannot evolve
Custom empty messageRecommended — extensible later