Protocol Buffers basics
syntax = "proto3";
package orders.v1;
service OrderService {
rpc GetOrder (GetOrderRequest) returns (Order);
rpc ListOrders (ListOrdersRequest) returns (stream Order); // server streaming
rpc CreateOrder (CreateOrderRequest) returns (Order);
}
message Order {
int64 id = 1;
string customer_id = 2;
double amount = 3;
OrderStatus status = 4;
}
enum OrderStatus {
ORDER_STATUS_UNSPECIFIED = 0;
ORDER_STATUS_PENDING = 1;
ORDER_STATUS_SHIPPED = 2;
}
Always set deadlines
Every gRPC call must have a deadline. Without one, a slow downstream can hold goroutines/threads indefinitely. Pass the deadline through the context on every hop.
Interceptors
Use interceptors for cross-cutting concerns: logging, metrics, authentication, and retry logic. Equivalent to middleware in HTTP frameworks.
Error model
Use Google's rich error model (google.rpc.Status) with error details. Map gRPC status codes to HTTP status codes at the gateway for REST clients.