Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

170 řádky
5.9 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. // This file is for testing only. Runs a fake grpclb balancer server.
  19. // The name of the service to load balance for and the addresses
  20. // of that service are provided by command line flags.
  21. package main
  22. import (
  23. "flag"
  24. "net"
  25. "strconv"
  26. "strings"
  27. "time"
  28. "google.golang.org/grpc"
  29. lbpb "google.golang.org/grpc/balancer/grpclb/grpc_lb_v1"
  30. "google.golang.org/grpc/codes"
  31. "google.golang.org/grpc/credentials"
  32. "google.golang.org/grpc/credentials/alts"
  33. "google.golang.org/grpc/grpclog"
  34. "google.golang.org/grpc/status"
  35. "google.golang.org/grpc/testdata"
  36. )
  37. var (
  38. port = flag.Int("port", 10000, "Port to listen on.")
  39. backendAddrs = flag.String("backend_addrs", "", "Comma separated list of backend IP/port addresses.")
  40. useALTS = flag.Bool("use_alts", false, "Listen on ALTS credentials.")
  41. useTLS = flag.Bool("use_tls", false, "Listen on TLS credentials, using a test certificate.")
  42. shortStream = flag.Bool("short_stream", false, "End the balancer stream immediately after sending the first server list.")
  43. serviceName = flag.String("service_name", "UNSET", "Name of the service being load balanced for.")
  44. )
  45. type loadBalancerServer struct {
  46. serverListResponse *lbpb.LoadBalanceResponse
  47. }
  48. func (l *loadBalancerServer) BalanceLoad(stream lbpb.LoadBalancer_BalanceLoadServer) error {
  49. grpclog.Info("Begin handling new BalancerLoad request.")
  50. var lbReq *lbpb.LoadBalanceRequest
  51. var err error
  52. if lbReq, err = stream.Recv(); err != nil {
  53. grpclog.Errorf("Error receiving LoadBalanceRequest: %v", err)
  54. return err
  55. }
  56. grpclog.Info("LoadBalancerRequest received.")
  57. initialReq := lbReq.GetInitialRequest()
  58. if initialReq == nil {
  59. grpclog.Info("Expected first request to be an InitialRequest. Got: %v", lbReq)
  60. return status.Error(codes.Unknown, "First request not an InitialRequest")
  61. }
  62. // gRPC clients targeting foo.bar.com:443 can sometimes include the ":443" suffix in
  63. // their requested names; handle this case. TODO: make 443 configurable?
  64. var cleanedName string
  65. var requestedNamePortNumber string
  66. if cleanedName, requestedNamePortNumber, err = net.SplitHostPort(initialReq.Name); err != nil {
  67. cleanedName = initialReq.Name
  68. } else {
  69. if requestedNamePortNumber != "443" {
  70. grpclog.Info("Bad requested service name port number: %v.", requestedNamePortNumber)
  71. return status.Error(codes.Unknown, "Bad requested service name port number")
  72. }
  73. }
  74. if cleanedName != *serviceName {
  75. grpclog.Info("Expected requested service name: %v. Got: %v", *serviceName, initialReq.Name)
  76. return status.Error(codes.NotFound, "Bad requested service name")
  77. }
  78. if err := stream.Send(&lbpb.LoadBalanceResponse{
  79. LoadBalanceResponseType: &lbpb.LoadBalanceResponse_InitialResponse{
  80. InitialResponse: &lbpb.InitialLoadBalanceResponse{},
  81. },
  82. }); err != nil {
  83. grpclog.Errorf("Error sending initial LB response: %v", err)
  84. return status.Error(codes.Unknown, "Error sending initial response")
  85. }
  86. grpclog.Info("Send LoadBalanceResponse: %v", l.serverListResponse)
  87. if err := stream.Send(l.serverListResponse); err != nil {
  88. grpclog.Errorf("Error sending LB response: %v", err)
  89. return status.Error(codes.Unknown, "Error sending response")
  90. }
  91. if *shortStream {
  92. return nil
  93. }
  94. for {
  95. grpclog.Info("Send LoadBalanceResponse: %v", l.serverListResponse)
  96. if err := stream.Send(l.serverListResponse); err != nil {
  97. grpclog.Errorf("Error sending LB response: %v", err)
  98. return status.Error(codes.Unknown, "Error sending response")
  99. }
  100. time.Sleep(10 * time.Second)
  101. }
  102. }
  103. func main() {
  104. flag.Parse()
  105. var opts []grpc.ServerOption
  106. if *useTLS {
  107. certFile := testdata.Path("server1.pem")
  108. keyFile := testdata.Path("server1.key")
  109. creds, err := credentials.NewServerTLSFromFile(certFile, keyFile)
  110. if err != nil {
  111. grpclog.Fatalf("Failed to generate credentials %v", err)
  112. }
  113. opts = append(opts, grpc.Creds(creds))
  114. } else if *useALTS {
  115. altsOpts := alts.DefaultServerOptions()
  116. altsTC := alts.NewServerCreds(altsOpts)
  117. opts = append(opts, grpc.Creds(altsTC))
  118. }
  119. var serverList []*lbpb.Server
  120. if len(*backendAddrs) == 0 {
  121. serverList = make([]*lbpb.Server, 0)
  122. } else {
  123. rawBackendAddrs := strings.Split(*backendAddrs, ",")
  124. serverList = make([]*lbpb.Server, len(rawBackendAddrs))
  125. for i := range rawBackendAddrs {
  126. rawIP, rawPort, err := net.SplitHostPort(rawBackendAddrs[i])
  127. if err != nil {
  128. grpclog.Fatalf("Failed to parse --backend_addrs[%d]=%v, error: %v", i, rawBackendAddrs[i], err)
  129. }
  130. ip := net.ParseIP(rawIP)
  131. if ip == nil {
  132. grpclog.Fatalf("Failed to parse ip: %v", rawIP)
  133. }
  134. numericPort, err := strconv.Atoi(rawPort)
  135. if err != nil {
  136. grpclog.Fatalf("Failed to convert port %v to int", rawPort)
  137. }
  138. grpclog.Infof("Adding backend ip: %v, port: %d", ip.String(), numericPort)
  139. serverList[i] = &lbpb.Server{
  140. IpAddress: ip,
  141. Port: int32(numericPort),
  142. }
  143. }
  144. }
  145. serverListResponse := &lbpb.LoadBalanceResponse{
  146. LoadBalanceResponseType: &lbpb.LoadBalanceResponse_ServerList{
  147. ServerList: &lbpb.ServerList{
  148. Servers: serverList,
  149. },
  150. },
  151. }
  152. server := grpc.NewServer(opts...)
  153. grpclog.Infof("Begin listening on %d.", *port)
  154. lis, err := net.Listen("tcp", ":"+strconv.Itoa(*port))
  155. if err != nil {
  156. grpclog.Fatalf("Failed to listen on port %v: %v", *port, err)
  157. }
  158. lbpb.RegisterLoadBalancerServer(server, &loadBalancerServer{
  159. serverListResponse: serverListResponse,
  160. })
  161. server.Serve(lis)
  162. }