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