Fully Implemented gRPC-Gateway example in golang.
Run the following Commands to install the following packages into your $GOPATH
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger
go get -u github.com/golang/protobuf/protoc-gen-go
Then, To generate the client and proxy files, run:
./gen_grpc_stubs.sh
This should place generated file in your $GOPATH. Troubleshoot as required.
The way the entire world communicates is REST, with JSON. Google open-sourced gRPC in 2015, and it took the tech industry by storm. It goes perfectly hand in hand in microservice communication and with golang. Grpc-Gateway is an API to assist with the runtime translation of JSON into Protocol Buffers, the exchange format used by gRPC, and back. It generates a proxy attached to your microservice, which recieves the data and parses it into protobuf/json for you. It is a great tool to help companies adapt gRPC without rewriting their entire existing architecture, as well. It is a very powerful translation layer.
There are two golang files - main.go and service.go. main.go is the proxy itself that connects to the service running in service.go, where the server work is being done, and the request being handled.
To Build both programs, run:
go build main.go
go build service.go
This will generate 2 executables, main and service. Run service first with ./service because main connects to service. (ie the proxy connects to the service). This is crucial. After running ./service, run ./main, and the service as a whole should work.
If you have curl installed, run the command:
curl -d '{"val1":10, "val2":10, "operation_type" :"Multiplication"}' -H "Content-Type: application/json" -X POST http://localhost:8081/api/v1/perform_operation
Here, "val1" and "val2" are the arguments for the math evaluation, and the "operation_type" string specifies the calculation type. The endpoint itself was defined in example_service.proto. You should see a response(json) like:
{"response":"100","operation_valid":true}
The service is being implemented with gRPC, but we communicate with it using REST.
- Aditya Prerepa 2019.