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())
}