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.
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~/grpclabmkdirgoclient
2. Execute the following command to initialize a new GO module for us:
cdgoclientgomodinitcse.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:
mkdircalculator#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:
Compile your program
Before compilation, we need to get some packages for GO:
Now we can compile our GO code into binary main:
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.
Launch the CalculatorServer in the background:
Launch the goclient:
You should see the following output from goclient:
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)
}
go get github.com/golang/protobuf/proto
go get golang.org/x/net/context
go get google.golang.org/grpc