To set a timeout for each gRPC call and add metadata to the client, you can use the context.WithTimeout function and the metadata.NewOutgoingContext function in combination.
Here’s an example:
import (
"context"
"time"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
)
func main() {
// create a connection to the gRPC server
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
// handle error
}
defer conn.Close()
// create a new gRPC client with the connection
client := mypb.NewMyServiceClient(conn)
// set a timeout for each gRPC call
ctxTimeout, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
// add metadata to the client
md := metadata.Pairs(
"authorization", "Bearer mytoken",
"request-id", "12345",
)
ctxMetadata := metadata.NewOutgoingContext(ctxTimeout, md)
// make a gRPC call with the timeout and metadata
resp, err := client.MyMethod(ctxMetadata, &mypb.MyRequest{})
if err != nil {
// handle error
}
// process response
}
In this example, we create a new gRPC client with a connection to the server. We then set a timeout of 5 seconds for each gRPC call using context.WithTimeout. We also add metadata to the client using metadata.NewOutgoingContext, which takes the timeout context as its first argument and the metadata as its second argument.
Finally, we make a gRPC call to a hypothetical MyMethod method on the server, passing in the metadata context as well as a request message. If there is an error, we handle it appropriately. If the call is successful, we process the response as needed.




