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

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
}


References

ReferenceURL
Introduction to gRPChttps://grpc.io/docs/what-is-grpc/introduction/
GrpcUIhttps://github.com/fullstorydev/grpcui