Commit 0aa8b3c0 authored by 张磊涛's avatar 张磊涛 💬

Merge branch 'dev' into 'master'

Dev

See merge request apaas/apaas-meshproxy!3
parents c03a1f30 7de5c8b5
...@@ -22,6 +22,7 @@ require ( ...@@ -22,6 +22,7 @@ require (
github.com/onsi/ginkgo v1.10.2 // indirect github.com/onsi/ginkgo v1.10.2 // indirect
github.com/onsi/gomega v1.7.0 // indirect github.com/onsi/gomega v1.7.0 // indirect
github.com/sirupsen/logrus v1.4.2 github.com/sirupsen/logrus v1.4.2
github.com/spf13/cast v1.3.1
github.com/spf13/pflag v1.0.5 github.com/spf13/pflag v1.0.5
github.com/tealeg/xlsx v1.0.5 // indirect github.com/tealeg/xlsx v1.0.5 // indirect
github.com/vulcand/oxy v1.0.0 github.com/vulcand/oxy v1.0.0
......
...@@ -143,6 +143,8 @@ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqn ...@@ -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.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 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 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
......
...@@ -2,9 +2,9 @@ package dao ...@@ -2,9 +2,9 @@ package dao
type ServiceApply struct { type ServiceApply struct {
Id int `json:"id" xorm:"id"` Id int `json:"id" xorm:"id"`
Service_id string `json:"service_id" xorm:"service_id"` ServiceId string `json:"service_id" xorm:"service_id"`
User_id int `json:"user_id" xorm:"user_id"` UserId int `json:"user_id" xorm:"user_id"`
Request_count int `json:"request_count" xorm:"request_count"` RequestCount int `json:"request_count" xorm:"request_count"`
ResFields string `json:"res_fields" xorm:"res_fields text"` ResFields string `json:"res_fields" xorm:"res_fields text"`
} }
......
package dao package dao
import "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/tools" import (
"time"
)
type Service_request_record struct { type ServiceRequestRecord struct {
Id int `json:"id" xorm:"id"` Id int64 `json:"id" xorm:"pk default nextval('service_request_record_id_pk'::regclass) autoincr BIGINT"`
Service_id int `json:"service_id" xorm:"service_id"` ServiceId int64 `json:"service_id" xorm:"BIGINT"`
Apply_id int `json:"apply_id" xorm:"apply_id"` ApplyId int64 `json:"apply_id" xorm:"BIGINT"`
User_id string `json:"user_id" xorm:"user_id"` UserId string `json:"user_id" xorm:"VARCHAR(50)"`
Request_time tools.JsonTime `json:"request_time" xorm:"request_time created"` RequestTime time.Time `json:"request_time" xorm:"DATETIME"`
Date_day int `json:"date_day" xorm:"date_day"` DateDay int `json:"date_day" xorm:"SMALLINT"`
Date_month int `json:"date_month" xorm:"date_month"` DateMonth int `json:"date_month" xorm:"SMALLINT"`
Date_year int `json:"date_year" xorm:"date_year"` DateYear int `json:"date_year" xorm:"SMALLINT"`
Status int `json:"status" xorm:"status"` Status int `json:"status" xorm:"SMALLINT"`
Error string `json:"error" xorm:"error"` 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" return "service_request_record"
} }
...@@ -14,7 +14,9 @@ import ( ...@@ -14,7 +14,9 @@ import (
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/service" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/service"
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/tools" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/tools"
"io/ioutil" "io/ioutil"
"log"
"net/http" "net/http"
"net/url"
"strconv" "strconv"
"strings" "strings"
"time" "time"
...@@ -32,58 +34,109 @@ func Proxy(c *gin.Context) { ...@@ -32,58 +34,109 @@ func Proxy(c *gin.Context) {
c.JSON(200, res) c.JSON(200, res)
return return
} }
apiId := c.Param("apiid")
//获取服务相关信息 //获取服务相关信息
proxyData, err := service.GetRealPath(applyId) proxyData, err := service.GetRealPath(applyId, apiId)
if err != nil { if err != nil {
fmt.Println("err......", err.Error()) fmt.Println("err......", err.Error())
c.Error(err) c.Error(err)
return return
} }
if proxyData.Second_level != 1 { //proxyData.ReqUrl = "https://apaas3.wodcloud.com/iam/login/#/login"
if proxyData.SecondLevel != 1 {
res := model.WebRes{} res := model.WebRes{}
res.ErrMsg = `服务申请未通过审批,请联系组织管理员或超管审批` res.ErrMsg = `服务申请未通过审批,请联系组织管理员或超管审批`
c.JSON(200, res) c.JSON(200, res)
return return
} }
roundTripper := http.DefaultTransport.(*http.Transport)
roundTripper.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} if proxyData.ServiceEndTime.Before(appT) {
f, _ := forward.New(forward.PassHostHeader(true), forward.RoundTripper(roundTripper), forward.ResponseModifier(func(resp *http.Response) error { res := model.WebRes{}
//Resp = resp res.ErrMsg = `申请的服务已过期`
c.JSON(200, res)
return
}
//判断是否超过调用次数是否可以调用 //判断是否超过调用次数是否可以调用
callflag, sensitiveflag, err := service.QueryCallsCount(proxyData) callflag, _, err := service.QueryCallsCount(proxyData)
if err != nil { if err != nil {
fmt.Println("err......", err.Error()) fmt.Println("err......", err.Error(), "无法处理调用次数判断")
return nil res := model.WebRes{}
res.ErrMsg = `无法处理您的请求`
c.JSON(200, res)
return
} }
if callflag == false { if callflag {
err = errors.New(`调用达到当日限定次数`) res := model.WebRes{}
Return(nil, err, resp) res.ErrMsg = `已达到最大调用量`
return nil 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(`数据读取失败`)
} }
bT := time.Now() var bytesNewBody []byte
fmt.Println(`开始获取数据:`, bT)
respbody, _ := ioutil.ReadAll(resp.Body)
var res interface{}
res = respbody
eT := time.Since(bT)
fmt.Println("获取数据: ", eT)
//是否需要过滤字段 //是否需要过滤字段
if proxyData.ResFields != "" { if proxyData.DataServiceType1 == 5 && proxyData.ResFields != "" && proxyData.ResFields != "[]" {
bT := time.Now() //读取数据
fmt.Println(`过滤:`, bT) bytesNewBody = service.FiledFilter(proxyData, respbody)
res = service.FiledFilter(proxyData, respbody) } else {
eT := time.Since(bT) bytesNewBody = respbody
fmt.Println("过滤: ", eT) }
//放回
resp.Body = ioutil.NopCloser(bytes.NewBuffer(bytesNewBody))
go func() {
defer func() {
err := recover()
if err != nil {
fmt.Println(err)
} }
//是否需要屏蔽敏感字段 }()
if sensitiveflag == false { //调用次数统计
res = service.SensitiveFilter(proxyData, res) 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() //bgn := time.Now()
//fmt.Println(`开始携程:`, bgn) //fmt.Println(`开始携程:`, bgn)
go service.CallCounts(proxyData) //go service.CallCounts(proxyData)
//end := time.Since(bgn) //end := time.Since(bgn)
//fmt.Println("结束携程: ", end) //fmt.Println("结束携程: ", end)
//err = service.CallCounts(proxyData) //err = service.CallCounts(proxyData)
...@@ -98,40 +151,49 @@ func Proxy(c *gin.Context) { ...@@ -98,40 +151,49 @@ func Proxy(c *gin.Context) {
// Return(nil, err, resp) // Return(nil, err, resp)
// return nil // return nil
//} //}
Return(res, nil, resp) //Return(res, nil, resp)
//appeT := time.Since(appT) //appeT := time.Since(appT)
//fmt.Println("结束: ", appeT) //fmt.Println("结束: ", appeT)
return nil return nil
})) }))
c.Request.URL = testutils.ParseURI(getProxyURL(proxyData, c.Request)) if err != nil {
c.JSON(500, errors.New("请求失败"))
return
}
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
}
}
c.Request.URL = reqURL
fmt.Println("c.Request.URL-------", c.Request.URL) fmt.Println("c.Request.URL-------", c.Request.URL)
c.Request.RequestURI = getRequestURI(c.Request) c.Request.RequestURI = reqURL.RequestURI()
fmt.Println("c.Request-------", c.Request) fmt.Println("c.Request-------", c.Request)
c.Request.Host = getHost(proxyData.RealUrl) c.Request.Host = getHost(proxyData.ReqUrl)
fmt.Println("proxyData.RealUrl-------", proxyData.RealUrl) fmt.Println("proxyData.RealUrl-------", proxyData.ReqUrl)
f.ServeHTTP(c.Writer, c.Request) forwarder.ServeHTTP(c.Writer, c.Request)
}
} }
func getProxyURL(proxyData model.ProxyData, req *http.Request) string { func CheckStaticFile(path string) bool {
realPath := proxyData.RealUrl if strings.HasSuffix(path, ".css") || strings.HasSuffix(path, ".js") || strings.HasSuffix(path, ".woff2") ||
rawQuery := req.URL.RawQuery strings.HasSuffix(path, ".jpg") || strings.HasSuffix(path, ".svg") || strings.HasSuffix(path, ".woff") || strings.HasSuffix(path, ".html") || strings.HasSuffix(path, ".ttf") {
var result = "" return true
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"
} }
} return false
return result
} }
func getRequestURI(req *http.Request) string { func getRequestURI(req *http.Request) string {
//requestURI, _ := url.ParseRequestURI(req.RequestURI)
//
//requestURI.RawQuery
path := req.URL.Path path := req.URL.Path
rawQuery := req.URL.RawQuery rawQuery := req.URL.RawQuery
var result = "" var result = ""
...@@ -175,20 +237,19 @@ func gzipCompress(content *[]byte) []byte { ...@@ -175,20 +237,19 @@ func gzipCompress(content *[]byte) []byte {
return compressData.Bytes() return compressData.Bytes()
} }
// 获取域名 // 获取域名 protocol :// hostname[:port] / path / [;parameters][?query]#fragment
func getHost(url string) (path string) { func getHost(httpurl string) (path string) {
if strings.Contains(url, "//") { parse, err := url.Parse(httpurl)
path = strings.Split(url, "//")[1] if err != nil {
if strings.Contains(path, "/") { return ""
path = strings.Split(path, "/")[0]
}
} }
return return fmt.Sprintf("%s://%s", parse.Scheme, parse.Host)
} }
func HealthCheck(c *gin.Context) { func HealthCheck(c *gin.Context) {
res := model.WebRes{} res := model.WebRes{}
proxyData, err := service.GetReqPath() apiId := c.Param("apiid")
proxyData, err := service.GetReqPath(apiId)
if err != nil { if err != nil {
res.Data = err.Error() res.Data = err.Error()
c.JSON(500, res) c.JSON(500, res)
......
...@@ -18,11 +18,11 @@ import ( ...@@ -18,11 +18,11 @@ import (
var ( var (
argPort = pflag.Int("port", 8011, "") argPort = pflag.Int("port", 8011, "")
argPrefix = pflag.String("prefix", "/bgmesh/fiddler", "") argPrefix = pflag.String("prefix", "/bgmesh/fiddler", "")
meshId = pflag.String("meshId", "149", "") meshId = pflag.String("meshId", "461", "")
redisUrl = pflag.String("redisUrl", "redis://redis.apaas-v3:6379", "") redisUrl = pflag.String("redisUrl", "redis://apaas-redis:6379", "")
redisTag = pflag.String("redisTag", "apaas-mesh-proxy", "") redisTag = pflag.String("redisTag", "apaas-mesh-proxy", "")
confPath = pflag.String("confPath", "/app/config/proxy.json", "") 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", "") dbDriverName = pflag.String("dbDriverName", "postgres", "")
) )
...@@ -33,6 +33,7 @@ func main() { ...@@ -33,6 +33,7 @@ func main() {
server() server()
} }
//打包
func server() error { func server() error {
config.Prefix = *argPrefix config.Prefix = *argPrefix
handler := router.Load(ginrus.Ginrus(logrus.StandardLogger(), time.RFC3339, true)) handler := router.Load(ginrus.Ginrus(logrus.StandardLogger(), time.RFC3339, true))
......
package model package model
import "time"
type ProxyData struct { type ProxyData struct {
RealUrl string `json:"req_url" xorm:"req_url"` ApplyId int64 `json:"apply_id"`
ResFields string `json:"res_fields" xorm:"res_fields text"` ReqUrl string `json:"req_url"`
Count int `json:"count" xorm:"count"` RequestCount int64 `json:"request_count"`
Sensituve_word string `json:"sensituve_word" xorm:"sensituve_word"` Duration int64 `json:"duration"`
Sensitive_count int `json:"sensitive_count" xorm:"sensitive_count"` DurationUnit int64 `json:"duration_unit"`
Apply_id int `json:"apply_id" xorm:"apply_id"` SpcsType int `json:"spcs_type"`
Service_id int `json:"service_id" xorm:"service_id"` SpcsCount int64 `json:"spcs_count"`
User_id string `json:"user_id" xorm:"user_id"` ResFields string `json:"res_fields"`
Data_service_type1 int `json:"data_service_type1" xorm:"data_service_type1"` DataServiceType1 int64 `json:"data_service_type1"`
Name string `json:"name"` DataServiceType2 int64 `json:"data_service_type2"`
Second_level int `json:"second_level"xorm:"second_level"` 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 { type WebRes struct {
......
...@@ -32,8 +32,12 @@ func Load(middleware ...gin.HandlerFunc) http.Handler { ...@@ -32,8 +32,12 @@ func Load(middleware ...gin.HandlerFunc) http.Handler {
e.Use(middleware...) e.Use(middleware...)
root := e.Group(fmt.Sprintf("%s/%s", config.Prefix, config.MeshId)) root := e.Group(fmt.Sprintf("%s/%s", config.Prefix, config.MeshId))
{ {
root.GET("/health", handler.HealthCheck) //root.GET("/health", handler.HealthCheck)
root.Any("/service/:applyId", handler.Proxy) 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 return e
} }
...@@ -11,15 +11,15 @@ import ( ...@@ -11,15 +11,15 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"github.com/spf13/cast"
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/client" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/client"
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/config" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/config"
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/dao" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/dao"
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/model" "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/request"
"gitlab.wodcloud.com/apaas/apaas-meshproxy/src/model/tables" "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" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/tools/dataconvertutil"
"strconv" "log"
"time" "time"
) )
...@@ -28,43 +28,50 @@ func CheckSensitiveField() bool { ...@@ -28,43 +28,50 @@ func CheckSensitiveField() bool {
return true return true
} }
//获取当日调用次数 返回是否到达当日访问量,是否到达敏感字段访问量 //检测是否达到了访问量
func QueryCallsCount(filter model.ProxyData) (call bool, sensitiveCall bool, err error) { func QueryCallsCount(filter model.ProxyData) (bool, bool, error) {
//连接redis // 计次的
redis, err := client.GetRedisClient() if filter.SpcsType == 1 {
if err != nil { if filter.SpcsCount < filter.RequestCount {
return return true, false, nil
}
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
} }
expire := GetExpire() return false, false, nil
err = redis.Set(key, count+1, expire) ////连接redis
} //redis, err := client.GetRedisClient()
return //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 { ...@@ -82,35 +89,44 @@ func GetExpire() time.Duration {
//记录调用痕迹 //记录调用痕迹
func RecordCall(proxyData model.ProxyData, status int, res []byte) { 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 { if err != nil {
fmt.Println(err.Error()) fmt.Println(err.Error())
return 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 { if status != 200 {
acc.Error = string(res[:]) acc.Error = string(res)
//mjson,_ :=json.Marshal(res) }
//mString :=string(mjson)
//acc.Error = mString
}
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() if _, err = db.Insert(&acc); err != nil {
acc.Status = status fmt.Println(err)
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("调用记录进入队列")
//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 return
} }
...@@ -188,24 +204,39 @@ func CallCounts(proxyData model.ProxyData) (err error) { ...@@ -188,24 +204,39 @@ func CallCounts(proxyData model.ProxyData) (err error) {
date := time.Now().Format(config.LocalDateFormat) date := time.Now().Format(config.LocalDateFormat)
session := db.NewSession() session := db.NewSession()
session.Begin() session.Begin()
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(` sql1 := fmt.Sprintf(`
LOCK TABLE service IN SHARE ROW EXCLUSIVE MODE; LOCK TABLE service IN SHARE ROW EXCLUSIVE MODE;
update service set request_count =request_count+1 where id = %d; 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; update service_apply set request_count =request_count+1 where id = %d;
`, proxyData.Service_id, proxyData.Apply_id) `, proxyData.ServiceId, proxyData.ApiId, proxyData.ApplyId)
_, err = session.SQL(sql1).Execute() _, err = session.SQL(sql1).Execute()
if err != nil { if err != nil {
fmt.Println("error******service、service_apply更新失败:" + err.Error()) fmt.Println("error******service、service_apply更新失败:" + err.Error())
return return
} }
}
session.Commit() session.Commit()
session.Begin() session.Begin()
sql := fmt.Sprintf(` sql := fmt.Sprintf(`
LOCK TABLE service_daliy_count IN SHARE ROW EXCLUSIVE MODE; LOCK TABLE service_daliy_count IN SHARE ROW EXCLUSIVE MODE;
INSERT INTO service_daliy_count ( service_id,date,count) VALUES INSERT INTO service_daliy_count ( service_id,date,count) VALUES
(%d,'%s',%d) ON conflict (service_id,date) DO (%d,'%s',%d) ON conflict (service_id,date) DO
UPDATE SET count=(service_daliy_count.count+1); UPDATE SET count=(service_daliy_count.count+1);
`, proxyData.Service_id, date, 1) `, proxyData.ServiceId, date, 1)
_, err = session.SQL(sql).Execute() _, err = session.SQL(sql).Execute()
if err != nil { if err != nil {
fmt.Println("error******service_daliy_count更新失败:" + err.Error()) fmt.Println("error******service_daliy_count更新失败:" + err.Error())
...@@ -219,7 +250,7 @@ LOCK TABLE service_count_person IN SHARE ROW EXCLUSIVE MODE; ...@@ -219,7 +250,7 @@ LOCK TABLE service_count_person IN SHARE ROW EXCLUSIVE MODE;
INSERT INTO service_count_person ( user_id,date,count) VALUES INSERT INTO service_count_person ( user_id,date,count) VALUES
('%s','%s',%d) ON conflict (user_id,date) DO ('%s','%s',%d) ON conflict (user_id,date) DO
UPDATE SET count=(service_count_person.count+1); UPDATE SET count=(service_count_person.count+1);
`, proxyData.User_id, date, 1) `, proxyData.ApplyUserId, date, 1)
_, err = session.SQL(sql3).Execute() _, err = session.SQL(sql3).Execute()
if err != nil { if err != nil {
fmt.Println("error****** service_count_person 更新失败:" + err.Error()) fmt.Println("error****** service_count_person 更新失败:" + err.Error())
...@@ -242,20 +273,21 @@ func ApplyCallCounts(proxyData model.ProxyData) (err error) { ...@@ -242,20 +273,21 @@ func ApplyCallCounts(proxyData model.ProxyData) (err error) {
return return
} }
//date := time.Now().Format(config.LocalDateTimeFormat) //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) fmt.Println("rpush data to list failed:", err)
return return
} }
//过滤返回字段 //过滤返回字段
func FiledFilter(proxyData model.ProxyData, respbody []byte) interface{} { func FiledFilter(proxyData model.ProxyData, respbody []byte) []byte {
fields := []request.ServiceField{} var fields []request.ServiceField
fields = dataconvertutil.GetResponseField(proxyData.ResFields) fields = dataconvertutil.GetResponseField(proxyData.ResFields)
_, arrmodel := dataconvertutil.ConvertJson(fields) _, arrmodel := dataconvertutil.ConvertJson(fields)
realData := make(map[string]interface{}) realData := make(map[string]interface{})
json.Unmarshal(respbody, &realData) json.Unmarshal(respbody, &realData)
if arrmodel != nil && len(arrmodel) != 0 && len(realData) != 0 { 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 return respbody
} }
...@@ -265,7 +297,7 @@ func Change(model interface{}, returnData interface{}) interface{} { ...@@ -265,7 +297,7 @@ func Change(model interface{}, returnData interface{}) interface{} {
//switch t := model.(type) { //switch t := model.(type) {
switch model.(type) { switch model.(type) {
case map[string]interface{}: case map[string]interface{}:
// TODO 判定值是否相等 // 判定值是否相等
for k, v := range returnData.(map[string]interface{}) { for k, v := range returnData.(map[string]interface{}) {
flag := false flag := false
for k1, v1 := range model.(map[string]interface{}) { for k1, v1 := range model.(map[string]interface{}) {
...@@ -312,7 +344,7 @@ func Change(model interface{}, returnData interface{}) interface{} { ...@@ -312,7 +344,7 @@ func Change(model interface{}, returnData interface{}) interface{} {
} }
break break
default: default:
// TODO 判断old是否有这个值 // 判断old是否有这个值
//fmt.Println("数组类型 |||||||||||||||||||||||||||||||| old=====new=====>: ", model, returnData) //fmt.Println("数组类型 |||||||||||||||||||||||||||||||| old=====new=====>: ", model, returnData)
} }
} }
...@@ -338,16 +370,16 @@ func UpdateCallsCount(applyId string) (err error) { ...@@ -338,16 +370,16 @@ func UpdateCallsCount(applyId string) (err error) {
//返回过滤后的敏感字段 //返回过滤后的敏感字段
func SensitiveFilter(proxyData model.ProxyData, res interface{}) interface{} { func SensitiveFilter(proxyData model.ProxyData, res interface{}) interface{} {
fields := []request.ServiceField{} var fields []request.ServiceField
fields = dataconvertutil.GetResponseField(proxyData.Sensituve_word) fields = dataconvertutil.GetResponseField(proxyData.SensituveWord)
_, arrSensituve_word := dataconvertutil.ConvertJson(fields) _, arrsensituveWord := dataconvertutil.ConvertJson(fields)
//if Sensituve_word != nil && len(Sensituve_word) != 0 { //if Sensituve_word != nil && len(Sensituve_word) != 0 {
// return FilterSensituveField(Sensituve_word, res) // return FilterSensituveField(Sensituve_word, res)
//} else if arrSensituve_word != nil && len(arrSensituve_word) != 0 { //} else if arrSensituve_word != nil && len(arrSensituve_word) != 0 {
// return FilterSensituveField(arrSensituve_word, res) // return FilterSensituveField(arrSensituve_word, res)
//} //}
if arrSensituve_word != nil && len(arrSensituve_word) != 0 { if arrsensituveWord != nil && len(arrsensituveWord) != 0 {
return Change(arrSensituve_word[0], res) return Change(arrsensituveWord[0], res)
} }
return res return res
} }
...@@ -357,7 +389,7 @@ func FilterSensituveField(model interface{}, returnData interface{}) (body inter ...@@ -357,7 +389,7 @@ func FilterSensituveField(model interface{}, returnData interface{}) (body inter
//switch t := model.(type) { //switch t := model.(type) {
switch model.(type) { switch model.(type) {
case map[string]interface{}: case map[string]interface{}:
// TODO 判定值是否相等 // 判定值是否相等
for k, v := range returnData.(map[string]interface{}) { for k, v := range returnData.(map[string]interface{}) {
//flag := false //flag := false
for k1, v1 := range model.(map[string]interface{}) { for k1, v1 := range model.(map[string]interface{}) {
...@@ -431,33 +463,55 @@ func FilterSensituveField(model interface{}, returnData interface{}) (body inter ...@@ -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() db, err := client.GetConnect()
if err != nil { if err != nil {
return return model.ProxyData{}, err
} }
has, err := db. var res model.ProxyData
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 apiid := cast.ToInt64(apiId)
,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`). if apiid == 0 {
Table(`service`). 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)
Join(`inner`, `service_apply`, `service_apply.service_id = service.id`). if err != nil {
Join(`left`, `service_request_spcs`, `service_request_spcs.id = service_apply.request_spcs_id`). log.Println(err)
Join(`left`, `service_safe_config`, `service_apply.service_id = service_safe_config.service_id`). return model.ProxyData{}, errors.New(`未找到发布的服务!`)
Join("inner", "domains", "domains.id = service.data_service_type1"). } else if !has {
Where(`service_apply.uuid=?`, applyId).Get(&res) return model.ProxyData{}, errors.New(`未找到发布的服务!`)
if !has {
err = errors.New(`未找到发布的服务!`)
} }
return } 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 res, nil
} }
// 获取真实地址 // 获取真实地址
func GetReqPath() (res tables.Service, err error) { func GetReqPath(apiId string) (tables.Service, error) {
db, err := client.GetConnect() db, err := client.GetConnect()
if err != nil { if err != nil {
return return tables.Service{}, err
} }
res = tables.Service{} res := tables.Service{}
_, err = db.ID(config.MeshId).Get(&res)
return 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
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment