hystrix-demo/demo.go

112 lines
2.3 KiB
Go

package main
import (
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
"time"
h "github.com/afex/hystrix-go/hystrix"
y "gopkg.in/yaml.v3"
)
var cmds = map[string]h.CommandConfig{
"defaults": {
Timeout: h.DefaultTimeout,
MaxConcurrentRequests: h.DefaultMaxConcurrent,
RequestVolumeThreshold: h.DefaultVolumeThreshold,
SleepWindow: h.DefaultSleepWindow,
ErrorPercentThreshold: h.DefaultErrorPercentThreshold,
},
"robots": {
Timeout: 100,
MaxConcurrentRequests: 1,
RequestVolumeThreshold: 1,
SleepWindow: 3000,
ErrorPercentThreshold: 1,
},
}
func robots() error {
res, err := http.Get("https://osinet.fr/robots.txt")
if err != nil {
return err
}
if res.StatusCode >= http.StatusBadRequest {
return fmt.Errorf("HTTP Error response: %s", res.Status)
}
b, err := io.ReadAll(res.Body)
if err != nil {
return err
}
fmt.Printf("%s\n", strings.Replace(string(b[0:20]), "\n", "\t", -1))
return nil
}
func robotsFB(e error) error {
ce, ok := e.(h.CircuitError)
if !ok {
return fmt.Errorf("unexpected error: %w", e)
}
switch ce.Message {
case "circuit open":
fmt.Println("FB Short-circuit")
case "timeout":
fmt.Println("FB Timeout response")
default:
log.Println("FB", e.Error())
}
return nil
}
func showCircuitSettings() {
e := y.NewEncoder(os.Stdout)
defer e.Close()
e.SetIndent(2)
fmt.Println(e.Encode(h.GetCircuitSettings()))
}
func showCircuit(name string) {
r, created, err := h.GetCircuit(name)
fmt.Printf("Name: %s, Created it: %t, error: %v\n", r.Name, created, err)
if err == nil {
fmt.Printf("IsOpen: %t, AllowRequest: %t", r.IsOpen(), r.AllowRequest())
}
}
func streamStats() {
sh := h.NewStreamHandler()
sh.Start()
http.Handle("/", sh)
err := http.ListenAndServe(":4000", nil)
fmt.Printf("L&S: %#v\n", err)
sh.Stop()
}
func main() {
h.SetLogger(log.Default())
h.Configure(cmds)
// showCircuit("robots")
// show(h.GetCircuitSettings())
go streamStats()
for i := 0; i < 30; i++ {
t0 := time.Now()
err := h.Do("robots", robots, robotsFB)
d := time.Since(t0)
if err != nil {
fmt.Printf("%2d in %v Error: %v\n", i, d, err)
} else {
fmt.Printf("%2d in %v OK\n", i, d)
}
time.Sleep(1000 * time.Millisecond)
// if i%10 == 0 {
// h.Flush()
// }
}
}