diff --git a/go.mod b/go.mod index 09b7df17b984864b53f974d2840ad2d95df4925c..a648948d3898f7f46266a7bfe162c15b7059378d 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,7 @@ require ( github.com/onsi/ginkgo v1.10.2 // indirect github.com/onsi/gomega v1.7.0 // indirect github.com/sirupsen/logrus v1.4.2 + github.com/spf13/cast v1.3.1 github.com/spf13/pflag v1.0.5 github.com/tealeg/xlsx v1.0.5 // indirect github.com/vulcand/oxy v1.0.0 diff --git a/go.sum b/go.sum index 57ebcd26c9a9ab09dac48a0afa49f1e36bef8427..43803b1af477d1254c20f3f8b5e8a7064671160f 100644 --- a/go.sum +++ b/go.sum @@ -143,6 +143,8 @@ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqn github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/src/dao/service_apply.go b/src/dao/service_apply.go index 40ca4e991b696e7603c16d12d7e9d9fda44c87b1..81d17827228781fc017b68ca3637cb4595b7f457 100644 --- a/src/dao/service_apply.go +++ b/src/dao/service_apply.go @@ -1,11 +1,11 @@ package dao type ServiceApply struct { - Id int `json:"id" xorm:"id"` - Service_id string `json:"service_id" xorm:"service_id"` - User_id int `json:"user_id" xorm:"user_id"` - Request_count int `json:"request_count" xorm:"request_count"` - ResFields string `json:"res_fields" xorm:"res_fields text"` + Id int `json:"id" xorm:"id"` + ServiceId string `json:"service_id" xorm:"service_id"` + UserId int `json:"user_id" xorm:"user_id"` + RequestCount int `json:"request_count" xorm:"request_count"` + ResFields string `json:"res_fields" xorm:"res_fields text"` } func (ServiceApply) TableName() string { diff --git a/src/dao/service_request_record.go b/src/dao/service_request_record.go index 08902654deb83de4addd3f882caaadcb618ef80d..115c98e07d5caf39d4f9856d406af03ee0268373 100644 --- a/src/dao/service_request_record.go +++ b/src/dao/service_request_record.go @@ -1,20 +1,26 @@ package dao -import "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/tools" +import ( + "time" +) -type Service_request_record struct { - Id int `json:"id" xorm:"id"` - Service_id int `json:"service_id" xorm:"service_id"` - Apply_id int `json:"apply_id" xorm:"apply_id"` - User_id string `json:"user_id" xorm:"user_id"` - Request_time tools.JsonTime `json:"request_time" xorm:"request_time created"` - Date_day int `json:"date_day" xorm:"date_day"` - Date_month int `json:"date_month" xorm:"date_month"` - Date_year int `json:"date_year" xorm:"date_year"` - Status int `json:"status" xorm:"status"` - Error string `json:"error" xorm:"error"` +type ServiceRequestRecord struct { + Id int64 `json:"id" xorm:"pk default nextval('service_request_record_id_pk'::regclass) autoincr BIGINT"` + ServiceId int64 `json:"service_id" xorm:"BIGINT"` + ApplyId int64 `json:"apply_id" xorm:"BIGINT"` + UserId string `json:"user_id" xorm:"VARCHAR(50)"` + RequestTime time.Time `json:"request_time" xorm:"DATETIME"` + DateDay int `json:"date_day" xorm:"SMALLINT"` + DateMonth int `json:"date_month" xorm:"SMALLINT"` + DateYear int `json:"date_year" xorm:"SMALLINT"` + Status int `json:"status" xorm:"SMALLINT"` + Error string `json:"error" xorm:"TEXT"` + ReqUrl string `json:"req_url" xorm:"VARCHAR"` + ApiId int64 `json:"api_id" xorm:"BIGINT"` + ApplyOid string `json:"apply_oid" xorm:"VARCHAR"` + ServiceOid string `json:"service_oid" xorm:"VARCHAR"` } -func (s Service_request_record) TableName() string { +func (s ServiceRequestRecord) TableName() string { return "service_request_record" } diff --git a/src/handler/proxyhandler.go b/src/handler/proxyhandler.go index 4616dc65dfebe0a93bf688f9f98851ff96af520a..a9c9d21e250e0b2f3441ab81bd7d9f6eedee73ee 100644 --- a/src/handler/proxyhandler.go +++ b/src/handler/proxyhandler.go @@ -14,7 +14,9 @@ import ( "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/service" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/tools" "io/ioutil" + "log" "net/http" + "net/url" "strconv" "strings" "time" @@ -32,106 +34,166 @@ func Proxy(c *gin.Context) { c.JSON(200, res) return } + apiId := c.Param("apiid") //获取服务相关信息 - proxyData, err := service.GetRealPath(applyId) + proxyData, err := service.GetRealPath(applyId, apiId) if err != nil { fmt.Println("err......", err.Error()) c.Error(err) return } - if proxyData.Second_level != 1 { + //proxyData.ReqUrl = "https://apaas3.wodcloud.com/iam/login/#/login" + if proxyData.SecondLevel != 1 { res := model.WebRes{} res.ErrMsg = `服务申请未通过审批,请联系组织管理员或超管审批` c.JSON(200, res) return } - roundTripper := http.DefaultTransport.(*http.Transport) - roundTripper.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} - f, _ := forward.New(forward.PassHostHeader(true), forward.RoundTripper(roundTripper), forward.ResponseModifier(func(resp *http.Response) error { - //Resp = resp - //判断是否超过调用次数是否可以调用 - callflag, sensitiveflag, err := service.QueryCallsCount(proxyData) - if err != nil { - fmt.Println("err......", err.Error()) - return nil - } - if callflag == false { - err = errors.New(`调用达到当日限定次数`) - Return(nil, err, resp) + + if proxyData.ServiceEndTime.Before(appT) { + res := model.WebRes{} + res.ErrMsg = `申请的服务已过期` + c.JSON(200, res) + return + } + + //判断是否超过调用次数是否可以调用 + callflag, _, err := service.QueryCallsCount(proxyData) + if err != nil { + fmt.Println("err......", err.Error(), "无法处理调用次数判断") + res := model.WebRes{} + res.ErrMsg = `无法处理您的请求` + c.JSON(200, res) + return + } + if callflag { + res := model.WebRes{} + res.ErrMsg = `已达到最大调用量` + c.JSON(200, res) + return + } + + //如果是静态文件 + if CheckStaticFile(c.Request.URL.Path) { + host := getHost(proxyData.ReqUrl) + //var prefix string + //if apiId == "" { + // prefix= fmt.Sprintf("%s/%s/service/%s/%s/", config.Prefix, config.MeshId,applyId,apiId) + //}else { + // prefix= fmt.Sprintf("%s/%s/service/%s/", config.Prefix, config.MeshId,applyId) + //} + // + //staticPath:= strings.ReplaceAll(c.Request.URL.Path,prefix,"") + + fwd, _ := forward.New(forward.PassHostHeader(false)) + c.Request.URL = testutils.ParseURI(fmt.Sprintf("%s%s", host, c.Request.URL.Path)) + c.Request.RequestURI = getRequestURI(c.Request) + c.Request.Host = host + fwd.ServeHTTP(c.Writer, c.Request) + } else { + roundTripper := http.DefaultTransport.(*http.Transport) + //roundTripper.ForceAttemptHTTP2 = false + roundTripper.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} + forwarder, err := forward.New(forward.PassHostHeader(false), forward.RoundTripper(roundTripper), forward.ResponseModifier(func(resp *http.Response) error { + respbody, err1 := ioutil.ReadAll(resp.Body) + if err1 != nil { + log.Println(err1) + return errors.New(`数据读取失败`) + } + var bytesNewBody []byte + //是否需要过滤字段 + if proxyData.DataServiceType1 == 5 && proxyData.ResFields != "" && proxyData.ResFields != "[]" { + //读取数据 + bytesNewBody = service.FiledFilter(proxyData, respbody) + } else { + bytesNewBody = respbody + } + //放回 + resp.Body = ioutil.NopCloser(bytes.NewBuffer(bytesNewBody)) + go func() { + defer func() { + err := recover() + if err != nil { + fmt.Println(err) + } + }() + //调用次数统计 + if err := service.CallCounts(proxyData); err != nil { + fmt.Println(err) + } + if resp.StatusCode < 400 { + service.RecordCall(proxyData, resp.StatusCode, nil) + } else { + service.RecordCall(proxyData, resp.StatusCode, nil) + } + }() + + //是否需要屏蔽敏感字段 仅对数据服务生效 其它服务部进行处理 + //if sensitiveflag && proxyData.DataServiceType1 == 5 { + // res = service.SensitiveFilter(proxyData, res) + //} + //计次 + //bgn := time.Now() + //fmt.Println(`开始携程:`, bgn) + //go service.CallCounts(proxyData) + //end := time.Since(bgn) + //fmt.Println("结束携程: ", end) + //err = service.CallCounts(proxyData) + //if err != nil { + // Return(nil, err, resp) + // return nil + //} + + ////个人申请调用计次 + //err = service.ApplyCallCounts(proxyData) + //if err != nil { + // Return(nil, err, resp) + // return nil + //} + //Return(res, nil, resp) + //appeT := time.Since(appT) + //fmt.Println("结束: ", appeT) return nil + })) + if err != nil { + c.JSON(500, errors.New("请求失败")) + return } - bT := time.Now() - fmt.Println(`开始获取数据:`, bT) - respbody, _ := ioutil.ReadAll(resp.Body) - var res interface{} - res = respbody - eT := time.Since(bT) - fmt.Println("获取数据: ", eT) - //是否需要过滤字段 - if proxyData.ResFields != "" { - bT := time.Now() - fmt.Println(`过滤:`, bT) - res = service.FiledFilter(proxyData, respbody) - eT := time.Since(bT) - fmt.Println("过滤: ", eT) - } - //是否需要屏蔽敏感字段 - if sensitiveflag == false { - res = service.SensitiveFilter(proxyData, res) + reqURL := testutils.ParseURI(proxyData.ReqUrl) + if reqURL.RawQuery == "" { + reqURL.RawQuery = c.Request.URL.RawQuery + } else { + if c.Request.URL.RawQuery != "" { + reqURL.RawQuery = "&" + c.Request.URL.RawQuery + } } - //计次 - //bgn := time.Now() - //fmt.Println(`开始携程:`, bgn) - go service.CallCounts(proxyData) - //end := time.Since(bgn) - //fmt.Println("结束携程: ", end) - //err = service.CallCounts(proxyData) - //if err != nil { - // Return(nil, err, resp) - // return nil - //} - ////个人申请调用计次 - //err = service.ApplyCallCounts(proxyData) - //if err != nil { - // Return(nil, err, resp) - // return nil - //} - Return(res, nil, resp) - //appeT := time.Since(appT) - //fmt.Println("结束: ", appeT) - return nil - })) - c.Request.URL = testutils.ParseURI(getProxyURL(proxyData, c.Request)) - fmt.Println("c.Request.URL-------", c.Request.URL) - c.Request.RequestURI = getRequestURI(c.Request) - fmt.Println("c.Request-------", c.Request) - c.Request.Host = getHost(proxyData.RealUrl) - fmt.Println("proxyData.RealUrl-------", proxyData.RealUrl) - f.ServeHTTP(c.Writer, c.Request) + c.Request.URL = reqURL + fmt.Println("c.Request.URL-------", c.Request.URL) + c.Request.RequestURI = reqURL.RequestURI() + fmt.Println("c.Request-------", c.Request) + c.Request.Host = getHost(proxyData.ReqUrl) + fmt.Println("proxyData.RealUrl-------", proxyData.ReqUrl) + forwarder.ServeHTTP(c.Writer, c.Request) + } + } -func getProxyURL(proxyData model.ProxyData, req *http.Request) string { - realPath := proxyData.RealUrl - rawQuery := req.URL.RawQuery - var result = "" - if rawQuery == "" { - if proxyData.Name == "时空服务" { - result = realPath + "?f=json" - } else { - result = realPath - } - } else { - result = realPath + "?" + rawQuery - if proxyData.Name == "时空服务" && !strings.Contains(rawQuery, "f=json") { - result = result + "&f=json" - } +func CheckStaticFile(path string) bool { + if strings.HasSuffix(path, ".css") || strings.HasSuffix(path, ".js") || strings.HasSuffix(path, ".woff2") || + strings.HasSuffix(path, ".jpg") || strings.HasSuffix(path, ".svg") || strings.HasSuffix(path, ".woff") || strings.HasSuffix(path, ".html") || strings.HasSuffix(path, ".ttf") { + return true } - return result + return false } func getRequestURI(req *http.Request) string { + + //requestURI, _ := url.ParseRequestURI(req.RequestURI) + // + //requestURI.RawQuery + path := req.URL.Path rawQuery := req.URL.RawQuery var result = "" @@ -175,20 +237,19 @@ func gzipCompress(content *[]byte) []byte { return compressData.Bytes() } -// 获取域名 -func getHost(url string) (path string) { - if strings.Contains(url, "//") { - path = strings.Split(url, "//")[1] - if strings.Contains(path, "/") { - path = strings.Split(path, "/")[0] - } +// 获取域名 protocol :// hostname[:port] / path / [;parameters][?query]#fragment +func getHost(httpurl string) (path string) { + parse, err := url.Parse(httpurl) + if err != nil { + return "" } - return + return fmt.Sprintf("%s://%s", parse.Scheme, parse.Host) } func HealthCheck(c *gin.Context) { res := model.WebRes{} - proxyData, err := service.GetReqPath() + apiId := c.Param("apiid") + proxyData, err := service.GetReqPath(apiId) if err != nil { res.Data = err.Error() c.JSON(500, res) diff --git a/src/main.go b/src/main.go index ff98f192841be63c53c18a5a442983f463df3e54..e178e307bc3e6df3af8727867b871907b838e5ad 100644 --- a/src/main.go +++ b/src/main.go @@ -18,11 +18,11 @@ import ( var ( argPort = pflag.Int("port", 8011, "") argPrefix = pflag.String("prefix", "/bgmesh/fiddler", "") - meshId = pflag.String("meshId", "149", "") - redisUrl = pflag.String("redisUrl", "redis://redis.apaas-v3:6379", "") + meshId = pflag.String("meshId", "461", "") + redisUrl = pflag.String("redisUrl", "redis://apaas-redis:6379", "") redisTag = pflag.String("redisTag", "apaas-mesh-proxy", "") confPath = pflag.String("confPath", "/app/config/proxy.json", "") - dbURL = pflag.String("dbURL", "host=stolon-proxy.devops port=5432 user=postgres password=spaceIN511 dbname=apaas sslmode=disable", "") + dbURL = pflag.String("dbURL", "host=apaas-postgis.apaas-v3 port=54321 user=postgres password=passwd123 dbname=apaas sslmode=disable", "") dbDriverName = pflag.String("dbDriverName", "postgres", "") ) @@ -33,6 +33,7 @@ func main() { server() } +//打包 func server() error { config.Prefix = *argPrefix handler := router.Load(ginrus.Ginrus(logrus.StandardLogger(), time.RFC3339, true)) diff --git a/src/model/response.go b/src/model/response.go index 468983ed840812bcf247bfd9b56925f0e0d98184..ad67acdfd6d1301518a3cf9c43110a7ab54bac11 100644 --- a/src/model/response.go +++ b/src/model/response.go @@ -1,17 +1,32 @@ package model +import "time" + type ProxyData struct { - RealUrl string `json:"req_url" xorm:"req_url"` - ResFields string `json:"res_fields" xorm:"res_fields text"` - Count int `json:"count" xorm:"count"` - Sensituve_word string `json:"sensituve_word" xorm:"sensituve_word"` - Sensitive_count int `json:"sensitive_count" xorm:"sensitive_count"` - Apply_id int `json:"apply_id" xorm:"apply_id"` - Service_id int `json:"service_id" xorm:"service_id"` - User_id string `json:"user_id" xorm:"user_id"` - Data_service_type1 int `json:"data_service_type1" xorm:"data_service_type1"` - Name string `json:"name"` - Second_level int `json:"second_level"xorm:"second_level"` + ApplyId int64 `json:"apply_id"` + ReqUrl string `json:"req_url"` + RequestCount int64 `json:"request_count"` + Duration int64 `json:"duration"` + DurationUnit int64 `json:"duration_unit"` + SpcsType int `json:"spcs_type"` + SpcsCount int64 `json:"spcs_count"` + ResFields string `json:"res_fields"` + DataServiceType1 int64 `json:"data_service_type1"` + DataServiceType2 int64 `json:"data_service_type2"` + DataServiceType3 int64 `json:"data_service_type3"` + SecondLevel int64 `json:"second_level"` + ServiceEndTime time.Time `json:"service_end_time"` + ReqName string `json:"req_name"` + ServiceState int64 `json:"service_state"` + PayStatus int64 `json:"pay_status"` + ApplyUserId string `json:"apply_user_id"` + ServiceUserId string `json:"service_user_id"` + ServiceOid string `json:"service_oid"` + ApplyOid string `json:"apply_oid"` + SensituveWord string `json:"sensituve_word"` + SensitiveCount int64 `json:"sensitive_count"` + ServiceId int64 `json:"service_id"` + ApiId int64 `json:"api_id"` //接口ID } type WebRes struct { diff --git a/src/router/router.go b/src/router/router.go index 61f498a3f821e0d1df13b0e022880b0ac61d862a..f746536de2a6b05bc77fb74cc1c0276d7757f2a4 100644 --- a/src/router/router.go +++ b/src/router/router.go @@ -32,8 +32,12 @@ func Load(middleware ...gin.HandlerFunc) http.Handler { e.Use(middleware...) root := e.Group(fmt.Sprintf("%s/%s", config.Prefix, config.MeshId)) { - root.GET("/health", handler.HealthCheck) - root.Any("/service/:applyId", handler.Proxy) + //root.GET("/health", handler.HealthCheck) + root.GET("/health/:apiid/*any", handler.HealthCheck) + //root.Any("/service/:applyId", handler.Proxy) + root.Any("/service/:applyId/:apiid", handler.Proxy) + root.Any("/service/:applyId/:apiid/*any", handler.Proxy) + //root.GET("/static/*any", handler.StaticProxy) } return e } diff --git a/src/service/field.go b/src/service/field.go index b6a5cff90ace652b91fcebef2c3bad15efe95322..a849405e5db3f16e7909f28ebe7e57f521abce24 100644 --- a/src/service/field.go +++ b/src/service/field.go @@ -11,15 +11,15 @@ import ( "encoding/json" "errors" "fmt" + "github.com/spf13/cast" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/client" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/config" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/dao" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/model" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/model/request" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/model/tables" - "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/tools" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/tools/dataconvertutil" - "strconv" + "log" "time" ) @@ -28,43 +28,50 @@ func CheckSensitiveField() bool { return true } -//获取当日调用次数 返回是否到达当日访问量,是否到达敏感字段访问量 -func QueryCallsCount(filter model.ProxyData) (call bool, sensitiveCall bool, err error) { - //连接redis - redis, err := client.GetRedisClient() - if err != nil { - return - } - date := time.Now().Format(config.LocalDateFormat) - key := fmt.Sprintf("%d-%s", filter.Apply_id, date) - countStr, err := redis.Get(key) - if err != nil && err.Error() != `redis: nil` { - return - } - var count int - call = true - sensitiveCall = true - if countStr == "" { - expire := GetExpire() - err = redis.Set(key, 1, expire) - count = 1 - } else { - count, err = strconv.Atoi(countStr) - if err != nil { - return - } - if count+1 > filter.Count { - call = false - return - } - //超过允许访问敏感字段次数 - if count+1 > filter.Sensitive_count && filter.Sensituve_word != "" { - sensitiveCall = false +//检测是否达到了访问量 +func QueryCallsCount(filter model.ProxyData) (bool, bool, error) { + // 计次的 + if filter.SpcsType == 1 { + if filter.SpcsCount < filter.RequestCount { + return true, false, nil } - expire := GetExpire() - err = redis.Set(key, count+1, expire) } - return + return false, false, nil + ////连接redis + //redis, err := client.GetRedisClient() + //if err != nil { + // return + //} + //date := time.Now().Format(config.LocalDateFormat) + //key := fmt.Sprintf("%d-%s", filter.ApplyId, date) + //countStr, err := redis.Get(key) + //if err != nil && err.Error() != `redis: nil` { + // return + //} + //var count int64 + //call = true + //sensitiveCall = true + //if countStr == "" { + // expire := GetExpire() + // err = redis.Set(key, 1, expire) + // count = 1 + //} else { + // count, err = strconv.ParseInt(countStr, 10, 64) + // if err != nil { + // return + // } + // if count+1 > filter.RequestCount { + // call = false + // return + // } + // //超过允许访问敏感字段次数 + // if count+1 > filter.SensitiveCount && filter.SensituveWord != "" { + // sensitiveCall = false + // } + // expire := GetExpire() + // err = redis.Set(key, count+1, expire) + //} + //return } //获取过期时间 @@ -82,35 +89,44 @@ func GetExpire() time.Duration { //记录调用痕迹 func RecordCall(proxyData model.ProxyData, status int, res []byte) { - acc := dao.Service_request_record{} - redis, err := client.GetRedisClient() + + db, err := client.GetConnect() if err != nil { fmt.Println(err.Error()) return } + acc := dao.ServiceRequestRecord{ + Id: 0, + ServiceId: proxyData.ServiceId, + ApplyId: proxyData.ApplyId, + UserId: proxyData.ApplyUserId, + RequestTime: time.Now(), + DateDay: time.Now().Day(), + DateMonth: int(time.Now().Month()), + DateYear: time.Now().Year(), + Status: status, + Error: "", + ReqUrl: proxyData.ReqUrl, + ApiId: proxyData.ApiId, + ApplyOid: proxyData.ApplyOid, + ServiceOid: proxyData.ServiceOid, + } + //错误信息 if status != 200 { - acc.Error = string(res[:]) - //mjson,_ :=json.Marshal(res) - //mString :=string(mjson) - //acc.Error = mString + acc.Error = string(res) } - acc.Request_time = tools.JsonTime(time.Now()) - acc.Apply_id = proxyData.Apply_id - acc.User_id = proxyData.User_id - acc.Service_id = proxyData.Service_id - acc.Date_day = time.Now().Day() - fmt.Println(time.Now().Month().String()) - acc.Date_month = int(time.Now().Month()) - acc.Date_year = time.Now().Year() - acc.Status = status - b, _ := json.Marshal(acc) - if errs := redis.Conn.RPush(config.CallRecord, b).Err(); errs != nil { - err = errs - fmt.Println("rpush data to list failed:", errs.Error()) - return + if _, err = db.Insert(&acc); err != nil { + fmt.Println(err) } - fmt.Println("调用记录进入队列") + + //b, _ := json.Marshal(acc) + //if errs := redis.Conn.RPush(config.CallRecord, b).Err(); errs != nil { + // err = errs + // fmt.Println("rpush data to list failed:", errs.Error()) + // return + //} + //fmt.Println("调用记录进入队列") return } @@ -188,24 +204,39 @@ func CallCounts(proxyData model.ProxyData) (err error) { date := time.Now().Format(config.LocalDateFormat) session := db.NewSession() session.Begin() - sql1 := fmt.Sprintf(` + if proxyData.ApiId == 0 { + sql1 := fmt.Sprintf(` +LOCK TABLE service IN SHARE ROW EXCLUSIVE MODE; + update service set request_count =request_count+1,req_count =req_count+1 where id = %d; + update service_apply set request_count =request_count+1 where id = %d; + `, proxyData.ServiceId, proxyData.ApplyId) + _, err = session.SQL(sql1).Execute() + if err != nil { + fmt.Println("error******service、service_apply更新失败:" + err.Error()) + return + } + } else { + sql1 := fmt.Sprintf(` LOCK TABLE service IN SHARE ROW EXCLUSIVE MODE; update service set request_count =request_count+1 where id = %d; + update service_req_extend set req_count =req_count+1 where id = %d; update service_apply set request_count =request_count+1 where id = %d; - `, proxyData.Service_id, proxyData.Apply_id) - _, err = session.SQL(sql1).Execute() - if err != nil { - fmt.Println("error******service、service_apply更新失败:" + err.Error()) - return + `, proxyData.ServiceId, proxyData.ApiId, proxyData.ApplyId) + _, err = session.SQL(sql1).Execute() + if err != nil { + fmt.Println("error******service、service_apply更新失败:" + err.Error()) + return + } } session.Commit() + session.Begin() sql := fmt.Sprintf(` LOCK TABLE service_daliy_count IN SHARE ROW EXCLUSIVE MODE; INSERT INTO service_daliy_count ( service_id,date,count) VALUES (%d,'%s',%d) ON conflict (service_id,date) DO UPDATE SET count=(service_daliy_count.count+1); -`, proxyData.Service_id, date, 1) +`, proxyData.ServiceId, date, 1) _, err = session.SQL(sql).Execute() if err != nil { fmt.Println("error******service_daliy_count更新失败:" + err.Error()) @@ -219,7 +250,7 @@ LOCK TABLE service_count_person IN SHARE ROW EXCLUSIVE MODE; INSERT INTO service_count_person ( user_id,date,count) VALUES ('%s','%s',%d) ON conflict (user_id,date) DO UPDATE SET count=(service_count_person.count+1); -`, proxyData.User_id, date, 1) +`, proxyData.ApplyUserId, date, 1) _, err = session.SQL(sql3).Execute() if err != nil { fmt.Println("error****** service_count_person 更新失败:" + err.Error()) @@ -242,20 +273,21 @@ func ApplyCallCounts(proxyData model.ProxyData) (err error) { return } //date := time.Now().Format(config.LocalDateTimeFormat) - err = redis.RPush(fmt.Sprintf("%s", config.ApplyTag), proxyData.Apply_id) + err = redis.RPush(fmt.Sprintf("%s", config.ApplyTag), proxyData.ApplyId) fmt.Println("rpush data to list failed:", err) return } //过滤返回字段 -func FiledFilter(proxyData model.ProxyData, respbody []byte) interface{} { - fields := []request.ServiceField{} +func FiledFilter(proxyData model.ProxyData, respbody []byte) []byte { + var fields []request.ServiceField fields = dataconvertutil.GetResponseField(proxyData.ResFields) _, arrmodel := dataconvertutil.ConvertJson(fields) realData := make(map[string]interface{}) json.Unmarshal(respbody, &realData) if arrmodel != nil && len(arrmodel) != 0 && len(realData) != 0 { - return Change(arrmodel[0], realData) + bytes, _ := json.Marshal(Change(arrmodel[0], realData)) + return bytes } return respbody } @@ -265,7 +297,7 @@ func Change(model interface{}, returnData interface{}) interface{} { //switch t := model.(type) { switch model.(type) { case map[string]interface{}: - // TODO 判定值是否相等 + // 判定值是否相等 for k, v := range returnData.(map[string]interface{}) { flag := false for k1, v1 := range model.(map[string]interface{}) { @@ -312,7 +344,7 @@ func Change(model interface{}, returnData interface{}) interface{} { } break default: - // TODO 判断old是否有这个值 + // 判断old是否有这个值 //fmt.Println("数组类型 |||||||||||||||||||||||||||||||| old=====new=====>: ", model, returnData) } } @@ -338,16 +370,16 @@ func UpdateCallsCount(applyId string) (err error) { //返回过滤后的敏感字段 func SensitiveFilter(proxyData model.ProxyData, res interface{}) interface{} { - fields := []request.ServiceField{} - fields = dataconvertutil.GetResponseField(proxyData.Sensituve_word) - _, arrSensituve_word := dataconvertutil.ConvertJson(fields) + var fields []request.ServiceField + fields = dataconvertutil.GetResponseField(proxyData.SensituveWord) + _, arrsensituveWord := dataconvertutil.ConvertJson(fields) //if Sensituve_word != nil && len(Sensituve_word) != 0 { // return FilterSensituveField(Sensituve_word, res) //} else if arrSensituve_word != nil && len(arrSensituve_word) != 0 { // return FilterSensituveField(arrSensituve_word, res) //} - if arrSensituve_word != nil && len(arrSensituve_word) != 0 { - return Change(arrSensituve_word[0], res) + if arrsensituveWord != nil && len(arrsensituveWord) != 0 { + return Change(arrsensituveWord[0], res) } return res } @@ -357,7 +389,7 @@ func FilterSensituveField(model interface{}, returnData interface{}) (body inter //switch t := model.(type) { switch model.(type) { case map[string]interface{}: - // TODO 判定值是否相等 + // 判定值是否相等 for k, v := range returnData.(map[string]interface{}) { //flag := false for k1, v1 := range model.(map[string]interface{}) { @@ -431,33 +463,55 @@ func FilterSensituveField(model interface{}, returnData interface{}) (body inter } // 获取真实地址和返回结构、调用限定次数 -func GetRealPath(applyId string) (res model.ProxyData, err error) { +func GetRealPath(applyId, apiId string) (model.ProxyData, error) { db, err := client.GetConnect() if err != nil { - return + return model.ProxyData{}, err } - has, err := db. - Select(`service_apply.res_fields as res_fields,service.req_url as req_url,service_request_spcs.count as count,service_safe_config.sensituve_word as sensituve_word -,service_request_spcs.sensitive_count as sensitive_count,service_apply.service_id as service_id,service_apply.id as apply_id,service_apply.user_id as user_id,service.data_service_type1,domains.name,service_apply.second_level`). - Table(`service`). - Join(`inner`, `service_apply`, `service_apply.service_id = service.id`). - Join(`left`, `service_request_spcs`, `service_request_spcs.id = service_apply.request_spcs_id`). - Join(`left`, `service_safe_config`, `service_apply.service_id = service_safe_config.service_id`). - Join("inner", "domains", "domains.id = service.data_service_type1"). - Where(`service_apply.uuid=?`, applyId).Get(&res) - if !has { - err = errors.New(`未找到发布的服务!`) + var res model.ProxyData + apiid := cast.ToInt64(apiId) + if apiid == 0 { + has, err := db.NewSession().Select("ssc.sensituve_word,sa.service_id,sa.id as apply_id, s.req_url,sa.request_count,sa.duration,sa.duration_unit,sa.spcs_type,sa.spcs_count,sa.res_fields,s.data_service_type1,s.data_service_type2 ,s.data_service_type3,sa.second_level,sa.service_end_time,s.req_name,s.state as service_state,sa.pay_status,sa.user_id as apply_user_id,s.user_id as service_user_id,s.organization as service_oid,sa.apply_oid").Table("service_apply").Alias("sa").Join("inner", []string{"service", "s"}, "sa.service_id=s.id").Join("left", []string{"service_safe_config", "ssc"}, "ssc.service_id=sa.service_id").Where("s.is_deleted =0 and sa.is_deleted =0 and s.state in(1,3) and sa.uuid=?", applyId).Get(&res) + if err != nil { + log.Println(err) + return model.ProxyData{}, errors.New(`未找到发布的服务!`) + } else if !has { + return model.ProxyData{}, errors.New(`未找到发布的服务!`) + } + } else { + has, err := db.NewSession().Select("ssc.sensituve_word,sre.id as api_id,sa.service_id,sa.id as apply_id,sre.req_url,sa.request_count,sa.duration,sa.duration_unit,sa.spcs_type,sa.spcs_count,sa.res_fields,s.data_service_type1,s.data_service_type2 ,s.data_service_type3,sa.second_level,sa.service_end_time,sre.req_name,s.state as service_state,sa.pay_status,sa.user_id as apply_user_id,s.user_id as service_user_id,s.organization as service_oid,sa.apply_oid").Table("service_apply").Alias("sa").Join("inner", []string{"service", "s"}, "sa.service_id=s.id").Join("inner", []string{"service_req_extend", "sre"}, "sre.service_id = sa.service_id and sre.id =?", apiid).Join("left", []string{"service_safe_config", "ssc"}, "ssc.service_id=sa.service_id").Where("s.is_deleted =0 and sa.is_deleted =0 and s.state in(1,3) and sa.uuid=?", applyId).Get(&res) + if err != nil { + log.Println(err) + return model.ProxyData{}, errors.New(`未找到发布的服务!`) + } else if !has { + return model.ProxyData{}, errors.New(`未找到发布的服务!`) + } } - return + return res, nil } // 获取真实地址 -func GetReqPath() (res tables.Service, err error) { +func GetReqPath(apiId string) (tables.Service, error) { db, err := client.GetConnect() if err != nil { - return + return tables.Service{}, err } - res = tables.Service{} - _, err = db.ID(config.MeshId).Get(&res) - return + res := tables.Service{} + + apiid := cast.ToInt64(apiId) + if apiid == 0 { + if has, err := db.ID(config.MeshId).Get(&res); err != nil { + return tables.Service{}, err + } else if !has { + return tables.Service{}, errors.New("服务不存在") + } + } else { + if has, err := db.NewSession().Where("service_id=? and id=?", config.MeshId, apiid).Table("service_req_extend").Get(&res); err != nil { + return tables.Service{}, err + } else if !has { + return tables.Service{}, errors.New("服务不存在") + } + } + + return res, nil }