func()

in server/internal/server/server.go [31:114]


func (s *Server) Serve(options Options) {
	logger := log.New(log.NewTextHandler(os.Stdout, nil).WithAttrs(logattrs.GetAttrs()))
	if options.JsonLog {
		logger = log.New(log.NewJSONHandler(os.Stdout, nil).WithAttrs(logattrs.GetAttrs()))
	}

	log.SetDefault(logger)

	s.Init(options)

	s.GrpcServer = grpc.NewServer(grpc.ChainUnaryInterceptor(
		interceptor.DefaultServerInterceptors(interceptor.GetServerInterceptorLogOptions(logger, logattrs.GetAttrs()))...,
	))
	pb.RegisterMyGreeterServer(s.GrpcServer, s)

	healthServer := health.NewServer()
	grpc_health_v1.RegisterHealthServer(s.GrpcServer, healthServer)

	healthServer.SetServingStatus("", grpc_health_v1.HealthCheckResponse_NOT_SERVING)

	grpcListener, err := net.Listen("tcp", fmt.Sprintf(":%d", options.Port))
	if err != nil {
		logger.Error("failed to listen: " + err.Error())
		os.Exit(1)
	}

	logger.Info(fmt.Sprintf("server listening at %s", grpcListener.Addr().String()))
	go func() {
		if err := s.GrpcServer.Serve(grpcListener); err != nil {
			logger.Error("failed to serve: " + err.Error())
			os.Exit(1)
		}
	}()

	healthServer.SetServingStatus("", grpc_health_v1.HealthCheckResponse_SERVING)

	s.GrpcPort = grpcListener.Addr().(*net.TCPAddr).Port

	serverAddress := grpcListener.Addr().String()

	conn, err := grpc.DialContext(
		context.Background(),
		serverAddress,
		grpc.WithInsecure(),
	)
	if err != nil {
		logger.Error("Failed to dial server: " + err.Error())
		os.Exit(1)
	}

	gwmux := runtime.NewServeMux(
		aksMiddlewareMetadata.NewMetadataMiddleware(common.HeaderToMetadata, common.MetadataToHeader)...,
	)
	err = pb.RegisterMyGreeterHandler(context.Background(), gwmux, conn)
	if err != nil {
		logger.Error("Failed to register gateway: " + err.Error())
		os.Exit(1)
	}

	httpListener, err := net.Listen("tcp", fmt.Sprintf(":%d", options.HTTPPort))
	if err != nil {
		logger.Error("failed to listen HTTP: " + err.Error())
		os.Exit(1)
	}

	s.GwServer = &http.Server{
		Handler:           gwmux,
		ReadHeaderTimeout: 10 * time.Second,
	}

	logger.Info("serving gRPC-Gateway on " + httpListener.Addr().String())

	go func() {
		if err := s.GwServer.Serve(httpListener); err != nil {
			if err != http.ErrServerClosed {
				logger.Error("failed to serve HTTP: " + err.Error())
				os.Exit(1)
			} else {
				logger.Info("HTTP server closed")
			}
		}
	}()
	s.HttpPort = httpListener.Addr().(*net.TCPAddr).Port
}