Pārlūkot izejas kodu

wip:提交代理外部地址 未登录间隔处理

wangkaiyue 2 gadi atpakaļ
vecāks
revīzija
e0cb7e3a90

+ 29 - 1
core/proxy/broker/broker.go

@@ -8,6 +8,7 @@ import (
 	"github.com/gogf/gf/v2/os/gcfg"
 	"github.com/gogf/gf/v2/os/gctx"
 	"log"
+	"net/http"
 	"net/url"
 	"sync"
 )
@@ -26,8 +27,9 @@ func InitBroker() *broker {
 }
 
 type OutServerInterface interface {
-	Login() error                        //自动登录
+	AutoLogin() error                    //自动登录
 	RequestLogin(r *ghttp.Request) error //身份状态
+	CheckLoginOut(r *ghttp.Request) bool //状态是否过期
 }
 
 // AddNode 发现注册新节点
@@ -75,6 +77,14 @@ func (b *broker) RegisterOutServer(u *url.URL, outServer OutServerInterface) {
 	}
 }
 
+// UnLoginSetErr 挂载外部服务,当未登录时,通过处罚异常尝试重新加载
+func UnLoginSetErr(resp *http.Response) error {
+	if resp.StatusCode == 401 {
+		return fmt.Errorf("未登录异常")
+	}
+	return nil
+}
+
 // GetOutSeverAutoLogin 获取代理节点
 func (b *broker) GetOutSeverAutoLogin(address string, r *ghttp.Request) (serverUrl *url.URL, err error) {
 	serverUrl, err = url.Parse(address)
@@ -89,3 +99,21 @@ func (b *broker) GetOutSeverAutoLogin(address string, r *ghttp.Request) (serverU
 	err = server.RequestLogin(r)
 	return
 }
+
+// CheckOutSeverLoginOut 获取代理节点
+func (b *broker) CheckOutSeverLoginOut(address string, r *ghttp.Request) bool {
+	server, ok := b.outServer[address]
+	if !ok {
+		return true
+	}
+	return server.CheckLoginOut(r)
+}
+
+// OutSeverLoginIn 获取代理节点
+func (b *broker) OutSeverLoginIn(address string) error {
+	server, ok := b.outServer[address]
+	if !ok {
+		return fmt.Errorf("未知外部服务")
+	}
+	return server.AutoLogin()
+}

+ 12 - 8
core/proxy/broker/outServer/SussBi.go

@@ -22,19 +22,17 @@ func InitSussBi(address, user, password string) *sussBi {
 		PublicSuffixList: publicsuffix.List,
 	})
 	u, _ := url.Parse(address)
-	ss := &sussBi{
+	return &sussBi{
 		addr: address,
 		user: user,
 		Url:  u,
 		pwd:  password,
 		jar:  sussCookie,
 	}
-	ss.Login()
-	return ss
 }
 
-// Login 自动登录
-func (s *sussBi) Login() error {
+// AutoLogin 自动登录
+func (s *sussBi) AutoLogin() error {
 	client := &http.Client{
 		Jar: s.jar,
 	}
@@ -42,7 +40,7 @@ func (s *sussBi) Login() error {
 	if err != nil {
 		return err
 	}
-	if resp.StatusCode != 302 {
+	if !(resp.StatusCode == 302 || resp.StatusCode == 200) {
 		return fmt.Errorf("自动登录异常")
 	}
 	return nil
@@ -52,8 +50,14 @@ func (s *sussBi) Login() error {
 func (s *sussBi) RequestLogin(r *ghttp.Request) error {
 	if cookies := s.jar.Cookies(s.Url); len(cookies) > 0 {
 		r.Request.AddCookie(cookies[0])
-	} else {
-		return fmt.Errorf("装配登录身份异常")
 	}
 	return nil
 }
+
+// CheckLoginOut 检测登录状态是否过期
+func (s *sussBi) CheckLoginOut(r *ghttp.Request) bool {
+	if r.Response.Status == 401 {
+		return true
+	}
+	return false
+}

+ 4 - 4
core/proxy/proxyClient/proxyClient.go

@@ -13,16 +13,16 @@ import (
 
 var transport = &http.Transport{}
 
-func CreateCustomProxyClient(target *url.URL, errFunc func(http.ResponseWriter, *http.Request, error)) *httputil.ReverseProxy {
+func CreateCustomProxyClient(target *url.URL, errFunc func(http.ResponseWriter, *http.Request, error), change func(resp *http.Response) error) *httputil.ReverseProxy {
 	return &httputil.ReverseProxy{
 		Director: func(req *http.Request) {
 			req.URL.Scheme = target.Scheme
 			req.URL.Host = target.Host
 			req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path)
 		},
-		Transport: transport,
-		//ModifyResponse: change,
-		ErrorHandler: errFunc}
+		Transport:      transport,
+		ModifyResponse: change,
+		ErrorHandler:   errFunc}
 }
 
 func ReLoadClient() {

+ 12 - 12
core/proxy/proxyServer.go

@@ -13,7 +13,6 @@ import (
 	"github.com/gogf/gf/v2/net/ghttp"
 	"github.com/gogf/gf/v2/os/gcfg"
 	"github.com/gogf/gf/v2/os/gctx"
-	"log"
 	"net/http"
 	"net/url"
 )
@@ -76,9 +75,11 @@ var proxyHandler = func(r *ghttp.Request) {
 	for i := 0; i < errTryTime; i++ {
 		var proxyAddr *url.URL
 		var err error
+		var changeFunc func(resp *http.Response) error
 		if gCtx.RouterRule.IsOutServer {
 			//外部服务直接获取
 			proxyAddr, err = bManager.GetOutSeverAutoLogin(gCtx.RouterRule.MiddleCode, r)
+			changeFunc = broker.UnLoginSetErr //当未登录时,通过处罚异常尝试重新加载
 		} else {
 			// 从etcd注册的地址,根据负载规则获取服务地址
 			proxyAddr, err = bManager.GetServerAddr(gCtx.RouterRule.MiddleCode, r.GetClientIp())
@@ -103,19 +104,18 @@ var proxyHandler = func(r *ghttp.Request) {
 			}
 			g.Log().Error(r.Context(), "ErrorHandler ", err)
 		}
-		log.Println("xxxx", r.Request.Header.Get("Cookie"))
+
 		// 代理请求
-		proxyClient.CreateCustomProxyClient(proxyAddr, errHandel).ServeHTTP(r.Response.ResponseWriter, r.Request)
+		proxyClient.CreateCustomProxyClient(proxyAddr, errHandel, changeFunc).ServeHTTP(r.Response.ResponseWriter, r.Request)
+
+		if gCtx.RouterRule.IsOutServer { //检测外部服务登录状态是否过期
+			if bManager.CheckOutSeverLoginOut(gCtx.RouterRule.MiddleCode, r) || hasErr {
+				if err := bManager.OutSeverLoginIn(gCtx.RouterRule.MiddleCode); err != nil {
+					g.Log().Errorf(r.GetCtx(), "%s 外部服务自动登录异常 %v \n", gCtx.RouterRule.MiddleCode, err)
+				}
+			}
+		}
 
-		//if gCtx.RouterRule.IsOutServer {
-		//	if r.Response.Status == 401 {
-		//		hasErr = true
-		//		log.Println("do login Again")
-		//		r.Request.Header.Set("Cookie", "JSESSIONID=A4745CB36FA67EE15BA162033B0343F5")
-		//		r.Response.Flush()
-		//	}
-		//}
-		//log.Println("qqqqq", r.Request.RequestURI, r.Response.Status)
 		// 未捕获到请求,标识请求成功
 		if !hasErr {
 			return