Creating gRPC Servers

1. Creating Server Instance

Example: Basic server (Go)

srv := grpc.NewServer(
    grpc.MaxRecvMsgSize(8<<20),
    grpc.MaxSendMsgSize(8<<20),
)
OptionPurpose
grpc.Creds(tlsCreds)Enable TLS
grpc.UnaryInterceptor(...)Single unary interceptor
grpc.ChainUnaryInterceptor(...)Multiple interceptors
grpc.KeepaliveParams(...)Server keep-alive config

2. Registering Service Handlers

Example: Register implementation

type server struct { userv1.UnimplementedUserServiceServer }
func (s *server) GetUser(ctx context.Context, r *userv1.GetUserRequest) (*userv1.User, error) {
    return &userv1.User{Id: r.Id}, nil
}
userv1.RegisterUserServiceServer(srv, &server{})
PatternDetail
Embed Unimplemented*ServerForward compatible — new RPCs return Unimplemented
One impl per servicePointer receiver, no shared state without sync

3. Creating Network Listener

Example: TCP listener

lis, err := net.Listen("tcp", ":50051")
if err != nil { log.Fatal(err) }
AddressUse
:50051All interfaces
127.0.0.1:50051Localhost only
unix:///tmp/grpc.sockUnix domain socket

4. Starting Server

Example: Serve

if err := srv.Serve(lis); err != nil { log.Fatal(err) }
MethodBehavior
Serve(lis)Blocks until Stop() or fatal error
Stop()Immediate; cancels in-flight RPCs
GracefulStop()Drains active RPCs then stops

5. Implementing Graceful Shutdown

Example: Signal-driven shutdown

go func() { _ = srv.Serve(lis) }()
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
<-sig
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
done := make(chan struct{})
go func(){ srv.GracefulStop(); close(done) }()
select {
case <-done:
case <-ctx.Done(): srv.Stop()
}
StepPurpose
Catch SIGTERMKubernetes preStop signal
Drain timeoutBound shutdown time
Fallback to Stop()Force kill if drain exceeds

6. Handling Server Errors

SourceHandling
Bind failureFatal — exit non-zero
Handler panicRecovery interceptor → Internal
Stream errorReturn status from handler

7. Setting Server Options

OptionPurpose
MaxConcurrentStreamsPer-connection RPC cap
ConnectionTimeoutInitial handshake timeout
ReadBufferSize / WriteBufferSizeTune throughput
NumStreamWorkersWorker pool size

8. Configuring Max Message Size

DefaultValue
Server recv4 MB
Server sendUnlimited
Client recv4 MB
Client sendUnlimited
Warning: If a single message exceeds the cap, the RPC fails with ResourceExhausted. Use streaming for large payloads.

9. Setting Connection Timeout

OptionDetail
grpc.ConnectionTimeout(d)Max time for HTTP/2 handshake
Server keep-aliveSee section 28

10. Enabling Server Reflection

Example: Enable reflection (Go)

import "google.golang.org/grpc/reflection"
reflection.Register(srv)
PurposeDetail
Tool supportgrpcurl, Postman, Evans
ProductionDisable or gate behind auth

11. Using Multiple Listeners

ApproachDetail
cmuxMultiplex gRPC + HTTP on one port
Multiple Serve()Call once per listener in goroutines
Same serverOne grpc.Server can serve many listeners