gRPC is a modern open source high performance Remote Procedure Call (RPC) framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authentication. It is also applicable in last mile of distributed computing to connect devices, mobile applications and browsers to backend services.

Install
brew install grpcui |
Run against server
grpcui -plaintext 127.0.0.1:50051 |
Sample Code
package main
import (
"context"
"flag"
"fmt"
"log"
"net"
"os"
"time"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/examples/helloworld/helloworld"
"google.golang.org/grpc/reflection"
)
const defaultAddress = "127.0.0.1:50051"
type greeterServer struct {
helloworld.UnimplementedGreeterServer
}
func (greeterServer) SayHello(_ context.Context, req *helloworld.HelloRequest) (*helloworld.HelloReply, error) {
name := req.GetName()
if name == "" {
name = "friend"
}
return &helloworld.HelloReply{
Message: fmt.Sprintf("Hello, %s!", name),
}, nil
}
func main() {
mode := flag.String("mode", "server", "server or client")
addr := flag.String("addr", defaultAddress, "address to listen on or connect to")
name := flag.String("name", "gRPC", "name to send in client mode")
flag.Parse()
logger := log.New(os.Stderr, "grpc-sample: ", log.LstdFlags)
switch *mode {
case "server":
if err := runServer(*addr, logger); err != nil {
logger.Fatal(err)
}
case "client":
if err := runClient(*addr, *name, logger); err != nil {
logger.Fatal(err)
}
default:
logger.Fatalf("unsupported mode %q, use server or client", *mode)
}
}
func runServer(addr string, logger *log.Logger) error {
lis, err := net.Listen("tcp", addr)
if err != nil {
return fmt.Errorf("listen on %s: %w", addr, err)
}
server := grpc.NewServer()
helloworld.RegisterGreeterServer(server, greeterServer{})
reflection.Register(server)
logger.Printf("server listening on %s with reflection enabled", addr)
return server.Serve(lis)
}
func runClient(addr, name string, logger *log.Logger) error {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
conn, err := grpc.DialContext(
ctx,
addr,
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithBlock(),
)
if err != nil {
return fmt.Errorf("connect to %s: %w", addr, err)
}
defer conn.Close()
client := helloworld.NewGreeterClient(conn)
resp, err := client.SayHello(ctx, &helloworld.HelloRequest{Name: name})
if err != nil {
return fmt.Errorf("invoke SayHello: %w", err)
}
logger.Printf("response: %s", resp.GetMessage())
return nil
}
|
| Reference | URL |
|---|---|
| Introduction to gRPC | https://grpc.io/docs/what-is-grpc/introduction/ |
| GrpcUI | https://github.com/fullstorydev/grpcui |