Writing Your First Microservice in Go with gRPC


Introduction
Microservices have become a standard architecture for building scalable applications. If you are new to microservices and Go, this guide will take you from zero to a working gRPC-based microservice. By the end, you will have a functional Go microservice that performs simple addition via gRPC.
Prerequisites
Before we start, ensure you have the following installed on your system:
Go (Download from Go Official Site)
Protocol Buffers (
protoc
) (Download from Protocol Buffers GitHub)Go plugins for Protobuf:
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
Step 1: Setting Up the Project
Create a project directory:
mkdir microservice-example cd microservice-example
Initialize a Go module:
go mod init github.com/yourusername/microservice-example
Step 2: Defining the gRPC API
Create a
proto/
directory:mkdir proto
Create
proto/adder.proto
and define the service:syntax = "proto3"; package proto; option go_package = "github.com/yourusername/microservice-example/proto"; service Adder { rpc Add (AddRequest) returns (AddResponse); } message AddRequest { int32 A = 1; int32 B = 2; } message AddResponse { int32 Result = 1; }
Step 3: Generating Go Code from Proto File
Run the following command to generate the necessary Go files:
protoc --go_out=. --go_opt=module=github.com/yourusername/microservice-example \
--go-grpc_out=. --go-grpc_opt=module=github.com/yourusername/microservice-example \
proto/adder.proto
This generates adder.pb.go
and adder_grpc.pb.go
in the proto/
directory.
Step 4: Implementing the gRPC Server
Create
server.go
and add the following code:package main import ( "context" "fmt" "log" "net" "google.golang.org/grpc" pb "github.com/yourusername/microservice-example/proto" ) type AdderServer struct { pb.UnimplementedAdderServer } func (s *AdderServer) Add(ctx context.Context, req *pb.AddRequest) (*pb.AddResponse, error) { result := req.A + req.B return &pb.AddResponse{Result: result}, nil } func main() { listener, err := net.Listen("tcp", ":50051") if err != nil { log.Fatalf("Failed to listen: %v", err) } server := grpc.NewServer() pb.RegisterAdderServer(server, &AdderServer{}) fmt.Println("gRPC Server is running on port 50051...") if err := server.Serve(listener); err != nil { log.Fatalf("Failed to serve: %v", err) } }
Step 5: Implementing the gRPC Client
Create
client.go
and add the following code:package main import ( "context" "fmt" "log" "google.golang.org/grpc" pb "github.com/yourusername/microservice-example/proto" ) func main() { conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure()) if err != nil { log.Fatalf("Could not connect: %v", err) } defer conn.Close() client := pb.NewAdderClient(conn) req := &pb.AddRequest{A: 5, B: 3} res, err := client.Add(context.Background(), req) if err != nil { log.Fatalf("Error calling Add: %v", err) } fmt.Printf("Sum: %d\n", res.Result) }
Step 6: Installing Dependencies
Ensure all dependencies are installed by running:
go mod tidy
go get google.golang.org/grpc
go get google.golang.org/protobuf
Step 7: Running the Microservice
Start the gRPC server:
go run server.go
Expected output:
gRPC Server is running on port 50051...
Run the client in a new terminal:
go run client.go
Expected output:
Sum: 8
Conclusion
If you found this guide useful, consider starring the project on GitHub: GitHub Repository. Your support helps improve and maintain this project!
Stay connected with me:
GitHub: https://github.com/satyxm
LinkedIn: https://www.linkedin.com/in/satyams-in/
Subscribe to my newsletter
Read articles from Satyam Singh directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Satyam Singh
Satyam Singh
wanted to write more than just code