github.com/googlecloudplatform/kubernetes-workshops@v0.0.0-20180501174420-d8199445b2c3/bundles/kubernetes-101/workshop/app/monolith/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"log"
     7  	"net/http"
     8  	"os"
     9  	"os/signal"
    10  	"syscall"
    11  
    12  	"github.com/braintree/manners"
    13  	"github.com/GoogleCloudPlatform/kubernetes-workshops/bundles/kubernetes-101/workshop/app/handlers"
    14  	"github.com/GoogleCloudPlatform/kubernetes-workshops/bundles/kubernetes-101/workshop/app/health"
    15  	"github.com/GoogleCloudPlatform/kubernetes-workshops/bundles/kubernetes-101/workshop/app/user"
    16  )
    17  
    18  const version = "1.0.0"
    19  
    20  func main() {
    21  	var (
    22  		httpAddr   = flag.String("http", "0.0.0.0:80", "HTTP service address.")
    23  		healthAddr = flag.String("health", "0.0.0.0:81", "Health service address.")
    24  		secret     = flag.String("secret", "secret", "JWT signing secret.")
    25  	)
    26  	flag.Parse()
    27  
    28  	log.Println("Starting server...")
    29  	log.Printf("Health service listening on %s", *healthAddr)
    30  	log.Printf("HTTP service listening on %s", *httpAddr)
    31  
    32  	errChan := make(chan error, 10)
    33  
    34  	hmux := http.NewServeMux()
    35  	hmux.HandleFunc("/healthz", health.HealthzHandler)
    36  	hmux.HandleFunc("/readiness", health.ReadinessHandler)
    37  	hmux.HandleFunc("/healthz/status", health.HealthzStatusHandler)
    38  	hmux.HandleFunc("/readiness/status", health.ReadinessStatusHandler)
    39  	healthServer := manners.NewServer()
    40  	healthServer.Addr = *healthAddr
    41  	healthServer.Handler = handlers.LoggingHandler(hmux)
    42  
    43  	go func() {
    44  		errChan <- healthServer.ListenAndServe()
    45  	}()
    46  
    47  	mux := http.NewServeMux()
    48  	mux.HandleFunc("/", handlers.HelloHandler)
    49  	mux.Handle("/login", handlers.LoginHandler(*secret, user.DB))
    50  	mux.Handle("/secure", handlers.JWTAuthHandler(handlers.HelloHandler))
    51  	mux.Handle("/version", handlers.VersionHandler(version))
    52  
    53  	httpServer := manners.NewServer()
    54  	httpServer.Addr = *httpAddr
    55  	httpServer.Handler = handlers.LoggingHandler(mux)
    56  
    57  	go func() {
    58  		errChan <- httpServer.ListenAndServe()
    59  	}()
    60  
    61  	signalChan := make(chan os.Signal, 1)
    62  	signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
    63  
    64  	for {
    65  		select {
    66  		case err := <-errChan:
    67  			if err != nil {
    68  				log.Fatal(err)
    69  			}
    70  		case s := <-signalChan:
    71  			log.Println(fmt.Sprintf("Captured %v. Exiting...", s))
    72  			health.SetReadinessStatus(http.StatusServiceUnavailable)
    73  			httpServer.BlockingClose()
    74  			os.Exit(0)
    75  		}
    76  	}
    77  }