You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
4.1 KiB
Go
120 lines
4.1 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"net"
|
|
"net/http"
|
|
_ "net/http/pprof"
|
|
|
|
"github.com/felixge/fgprof"
|
|
hellogrpcv1 "gitlab.com/insanitywholesale/go-grpc-microservice-template/grpc/v1"
|
|
hellogrpcv2 "gitlab.com/insanitywholesale/go-grpc-microservice-template/grpc/v2"
|
|
"gitlab.com/insanitywholesale/go-grpc-microservice-template/openapiv2"
|
|
pbv1 "gitlab.com/insanitywholesale/go-grpc-microservice-template/proto/v1"
|
|
pbv2 "gitlab.com/insanitywholesale/go-grpc-microservice-template/proto/v2"
|
|
"gitlab.com/insanitywholesale/go-grpc-microservice-template/rest"
|
|
"gitlab.com/insanitywholesale/go-grpc-microservice-template/utils"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/reflection"
|
|
)
|
|
|
|
// Function to set up and start the gRPC server
|
|
func createGRPCServer(listener net.Listener) *grpc.Server {
|
|
// Choose hellorepo v1
|
|
dbv1, err := utils.ChooseRepoV1()
|
|
if err != nil {
|
|
log.Fatal("Failed creating repository v1:", err)
|
|
}
|
|
// Choose hellorepo v2
|
|
dbv2, err := utils.ChooseRepoV2()
|
|
if err != nil {
|
|
log.Fatal("Failed creating repository v2:", err)
|
|
}
|
|
// Create gRPC server
|
|
grpcServer := grpc.NewServer()
|
|
// Register v1 HelloService gRPC server
|
|
pbv1.RegisterHelloServiceServer(grpcServer, hellogrpcv1.Server{DB: dbv1})
|
|
// Register v1 HelloService gRPC server
|
|
pbv2.RegisterHelloServiceServer(grpcServer, hellogrpcv2.Server{DB: dbv2})
|
|
// Enable reflection so the API can be discoverable by something like grpcurl
|
|
reflection.Register(grpcServer)
|
|
// Get port from listener and print it
|
|
port, err := utils.PortFromListener(listener)
|
|
if err != nil {
|
|
// Error is non-fatal because listener does not necesssarily include a port
|
|
log.Println("Failed getting gRPC port from listener:", err)
|
|
} else {
|
|
// Log the server starting as well as the port it is listening on
|
|
log.Println("gRPC server starting on port", port)
|
|
}
|
|
// Create the gRPC server
|
|
return grpcServer
|
|
}
|
|
|
|
// Function to set up and start the HTTP server
|
|
func createRESTServer(grpcPort string, listener net.Listener) *http.Server {
|
|
// Get port from listener and print it
|
|
port, err := utils.PortFromListener(listener)
|
|
if err != nil {
|
|
// Error is non-fatal because listener does not necesssarily include a port
|
|
log.Println("Failed getting REST port from listener:", err)
|
|
} else {
|
|
// Log the server starting as well as the port it is listening on
|
|
log.Println("REST server starting on port", port)
|
|
}
|
|
// Create the grpc-gateway / REST server
|
|
restHandler, err := rest.CreateGateway(grpcPort)
|
|
if err != nil {
|
|
log.Fatal("Failed creating grpc-gateway:", err)
|
|
}
|
|
docsHandlerv1, err := openapiv2.CreateDocsHandlerV1()
|
|
if err != nil {
|
|
log.Fatal("Failed creating docs handler v1:", err)
|
|
}
|
|
docsHandlerv2, err := openapiv2.CreateDocsHandlerV2()
|
|
if err != nil {
|
|
log.Fatal("Failed creating docs handler v2:", err)
|
|
}
|
|
|
|
// Create router
|
|
http.DefaultServeMux.Handle("/api/", restHandler)
|
|
http.DefaultServeMux.Handle("/api/v1/docs/", http.StripPrefix("/api/v1/docs/", docsHandlerv1))
|
|
http.DefaultServeMux.Handle("/api/v2/docs/", http.StripPrefix("/api/v2/docs/", docsHandlerv2))
|
|
http.DefaultServeMux.Handle("/debug/fgprof", fgprof.Handler())
|
|
|
|
//return &http.Server{Handler: http.DefaultServeMux}
|
|
return &http.Server{}
|
|
}
|
|
|
|
func main() {
|
|
// Set up the ports that the servers will listen on
|
|
grpcPort, restPort := utils.SetupPorts()
|
|
// Create listener based on grpc port
|
|
grpcListener, err := utils.ListenerFromPort(grpcPort)
|
|
if err != nil {
|
|
log.Fatalf("Creating gRPC listener failed: %v", err)
|
|
}
|
|
// Create listener based on rest port
|
|
restListener, err := utils.ListenerFromPort(restPort)
|
|
if err != nil {
|
|
log.Fatalf("Creating REST listener failed: %v", err)
|
|
}
|
|
// Create and start the gRPC API server
|
|
grpcServer := createGRPCServer(grpcListener)
|
|
go func() {
|
|
err := grpcServer.Serve(grpcListener)
|
|
if err != nil {
|
|
log.Fatal("Failed starting gRPC server: %w", err)
|
|
}
|
|
}()
|
|
// Create and start the REST API server
|
|
// colon is prepended because we are supposed to pass the entire endpoint
|
|
restServer := createRESTServer(":"+grpcPort, restListener)
|
|
defer func() {
|
|
err := restServer.Serve(restListener)
|
|
if err != nil {
|
|
log.Fatal("Failed starting HTTP server: %w", err)
|
|
}
|
|
}()
|
|
}
|