Last active
August 6, 2021 11:35
-
-
Save percybolmer/4abd933d5266accd8b9d1086a82572b3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func main() { | |
// We Generate a TLS grpc API | |
apiserver, err := GenerateTLSApi("cert/server.crt", "cert/server.key") | |
if err != nil { | |
log.Fatal(err) | |
} | |
// Start listening on a TCP Port | |
lis, err := net.Listen("tcp", "127.0.0.1:9990") | |
if err != nil { | |
log.Fatal(err) | |
} | |
// We need to tell the code WHAT TO do on each request, ie. The business logic. | |
// In GRPC cases, the Server is acutally just an Interface | |
// So we need a struct which fulfills the server interface | |
// see server.go | |
s := &Server{} | |
// Register the API server as a PingPong Server | |
// The register function is a generated piece by protoc. | |
pingpong.RegisterPingPongServer(apiserver, s) | |
// Start serving in a goroutine to not block | |
go func() { | |
log.Fatal(apiserver.Serve(lis)) | |
}() | |
// Wrap the GRPC Server in grpc-web and also host the UI | |
grpcWebServer := grpcweb.WrapServer(apiserver) | |
// Lets put the wrapped grpc server in our multiplexer struct so | |
// it can reach the grpc server in its handler | |
multiplex := grpcMultiplexer{ | |
grpcWebServer, | |
} | |
// We need a http router | |
r := http.NewServeMux() | |
// Load the static webpage with a http fileserver | |
webapp := http.FileServer(http.Dir("ui")) | |
// Host the Web Application at /, and wrap it in the GRPC Multiplexer | |
// This allows grpc requests to transfer over HTTP1. then be | |
// routed by the multiplexer | |
r.Handle("/", multiplex.Handler(webapp)) | |
// Create a HTTP server and bind the router to it, and set wanted address | |
srv := &http.Server{ | |
Handler: r, | |
Addr: "localhost:8080", | |
WriteTimeout: 15 * time.Second, | |
ReadTimeout: 15 * time.Second, | |
} | |
// Serve the webapp over TLS | |
log.Fatal(srv.ListenAndServeTLS("cert/server.crt", "cert/server.key")) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment