github.com/l3x/learn-fp-go@v0.0.0-20171228022418-7639825d0b71/2-design-patterns/ch05-decoration/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 dec "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 dec.InitLog("trace-log.txt", 39 ioutil.Discard, os.Stdout, os.Stderr) 40 dec.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 dec.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 := dec.Decorate(proxyTimeoutClient, 63 dec.Authorization("mysecretpassword"), 64 dec.LoadBalancing(dec.RoundRobin(0, "web01:3000", "web02:3000", "web03:3000")), 65 dec.Logging(log.New(dec.InfoHandler, "client: ", log.Ltime)), 66 dec.FaultTolerance(2, time.Second), 67 ) 68 69 job := &dec.Job{ 70 Client: client, 71 Request: req, 72 NumRequests: 10, 73 IntervalSecs: 10, 74 } 75 76 start := time.Now() 77 job.Run() 78 dec.Info.Printf("\n>> It took %s", time.Since(start)) 79 80 dec.Info.Printf("metrics") 81 err = easy_metrics.DisplayResults(serverUrl) 82 if err != nil { 83 log.Fatalln(err) 84 } 85 86 dec.Info.Printf("CTRL+C to exit") 87 c := make(chan os.Signal, 1) 88 signal.Notify(c, os.Interrupt) 89 <-c 90 }