Go + gRPC with Go kit
Building applications with Go can be sometimes intimidating especially when you’re just starting to learn it. Let alone transporting your APIs through gRPC. In this post, I will guide you on writing a simple Go microservice using gRPC with the help of Go kit.
What is Go kit? and why?
Go kit is the brain child of Peter Bourgon which he talked about during a FOSDEM and the Google Campus London meetup in 2015. As what he has envisioned, Go kit is a toolkit for building microservices in Go
It provides you a set of standard libraries (packages) that are considered essentials when building microservices so you can focus on what’s important, your application’s business logic. Here is a list of packages Go kit provides:
- Authentication (Basic/Casbin/JWT)
- Circuit Breaker (Hystrix/GoBreaker/HandyBreaker)
- Logging: Provides an interface for structured logging.
- Metrics: Provides an interface for service instrumentation. Has adapters for CloudWatch, Prometheus, Graphite, and more.
- Rate Limiting
- Service Discovery Utilities
- Tracing (OpenCensus, OpenTracing, Zipkin)
- Transport (HTTP/gRPC/ NATS/AWS Lambda, and more)
Other than being a toolkit, it also encourages good design principles for your application such as SOLID design principles, Domain-Driven Design (DDD), and Hexagonal architecture.
Go kit’s Concept
Go kit’s concept is based on three major components:
- Services
- Endpoints
- Transports
Services (Business Logic)
This is where the core business logic of your API is located. In Go kit, each service method are converted into an Endpoint.
Endpoints
An endpoint represents a single RPC method. Each Service method converts into an Endpoint to make RPC style communication between servers and clients.
Transports
In a microservice architecture, a microservice often communicate through transports such as HTTP or gRPC. A single endpoint can be exposed by multiple transports.
Let’s build our microservice
For our example microservice, we will build a very simple function that would get the sum of two numbers. Before we get started, make sure that you have Protocol buffer and Go plugins for the protocol compiler installed.
To give you an overview what our project structure would look like by the end of this article, you can refer to the directory tree below.
.
├── cmd
│ └── main.go # main entrypoint file
├── endpoints
│ └── endpoints.go # contains the endpoint definition
├── pb
│ ├── math.pb.go # our gRPC generated code
│ └── math.proto # our protobuf definitions
├── service
│ └── api.go # contains the service's core business logic
└── transports
└── grpc.go # contains the gRPC transport
Protobuf
First of, we would need to create our Protobuf file inside our pb
directory. Since you’re reading this, I would assume that you already know the basics of Protobuf; and the code snippet below should be pretty straightforward to understand 😄
Once we have our Protobuf file set, we would then need to generate our gRPC code using the following command.
protoc --go_out=plugins=grpc:. pb/math.proto
Service
Next up, we will create the core business logic of our microservice. So in service/api.go
, we would add our service definition by using the following code below.
Endpoint
From the code above for endpoints/endpoints.go
, we have the Endpoints
struct that serves as a helper struct to collect all of the endpoints into a single parameter.
The MathReq
and MathResp
simply defines the request parameters and response values for the Add
method.
makeAddEndpoint
func constructs our Add
endpoint wrapping the service.
And finally, MakeEndpoints
func returns a Endpoints
that wraps the provided server and wires in all of the expected endpoints.
Transport
In our code for transports/grpc.go
, we have NewGRPCServer
which makes a set of endpoints available as a gRPC MathServiceServer
.
Main entrypoint
This is where we stitch things together. Here we initiate our services, endpoints and our gRPC server, then we serve it using google.golang.org/grpc
Source Code
You can find the source code of this example at https://github.com/junereycasuga/gokit-grpc-demo