gRPC is designed to work across different languages and platforms. In this section, we will write a client in GO and invoke the CalculatorServer which we have implemented in Java.
Learning GO
To learning the basic of GO, you can go through the tutorial below.
Initialize our GO project with GO module
We use GO module to manage our GO client code and library dependency.
Create a folder goclient in our workspace to store all of our GO code:
cd ~/grpclab
mkdir goclient
2. Execute the following command to initialize a new GO module for us:
cd goclient
go mod init cse.cslab/goclient
Generate the client stub for GO by using .proto
We reuse our calculator.proto to generate the client stub for our GO client by using protobuf compiler, protoc. Execute the following commands:
mkdir calculator
#protoc [target .proto]
# -I [the directory of .proto]
# --go_out=plugins=grpc:[destination of the generated code]
protoc ../src/main/proto/calculator.proto \
-I ../src/main/proto \
--go_out=plugins=grpc:./calculator
You will see calculator/calculator.pb.go is generated.
Write your GO simple client
Now we write the main for our GO client:
nano main.go
package main
import (
"context"
"fmt"
"cse.cslab/goclient/calculator"
"google.golang.org/grpc"
"os"
)
func main() {
//Create a grpc connection to `CalculatorServer`
conn, err := grpc.Dial("127.0.0.1:8980", grpc.WithInsecure(), grpc.WithBlock())
if err != nil{
println("Can't create connection to server !!");
os.Exit(-1)
}
//Create a stub of Calculator service for invoking the method of Calculator service later on
client := calculator.NewCalculatorClient(conn)
// Calculate "1 + 1" by calling the CalculatorService
var a float32 = 1.0
var b float32 = 1.0
//Create the `CalculationRequest` object and set the value of `a` and `b`
requestObj := calculator.CalculationRequest{A:a, B:b}
//Invoking the `sum` function of `CalculatorService` through the stub
respondObj, err := client.Sum(context.Background(), &requestObj)
fmt.Printf("GoClient: The result of %f + %f = %f \n", a, b, respondObj.Result)
// Calculate "3 x 2" by calling the CalculatorService
a = 3.0
b = 2.0
requestObj = calculator.CalculationRequest{A:a, B:b}
respondObj, err = client.Product(context.Background(), &requestObj)
fmt.Printf("GoClient: The result of %f x %f = %f \n", a, b, respondObj.Result)
}
Compile your program
Before compilation, we need to get some packages for GO:
go get github.com/golang/protobuf/proto
go get golang.org/x/net/context
go get google.golang.org/grpc
Now we can compile our GO code into binary main:
go build -o goclient
You will see that an executable file goclient is generated under your workspace.
Test your GO Client
Now we have the CalculatorServer and goclient. We can test our programs.