github.com/packtpublishing/learning-functional-programming-in-go@v0.0.0-20230130084745-8b849f6d58c4/Chapter05/02_decorator/main.go (about)

     1  package main
     2  
     3  import (
     4  	"crypto/tls"
     5  	"flag"
     6  	"fmt"
     7  	"io/ioutil"
     8  	"log"
     9  	"net/http"
    10  	"net/url"
    11  	"os"
    12  	"os/signal"
    13  	"time"
    14  	"easy_metrics"
    15  	. "decorator"
    16  )
    17  
    18  const  (
    19  	host = "127.0.0.1"
    20  	protocol = "http://"
    21  )
    22  var (
    23  	serverUrl string
    24  	proxyUrl string
    25  )
    26  
    27  func init() {
    28  	serverPort := 3000
    29  	proxyPort := 8080
    30  	flag.IntVar(&serverPort, "serverPort", serverPort, "Server Port")
    31  	flag.IntVar(&proxyPort, "proxyPort", proxyPort, "Server Port")
    32  	flag.Parse()
    33  	serverUrl = fmt.Sprintf("%s:%d", host, serverPort)
    34  	proxyUrl = fmt.Sprintf("%s:%d", host, proxyPort)
    35  }
    36  
    37  func main() {
    38  	InitLog("trace-log.txt",
    39  		ioutil.Discard, os.Stdout, os.Stderr)
    40  	Info.Printf("Metrics server listening on %s", serverUrl)
    41  	go func() {
    42  		log.Fatal(easy_metrics.Serve(serverUrl))
    43  	}()
    44  	time.Sleep(1 * time.Second)
    45  
    46  	req, err := http.NewRequest(http.MethodGet, protocol + serverUrl, nil)
    47  	if err != nil {
    48  		log.Fatalln(err)
    49  	}
    50  
    51  	Info.Printf("Proxy listening on %s", proxyUrl)
    52  	proxyURL, _ := url.Parse(proxyUrl)
    53  	tr := &http.Transport{
    54  		Proxy: http.ProxyURL(proxyURL),
    55  		TLSClientConfig: &tls.Config{
    56  			InsecureSkipVerify: true,
    57  		},
    58  	}
    59  	tr.TLSNextProto = make(map[string]func(string, *tls.Conn) http.RoundTripper)
    60  	proxyTimeoutClient := &http.Client{Transport: tr, Timeout: 1 * time.Second}
    61  
    62  	client := Decorate(proxyTimeoutClient,
    63  		Authorization("mysecretpassword"),
    64  		LoadBalancing(RoundRobin(0, "web01:3000", "web02:3000", "web03:3000")),
    65  		Logging(log.New(InfoHandler, "client: ", log.Ltime)),
    66  		FaultTolerance(2, time.Second),
    67  	)
    68  
    69  	job := &Job{
    70  		Client:       client,
    71  		Request:      req,
    72  		NumRequests:  10,
    73  		IntervalSecs: 10,
    74  	}
    75  
    76  	start := time.Now()
    77  	job.Run()
    78  	Info.Printf("\n>> It took %s", time.Since(start))
    79  
    80  	Info.Printf("metrics")
    81  	err = easy_metrics.DisplayResults(serverUrl)
    82  	if err != nil {
    83  		log.Fatalln(err)
    84  	}
    85  
    86  	Info.Printf("CTRL+C to exit")
    87  	c := make(chan os.Signal, 1)
    88  	signal.Notify(c, os.Interrupt)
    89  	<-c
    90  }