diff --git a/examples/features/compression/README.md b/examples/features/compression/README.md new file mode 100644 index 000000000000..760b157176fa --- /dev/null +++ b/examples/features/compression/README.md @@ -0,0 +1,14 @@ +# Compression + +This example shows how clients can specify compression options when performing +RPCs, and how to install support for compressors on the server. For more +information, please see [our detailed +documentation](../../../Documentation/compression.md). + +``` +go run server/main.go +``` + +``` +go run client/main.go +``` diff --git a/examples/features/compression/client/main.go b/examples/features/compression/client/main.go new file mode 100644 index 000000000000..4375c5d7ef93 --- /dev/null +++ b/examples/features/compression/client/main.go @@ -0,0 +1,60 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Binary client is an example client. +package main + +import ( + "context" + "flag" + "fmt" + "log" + "time" + + "google.golang.org/grpc" + "google.golang.org/grpc/encoding/gzip" // Install the gzip compressor + pb "google.golang.org/grpc/examples/features/proto/echo" +) + +var addr = flag.String("addr", "localhost:50051", "the address to connect to") + +func main() { + flag.Parse() + + // Set up a connection to the server. + conn, err := grpc.Dial(*addr, grpc.WithInsecure()) + if err != nil { + log.Fatalf("did not connect: %v", err) + } + defer conn.Close() + + c := pb.NewEchoClient(conn) + + // Send the RPC compressed. If all RPCs on a client should be sent this + // way, use the DialOption: + // grpc.WithDefaultCallOptions(grpc.UseCompressor(gzip.Name)) + const msg = "compress" + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + res, err := c.UnaryEcho(ctx, &pb.EchoRequest{Message: msg}, grpc.UseCompressor(gzip.Name)) + fmt.Printf("UnaryEcho call returned %q, %v\n", res.GetMessage(), err) + if err != nil || res.GetMessage() != msg { + log.Fatalf("Message=%q, err=%v; want Message=%q, err=", res.GetMessage(), err, msg) + } + +} diff --git a/examples/features/compression/server/main.go b/examples/features/compression/server/main.go new file mode 100644 index 000000000000..f2862c07ad77 --- /dev/null +++ b/examples/features/compression/server/main.go @@ -0,0 +1,70 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Binary server is an example server. +package main + +import ( + "context" + "flag" + "fmt" + "log" + "net" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + pb "google.golang.org/grpc/examples/features/proto/echo" + "google.golang.org/grpc/status" + + _ "google.golang.org/grpc/encoding/gzip" // Install the gzip compressor +) + +var port = flag.Int("port", 50051, "the port to serve on") + +type server struct{} + +func (s *server) UnaryEcho(ctx context.Context, in *pb.EchoRequest) (*pb.EchoResponse, error) { + fmt.Printf("UnaryEcho called with message %q\n", in.GetMessage()) + return &pb.EchoResponse{Message: in.Message}, nil +} + +func (s *server) ServerStreamingEcho(in *pb.EchoRequest, stream pb.Echo_ServerStreamingEchoServer) error { + return status.Error(codes.Unimplemented, "not implemented") +} + +func (s *server) ClientStreamingEcho(stream pb.Echo_ClientStreamingEchoServer) error { + return status.Error(codes.Unimplemented, "not implemented") +} + +func (s *server) BidirectionalStreamingEcho(stream pb.Echo_BidirectionalStreamingEchoServer) error { + return status.Error(codes.Unimplemented, "not implemented") +} + +func main() { + flag.Parse() + + lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port)) + if err != nil { + log.Fatalf("failed to listen: %v", err) + } + fmt.Printf("server listening at %v\n", lis.Addr()) + + s := grpc.NewServer() + pb.RegisterEchoServer(s, &server{}) + s.Serve(lis) +}