Overview
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.

GrpcUI
Install
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
}
References