You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

126 lines
3.3 KiB

  1. /*
  2. *
  3. * Copyright 2018 gRPC authors.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. */
  18. // Binary wait_for_ready is an example for "wait for ready".
  19. package main
  20. import (
  21. "context"
  22. "fmt"
  23. "log"
  24. "net"
  25. "sync"
  26. "time"
  27. "google.golang.org/grpc"
  28. "google.golang.org/grpc/codes"
  29. pb "google.golang.org/grpc/examples/features/proto/echo"
  30. "google.golang.org/grpc/status"
  31. )
  32. // server is used to implement EchoServer.
  33. type server struct{}
  34. func (s *server) UnaryEcho(ctx context.Context, req *pb.EchoRequest) (*pb.EchoResponse, error) {
  35. return &pb.EchoResponse{Message: req.Message}, nil
  36. }
  37. func (s *server) ServerStreamingEcho(req *pb.EchoRequest, stream pb.Echo_ServerStreamingEchoServer) error {
  38. return status.Error(codes.Unimplemented, "RPC unimplemented")
  39. }
  40. func (s *server) ClientStreamingEcho(stream pb.Echo_ClientStreamingEchoServer) error {
  41. return status.Error(codes.Unimplemented, "RPC unimplemented")
  42. }
  43. func (s *server) BidirectionalStreamingEcho(stream pb.Echo_BidirectionalStreamingEchoServer) error {
  44. return status.Error(codes.Unimplemented, "RPC unimplemented")
  45. }
  46. // serve starts listening with a 2 seconds delay.
  47. func serve() {
  48. lis, err := net.Listen("tcp", ":50053")
  49. if err != nil {
  50. log.Fatalf("failed to listen: %v", err)
  51. }
  52. s := grpc.NewServer()
  53. pb.RegisterEchoServer(s, &server{})
  54. if err := s.Serve(lis); err != nil {
  55. log.Fatalf("failed to serve: %v", err)
  56. }
  57. }
  58. func main() {
  59. conn, err := grpc.Dial("localhost:50053", grpc.WithInsecure())
  60. if err != nil {
  61. log.Fatalf("did not connect: %v", err)
  62. }
  63. defer conn.Close()
  64. c := pb.NewEchoClient(conn)
  65. var wg sync.WaitGroup
  66. wg.Add(3)
  67. // "Wait for ready" is not enabled, returns error with code "Unavailable".
  68. go func() {
  69. defer wg.Done()
  70. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  71. defer cancel()
  72. _, err := c.UnaryEcho(ctx, &pb.EchoRequest{Message: "Hi!"})
  73. got := status.Code(err)
  74. fmt.Printf("[1] wanted = %v, got = %v\n", codes.Unavailable, got)
  75. }()
  76. // "Wait for ready" is enabled, returns nil error.
  77. go func() {
  78. defer wg.Done()
  79. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  80. defer cancel()
  81. _, err := c.UnaryEcho(ctx, &pb.EchoRequest{Message: "Hi!"}, grpc.WaitForReady(true))
  82. got := status.Code(err)
  83. fmt.Printf("[2] wanted = %v, got = %v\n", codes.OK, got)
  84. }()
  85. // "Wait for ready" is enabled but exceeds the deadline before server starts listening,
  86. // returns error with code "DeadlineExceeded".
  87. go func() {
  88. defer wg.Done()
  89. ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
  90. defer cancel()
  91. _, err := c.UnaryEcho(ctx, &pb.EchoRequest{Message: "Hi!"}, grpc.WaitForReady(true))
  92. got := status.Code(err)
  93. fmt.Printf("[3] wanted = %v, got = %v\n", codes.DeadlineExceeded, got)
  94. }()
  95. time.Sleep(2 * time.Second)
  96. go serve()
  97. wg.Wait()
  98. }