Golang gRPC Context

golang, grpc, context

When we need to pass metadata between services the gRPC metadata package can be used pass key-value pairs in the context.

import "google.golang.org/grpc/metadata"

We can add key-value pairs of metadata to the request context:

func main() {
  // gRPC client and connection
  // ...

  // new request context
  ctx := context.Background()

  // add key-value pairs of metadata to context
  ctx = metadata.NewContext(
    ctx,
    metadata.Pairs("key1", "val1", "key2", "val2"),
  )

  // send request w/ context
  reply, err := client.Say(ctx, &pb.Greeting{
    Message: "Yoo dawg!",
  })

  // ...
}

Then when the request lands on the downstream service we can parse out the key-value pairs from the request context:

type demoServer struct {}

func (s *demoServer) Say(
  ctx context.Context,
  greeting *pb.Greeting,
) (*pb.Reply, error) {
  md, _ := metadata.FromContext(ctx)
  // context data
  // md["key1"] = "val1"
  // md["key2"] = "val2"
  // ...
}

func main() {
  s := new(demoServer)
  grpcServer := grpc.NewServer()
  pb.RegisterDemoServer(grpcServer, s)
  grpcServer.Serve(ln)
}