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 }