func main()

in t/grpc_server_example/main.go [250:346]


func main() {
	flag.Parse()

	go func() {
		lis, err := net.Listen("tcp", grpcAddr)
		if err != nil {
			log.Fatalf("failed to listen: %v", err)
		}
		s := grpc.NewServer()

		reflection.Register(s)
		pb.RegisterGreeterServer(s, &server{})
		pb.RegisterTestImportServer(s, &server{})
		pb.RegisterEchoServer(s, &server{})

		if err := s.Serve(lis); err != nil {
			log.Fatalf("failed to serve: %v", err)
		}
	}()

	go func() {
		lis, err := net.Listen("tcp", grpcsAddr)
		if err != nil {
			log.Fatalf("failed to listen: %v", err)
		}

		c, err := credentials.NewServerTLSFromFile(crtFilePath, keyFilePath)
		if err != nil {
			log.Fatalf("credentials.NewServerTLSFromFile err: %v", err)
		}
		s := grpc.NewServer(grpc.Creds(c))
		reflection.Register(s)
		pb.RegisterGreeterServer(s, &server{})
		if err := s.Serve(lis); err != nil {
			log.Fatalf("failed to serve: %v", err)
		}
	}()

	if grpcHTTPAddr != "" {
		go func() {
			lis, err := net.Listen("tcp", grpcHTTPAddr)
			if err != nil {
				log.Fatalf("failed to listen: %v", err)
			}
			s := grpc.NewServer()

			reflection.Register(s)
			pb.RegisterGreeterServer(s, &server{})
			pb.RegisterTestImportServer(s, &server{})

			if err := http.Serve(lis, gRPCAndHTTPFunc(s)); err != nil {
				log.Fatalf("failed to serve grpc: %v", err)
			}
		}()
	}

	if grpcsMtlsAddr != "" {
		go func() {
			lis, err := net.Listen("tcp", grpcsMtlsAddr)
			if err != nil {
				log.Fatalf("failed to listen: %v", err)
			}

			certificate, err := tls.LoadX509KeyPair(crtFilePath, keyFilePath)
			if err != nil {
				log.Fatalf("could not load server key pair: %s", err)
			}

			certPool := x509.NewCertPool()
			ca, err := os.ReadFile(caFilePath)
			if err != nil {
				log.Fatalf("could not read ca certificate: %s", err)
			}

			if ok := certPool.AppendCertsFromPEM(ca); !ok {
				log.Fatalf("failed to append client certs")
			}

			c := credentials.NewTLS(&tls.Config{
				ClientAuth:   tls.RequireAndVerifyClientCert,
				Certificates: []tls.Certificate{certificate},
				ClientCAs:    certPool,
			})
			s := grpc.NewServer(grpc.Creds(c))
			reflection.Register(s)
			pb.RegisterGreeterServer(s, &server{})
			if err := s.Serve(lis); err != nil {
				log.Fatalf("failed to serve: %v", err)
			}
		}()
	}

	signals := make(chan os.Signal)
	signal.Notify(signals, os.Interrupt, syscall.SIGTERM)
	sig := <-signals
	log.Printf("get signal %s, exit\n", sig.String())
}