http 示例
最后更新于:2022-04-02 02:40:59
[TOC]
## 概述
## 案例
### http
```
package main
import (
"errors"
"fmt"
"log"
"net/http"
"os"
"github.com/afex/hystrix-go/hystrix"
)
const commandName = "producer_api"
func main() {
hystrix.ConfigureCommand(commandName, hystrix.CommandConfig{
Timeout: 500,
MaxConcurrentRequests: 9,
ErrorPercentThreshold: 50,
RequestVolumeThreshold: 3,
SleepWindow: 1000,
})
http.HandleFunc("/", logger(handle))
log.Println("listening on :8080")
http.ListenAndServe(":8080", nil)
}
func handle(w http.ResponseWriter, r *http.Request) {
output := make(chan bool, 1)
errors := hystrix.Go(commandName, func() error {
// 像其他服务请求
err := callChargeProducerAPI()
// 重试
//err := callWithRetryV1()
if err == nil {
output <- true
}
return err
}, nil)
select {
case out := <-output:
// success
log.Printf("success %v", out)
case err := <-errors:
// failure
log.Printf("failed %s", err)
}
}
// logger is Handler wrapper function for logging
func logger(fn http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
log.Println(r.URL.Path, r.Method)
fn(w, r)
}
}
func callChargeProducerAPI() error {
fmt.Println(os.Getenv("SERVER_ERROR"))
// 设置为 server_error 则表示请求失败
if os.Getenv("SERVER_ERROR") == "1" {
return errors.New("503 error")
}
return nil
}
func callWithRetryV1() (err error) {
for index := 0; index < 3; index++ {
// call producer API
err := callChargeProducerAPI()
if err != nil {
return err
}
}
return
}
';