Milan Pavlik 81b9ad4d13 [public-api-server] Simple gRPC server
Please enter the commit message for your changes. Lines starting
2022-04-13 15:08:26 +05:30

72 lines
1.5 KiB
Go

// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License-AGPL.txt in the project root for license information.
package main
import (
"fmt"
"net"
"net/http"
"os"
"os/signal"
"syscall"
"google.golang.org/grpc"
)
func main() {
errors := make(chan error)
defer close(errors)
go func() {
addr := ":9000"
fmt.Println("Serving HTTP", addr)
err := http.ListenAndServe(addr, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte(`hello world\n`))
}))
if err != nil {
fmt.Println("Failed to serve HTTP on", addr, err)
errors <- err
}
}()
go func() {
if err := serveGRPC(); err != nil {
fmt.Println("Failed to serve gRPC", err)
errors <- err
}
}()
// detect OS signals
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
select {
case err := <-errors:
fmt.Println("Encountered errors when running servers", err)
os.Exit(1)
case <-sigs:
fmt.Println("Received termination signal, shutting down.")
// TODO(milanpavlik): Graceful server shutdown
os.Exit(0)
}
}
func serveGRPC() error {
port := 9001
srv := grpc.NewServer()
listener, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
if err != nil {
return fmt.Errorf("failed to acquire port %d", port)
}
fmt.Println("Serving gRPC", listener.Addr().String())
if serveErr := srv.Serve(listener); err != nil {
return fmt.Errorf("failed to serve gRPC: %w", serveErr)
}
return nil
}