From 14c12ad630f5f94f99892ff62bd3fcecda1e3ffa Mon Sep 17 00:00:00 2001 From: qydysky Date: Sun, 10 Mar 2024 13:26:06 +0800 Subject: [PATCH] 1 --- README.md | 9 +++---- config.go | 72 +++++++++++++++++++++---------------------------------- http.go | 7 +++++- ws.go | 7 +++++- 4 files changed, 44 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index caa8acd..b6d1646 100755 --- a/README.md +++ b/README.md @@ -26,16 +26,17 @@ config: - path: string 路径 - splicing: int 当客户端支持cookie时,将会固定使用后端多少秒 - pathAdd: bool 将客户端访问的路径附加在path上 例:/api/req => /ws => /ws/api/req - - matcher 将会附加到每个backs前 + - dealer 将会附加到每个backs前 - backs: [] 后端, 可以动态增加/删除 - name: string 后端名称,将在日志中显示 - to: string 后端地址,例"s://www.baidu.com",会根据客户端自动添加http or ws在地址前 - weight: int 权重,按routes中的全部back的权重比分配,当权重变为0时,将停止新请求的进入 - - errBanSec: int 当后端错误时(指连接失败,不指后端错误响应),将会禁用若干秒 - - matcher + - dealer -matcher: +dealer: +- errToSec: int 当后端响应超过(ws则指初次返回时间)指定秒,将会触发errBanSec +- errBanSec: int 当后端错误时(指连接失败,不指后端错误响应),将会禁用若干秒 - reqHeader: [] 请求后端前,请求头处理器, 可以动态增加/删除 - action: string 可选access、deny、replace、add、del、set。 - key: string 具体处理哪个头 diff --git a/config.go b/config.go index 460538d..5c3c1af 100755 --- a/config.go +++ b/config.go @@ -93,11 +93,7 @@ func (t *Config) SwapSign(ctx context.Context, logger Logger) { var backIs []*Back if t, e := r.Cookie("_psign_" + cookie); e == nil { if backP, ok := route.backMap.Load(t.Value); ok && backP.(*Back).IsLive() && HeaderMatchs(backP.(*Back).ReqHeader, r) { - backP.(*Back).PathAdd = route.PathAdd - backP.(*Back).Splicing = route.Splicing - backP.(*Back).tmp.ReqHeader = append(route.ReqHeader, backP.(*Back).ReqHeader...) - backP.(*Back).tmp.ResHeader = append(route.ResHeader, backP.(*Back).ResHeader...) - backP.(*Back).tmp.ReqBody = append(route.ReqBody, backP.(*Back).ReqBody...) + backP.(*Back).cloneDealer() for i := 0; i < backP.(*Back).Weight; i++ { backIs = append(backIs, backP.(*Back)) } @@ -176,7 +172,7 @@ type Route struct { Splicing int `json:"splicing"` PathAdd bool `json:"pathAdd"` - Matcher + Dealer backMap sync.Map `json:"-"` Backs []Back `json:"backs"` @@ -208,42 +204,11 @@ func (t *Route) SwapSign(add func(string, *Back), del func(string, *Back), logge } } -// func (t *Route) GenBack() []*Back { -// var backLink []*Back -// for i := 0; i < len(t.Back); i++ { -// back := &t.Back[i] -// back.SwapSign() -// if back.Weight == 0 { -// continue -// } -// tmpBack := Back{ -// Name: back.Name, -// Splicing: t.Splicing, -// Sign: back.Sign, -// To: back.To, -// Weight: back.Weight, -// ErrBanSec: back.ErrBanSec, -// PathAdd: t.PathAdd, -// MatchHeader: append(t.MatchHeader, back.MatchHeader...), -// ReqHeader: append(t.ReqHeader, back.ReqHeader...), -// ResHeader: append(t.ResHeader, back.ResHeader...), -// } -// for i := 1; i <= back.Weight; i++ { -// backLink = append(backLink, &tmpBack) -// } -// } -// return backLink -// } - func (t *Route) FiliterBackByRequest(r *http.Request) []*Back { var backLink []*Back for i := 0; i < len(t.Backs); i++ { if t.Backs[i].IsLive() && HeaderMatchs(t.Backs[i].ReqHeader, r) { - t.Backs[i].PathAdd = t.PathAdd - t.Backs[i].Splicing = t.Splicing - t.Backs[i].tmp.ReqHeader = append(t.ReqHeader, t.Backs[i].ReqHeader...) - t.Backs[i].tmp.ResHeader = append(t.ResHeader, t.Backs[i].ResHeader...) - t.Backs[i].tmp.ReqBody = append(t.ReqBody, t.Backs[i].ReqBody...) + t.Backs[i].cloneDealer() for k := 0; k < t.Backs[i].Weight; k++ { backLink = append(backLink, &t.Backs[i]) } @@ -260,15 +225,30 @@ type Back struct { lock sync.RWMutex `json:"-"` upT time.Time `json:"-"` - Name string `json:"name"` - To string `json:"to"` - Weight int `json:"weight"` - ErrBanSec int `json:"errBanSec"` + Name string `json:"name"` + To string `json:"to"` + Weight int `json:"weight"` Splicing int `json:"-"` PathAdd bool `json:"-"` - Matcher - tmp Matcher `json:"-"` + Dealer + tmp Dealer `json:"-"` +} + +func (t *Back) cloneDealer() { + t.PathAdd = t.route.PathAdd + if t.route.Splicing != 0 { + t.Splicing = t.route.Splicing + } + if t.route.ErrBanSec != 0 { + t.ErrBanSec = t.route.ErrBanSec + } + if t.route.ErrToSec != 0 { + t.ErrToSec = t.route.ErrToSec + } + t.tmp.ReqHeader = append(t.route.ReqHeader, t.ReqHeader...) + t.tmp.ResHeader = append(t.route.ResHeader, t.ResHeader...) + t.tmp.ReqBody = append(t.route.ReqBody, t.ReqBody...) } func (t *Back) Id() string { @@ -311,7 +291,9 @@ func (t *Back) Disable() { t.upT = time.Now().Add(time.Second * time.Duration(t.ErrBanSec)) } -type Matcher struct { +type Dealer struct { + ErrToSec int `json:"errToSec"` + ErrBanSec int `json:"errBanSec"` ReqHeader []Header `json:"reqHeader"` ResHeader []Header `json:"resHeader"` ReqBody []Body `json:"reqBody"` diff --git a/http.go b/http.go index 51b1f58..0953217 100644 --- a/http.go +++ b/http.go @@ -66,7 +66,12 @@ func httpDealer(ctx context.Context, w http.ResponseWriter, r *http.Request, rou return errors.New("后端故障") } - logger.Debug(`T:`, fmt.Sprintf("%v > %v > %v http ok %v", chosenBack.route.config.Addr, routePath, chosenBack.Name, time.Since(opT))) + if chosenBack.ErrToSec != 0 && time.Since(opT).Seconds() > float64(chosenBack.ErrToSec) { + logger.Warn(`W:`, fmt.Sprintf("%v > %v > %v http 超时响应 %v", chosenBack.route.config.Addr, routePath, chosenBack.Name, time.Since(opT))) + chosenBack.Disable() + } else { + logger.Debug(`T:`, fmt.Sprintf("%v > %v > %v http ok %v", chosenBack.route.config.Addr, routePath, chosenBack.Name, time.Since(opT))) + } { cookie := &http.Cookie{ diff --git a/ws.go b/ws.go index 061269c..68ffb91 100644 --- a/ws.go +++ b/ws.go @@ -67,7 +67,12 @@ func wsDealer(ctx context.Context, w http.ResponseWriter, r *http.Request, route return errors.New("后端故障") } - logger.Debug(`T:`, fmt.Sprintf("%v > %v > %v ws ok %v", chosenBack.route.config.Addr, routePath, chosenBack.Name, time.Since(opT))) + if chosenBack.ErrToSec != 0 && time.Since(opT).Seconds() > float64(chosenBack.ErrToSec) { + logger.Warn(`W:`, fmt.Sprintf("%v > %v > %v ws 超时响应 %v", chosenBack.route.config.Addr, routePath, chosenBack.Name, time.Since(opT))) + chosenBack.Disable() + } else { + logger.Debug(`T:`, fmt.Sprintf("%v > %v > %v ws ok %v", chosenBack.route.config.Addr, routePath, chosenBack.Name, time.Since(opT))) + } { cookie := &http.Cookie{ -- 2.39.2