gitee.com/zhaochuninhefei/gmgo@v0.0.31-0.20240209061119-069254a02979/grpc/interop/xds/server/server.go (about)

     1  /*
     2   *
     3   * Copyright 2021 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  
    19  // Binary server is the server used for xDS interop tests.
    20  package main
    21  
    22  import (
    23  	"context"
    24  	"flag"
    25  	"fmt"
    26  	"log"
    27  	"net"
    28  	"os"
    29  
    30  	"gitee.com/zhaochuninhefei/gmgo/grpc"
    31  	"gitee.com/zhaochuninhefei/gmgo/grpc/admin"
    32  	"gitee.com/zhaochuninhefei/gmgo/grpc/credentials/insecure"
    33  	"gitee.com/zhaochuninhefei/gmgo/grpc/grpclog"
    34  	"gitee.com/zhaochuninhefei/gmgo/grpc/health"
    35  	"gitee.com/zhaochuninhefei/gmgo/grpc/metadata"
    36  	"gitee.com/zhaochuninhefei/gmgo/grpc/reflection"
    37  	"gitee.com/zhaochuninhefei/gmgo/grpc/xds"
    38  
    39  	xdscreds "gitee.com/zhaochuninhefei/gmgo/grpc/credentials/xds"
    40  	healthpb "gitee.com/zhaochuninhefei/gmgo/grpc/health/grpc_health_v1"
    41  	testgrpc "gitee.com/zhaochuninhefei/gmgo/grpc/interop/grpc_testing"
    42  	testpb "gitee.com/zhaochuninhefei/gmgo/grpc/interop/grpc_testing"
    43  )
    44  
    45  var (
    46  	port             = flag.Int("port", 8080, "Listening port for test service")
    47  	maintenancePort  = flag.Int("maintenance_port", 8081, "Listening port for maintenance services like health, reflection, channelz etc when -secure_mode is true. When -secure_mode is false, all these services will be registered on -port")
    48  	serverID         = flag.String("server_id", "go_server", "Server ID included in response")
    49  	secureMode       = flag.Bool("secure_mode", false, "If true, retrieve security configuration from the management server. Else, use insecure credentials.")
    50  	hostNameOverride = flag.String("host_name_override", "", "If set, use this as the hostname instead of the real hostname")
    51  
    52  	logger = grpclog.Component("interop")
    53  )
    54  
    55  func getHostname() string {
    56  	if *hostNameOverride != "" {
    57  		return *hostNameOverride
    58  	}
    59  	hostname, err := os.Hostname()
    60  	if err != nil {
    61  		log.Fatalf("failed to get hostname: %v", err)
    62  	}
    63  	return hostname
    64  }
    65  
    66  // testServiceImpl provides an implementation of the TestService defined in
    67  // grpc.testing package.
    68  type testServiceImpl struct {
    69  	testgrpc.UnimplementedTestServiceServer
    70  	hostname string
    71  	serverID string
    72  }
    73  
    74  func (s *testServiceImpl) EmptyCall(ctx context.Context, _ *testpb.Empty) (*testpb.Empty, error) {
    75  	_ = grpc.SetHeader(ctx, metadata.Pairs("hostname", s.hostname))
    76  	return &testpb.Empty{}, nil
    77  }
    78  
    79  //goland:noinspection GoUnusedParameter
    80  func (s *testServiceImpl) UnaryCall(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
    81  	_ = grpc.SetHeader(ctx, metadata.Pairs("hostname", s.hostname))
    82  	return &testpb.SimpleResponse{ServerId: s.serverID, Hostname: s.hostname}, nil
    83  }
    84  
    85  // xdsUpdateHealthServiceImpl provides an implementation of the
    86  // XdsUpdateHealthService defined in grpc.testing package.
    87  type xdsUpdateHealthServiceImpl struct {
    88  	testgrpc.UnimplementedXdsUpdateHealthServiceServer
    89  	healthServer *health.Server
    90  }
    91  
    92  func (x *xdsUpdateHealthServiceImpl) SetServing(_ context.Context, _ *testpb.Empty) (*testpb.Empty, error) {
    93  	x.healthServer.SetServingStatus("", healthpb.HealthCheckResponse_SERVING)
    94  	return &testpb.Empty{}, nil
    95  
    96  }
    97  
    98  func (x *xdsUpdateHealthServiceImpl) SetNotServing(_ context.Context, _ *testpb.Empty) (*testpb.Empty, error) {
    99  	x.healthServer.SetServingStatus("", healthpb.HealthCheckResponse_NOT_SERVING)
   100  	return &testpb.Empty{}, nil
   101  }
   102  
   103  func xdsServingModeCallback(addr net.Addr, args xds.ServingModeChangeArgs) {
   104  	logger.Infof("Serving mode for xDS server at %s changed to %s", addr.String(), args.Mode)
   105  	if args.Err != nil {
   106  		logger.Infof("ServingModeCallback returned error: %v", args.Err)
   107  	}
   108  }
   109  
   110  func main() {
   111  	flag.Parse()
   112  
   113  	if *secureMode && *port == *maintenancePort {
   114  		logger.Fatal("-port and -maintenance_port must be different when -secure_mode is set")
   115  	}
   116  
   117  	testService := &testServiceImpl{hostname: getHostname(), serverID: *serverID}
   118  	healthServer := health.NewServer()
   119  	updateHealthService := &xdsUpdateHealthServiceImpl{healthServer: healthServer}
   120  
   121  	// If -secure_mode is not set, expose all services on -port with a regular
   122  	// gRPC server.
   123  	if !*secureMode {
   124  		lis, err := net.Listen("tcp4", fmt.Sprintf(":%d", *port))
   125  		if err != nil {
   126  			logger.Fatalf("net.Listen(%s) failed: %v", fmt.Sprintf(":%d", *port), err)
   127  		}
   128  
   129  		server := grpc.NewServer()
   130  		testgrpc.RegisterTestServiceServer(server, testService)
   131  		healthServer.SetServingStatus("", healthpb.HealthCheckResponse_SERVING)
   132  		healthpb.RegisterHealthServer(server, healthServer)
   133  		testgrpc.RegisterXdsUpdateHealthServiceServer(server, updateHealthService)
   134  		reflection.Register(server)
   135  		cleanup, err := admin.Register(server)
   136  		if err != nil {
   137  			logger.Fatalf("Failed to register admin services: %v", err)
   138  		}
   139  		defer cleanup()
   140  		if err := server.Serve(lis); err != nil {
   141  			logger.Errorf("Serve() failed: %v", err)
   142  		}
   143  		return
   144  	}
   145  
   146  	// Create a listener on -port to expose the test service.
   147  	testLis, err := net.Listen("tcp4", fmt.Sprintf(":%d", *port))
   148  	if err != nil {
   149  		logger.Fatalf("net.Listen(%s) failed: %v", fmt.Sprintf(":%d", *port), err)
   150  	}
   151  
   152  	// Create server-side xDS credentials with a plaintext fallback.
   153  	creds, err := xdscreds.NewServerCredentials(xdscreds.ServerOptions{FallbackCreds: insecure.NewCredentials()})
   154  	if err != nil {
   155  		logger.Fatalf("Failed to create xDS credentials: %v", err)
   156  	}
   157  
   158  	// Create an xDS enabled gRPC server, register the test service
   159  	// implementation and start serving.
   160  	testServer := xds.NewGRPCServer(grpc.Creds(creds), xds.ServingModeCallback(xdsServingModeCallback))
   161  	testgrpc.RegisterTestServiceServer(testServer, testService)
   162  	go func() {
   163  		if err := testServer.Serve(testLis); err != nil {
   164  			logger.Errorf("test server Serve() failed: %v", err)
   165  		}
   166  	}()
   167  	defer testServer.Stop()
   168  
   169  	// Create a listener on -maintenance_port to expose other services.
   170  	maintenanceLis, err := net.Listen("tcp4", fmt.Sprintf(":%d", *maintenancePort))
   171  	if err != nil {
   172  		logger.Fatalf("net.Listen(%s) failed: %v", fmt.Sprintf(":%d", *maintenancePort), err)
   173  	}
   174  
   175  	// Create a regular gRPC server and register the maintenance services on
   176  	// it and start serving.
   177  	maintenanceServer := grpc.NewServer()
   178  	healthServer.SetServingStatus("", healthpb.HealthCheckResponse_SERVING)
   179  	healthpb.RegisterHealthServer(maintenanceServer, healthServer)
   180  	testgrpc.RegisterXdsUpdateHealthServiceServer(maintenanceServer, updateHealthService)
   181  	reflection.Register(maintenanceServer)
   182  	cleanup, err := admin.Register(maintenanceServer)
   183  	if err != nil {
   184  		logger.Fatalf("Failed to register admin services: %v", err)
   185  	}
   186  	defer cleanup()
   187  	if err := maintenanceServer.Serve(maintenanceLis); err != nil {
   188  		logger.Errorf("maintenance server Serve() failed: %v", err)
   189  	}
   190  }