update logger

pull/25/head
sunface 7 years ago
parent eb07c18333
commit b8faa34ecc

@ -14,6 +14,7 @@ import (
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"
"github.com/labstack/echo" "github.com/labstack/echo"
"github.com/labstack/echo/middleware"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/client_golang/prometheus/promhttp"
"go.uber.org/zap" "go.uber.org/zap"
@ -25,7 +26,7 @@ type ApiServer struct {
} }
func (p *ApiServer) Start() { func (p *ApiServer) Start() {
g.Info("start tfe..") g.L.Info("start tfe..")
// 获取所有内部服务节点信息 // 获取所有内部服务节点信息
g.ETCD.QueryAll(misc.Conf.Etcd.Addrs) g.ETCD.QueryAll(misc.Conf.Etcd.Addrs)
@ -53,11 +54,15 @@ func (p *ApiServer) Start() {
} }
func (o *ApiServer) Shutdown() { func (o *ApiServer) Shutdown() {
g.Info("shutdown tfe..") g.L.Info("shutdown tfe..")
} }
func (p *ApiServer) listen() { func (p *ApiServer) listen() {
e := echo.New() e := echo.New()
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowHeaders: append([]string{echo.HeaderOrigin, echo.HeaderContentType, echo.HeaderAccept}, misc.Conf.Api.Cors...),
AllowCredentials: true,
}))
// 回调相关 // 回调相关
//同步回调接口 //同步回调接口
@ -70,7 +75,7 @@ func timing(f echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error { return func(c echo.Context) error {
ts := time.Now() ts := time.Now()
rid := (ts.UnixNano()/10)*10 + misc.Conf.Api.ServerID rid := (ts.UnixNano()/10)*10 + misc.Conf.Api.ServerID
g.Info("New request accepted", zap.Int64("rid", rid), zap.String("ip", c.RealIP())) g.L.Info("New request accepted", zap.Int64("rid", rid), zap.String("ip", c.RealIP()))
c.Set("rid", rid) c.Set("rid", rid)
defer func() { defer func() {
// 统计请求指标 // 统计请求指标
@ -85,9 +90,9 @@ func timing(f echo.HandlerFunc) echo.HandlerFunc {
err := c.Get("error_msg") err := c.Get("error_msg")
if err == nil { if err == nil {
g.Info("Request success", zap.Int64("rid", rid)) g.L.Info("Request success", zap.Int64("rid", rid))
} else { } else {
g.Info("Request failed", zap.Int64("rid", rid), zap.Error(err.(error))) g.L.Info("Request failed", zap.Int64("rid", rid), zap.Error(err.(error)))
} }
}() }()
@ -98,7 +103,7 @@ func timing(f echo.HandlerFunc) echo.HandlerFunc {
func (as *ApiServer) initTraffic() { func (as *ApiServer) initTraffic() {
r, err := rpc.Dial("tcp", misc.Conf.Traffic.Host+":"+misc.Conf.Traffic.Port) r, err := rpc.Dial("tcp", misc.Conf.Traffic.Host+":"+misc.Conf.Traffic.Port)
if err != nil { if err != nil {
g.Fatal("connect to raffic error", zap.Error(err)) g.L.Fatal("connect to raffic error", zap.Error(err))
} }
as.router.Filter.Rpc = r as.router.Filter.Rpc = r
@ -108,15 +113,15 @@ func (as *ApiServer) initTraffic() {
var res int var res int
err := as.router.Filter.Rpc.Call("RateLimiter.Ping", 1, &res) err := as.router.Filter.Rpc.Call("RateLimiter.Ping", 1, &res)
if err != nil || res != 1 { if err != nil || res != 1 {
g.Warn("rpc ping failed", zap.Error(err)) g.L.Warn("rpc ping failed", zap.Error(err))
r, err := rpc.Dial("tcp", misc.Conf.Traffic.Host+":"+misc.Conf.Traffic.Port) r, err := rpc.Dial("tcp", misc.Conf.Traffic.Host+":"+misc.Conf.Traffic.Port)
if err != nil { if err != nil {
g.Warn("re-connect to traffic error", zap.Error(err)) g.L.Warn("re-connect to traffic error", zap.Error(err))
time.Sleep(2 * time.Second) time.Sleep(2 * time.Second)
continue continue
} }
as.router.Filter.Rpc = r as.router.Filter.Rpc = r
g.Info("re-connect to traffic ok") g.L.Info("re-connect to traffic ok")
} }
time.Sleep(3 * time.Second) time.Sleep(3 * time.Second)

@ -44,7 +44,7 @@ func (f *Filter) BeforeRoute(r *req.Request) Result {
// 黑白名单 // 黑白名单
err := f.checkBW(r) err := f.checkBW(r)
if err != nil { if err != nil {
g.Info("BeforeRoute failed", zap.Error(err)) g.L.Info("BeforeRoute failed", zap.Error(err))
// 统计被阻挡数 // 统计被阻挡数
stats.Limits.With(prometheus.Labels{ stats.Limits.With(prometheus.Labels{
"api_id": r.Api.APIID, "api_id": r.Api.APIID,
@ -57,7 +57,7 @@ func (f *Filter) BeforeRoute(r *req.Request) Result {
// 参数校验 // 参数校验
err = f.verifyParam(r) err = f.verifyParam(r)
if err != nil { if err != nil {
g.Info("BeforeRoute failed", zap.Error(err)) g.L.Info("BeforeRoute failed", zap.Error(err))
return Result{http.StatusBadRequest, g.ParamInvalidC, g.ParamInvalidE} return Result{http.StatusBadRequest, g.ParamInvalidC, g.ParamInvalidE}
} }

@ -21,7 +21,7 @@ func (f *Filter) DecApiRate(r *req.Request) {
err := f.Rpc.Call("RateLimiter.DecApiRate", &misc.TrafficConReq{r.Api.APIID, r.Api.TrafficStrategy, ""}, &res) err := f.Rpc.Call("RateLimiter.DecApiRate", &misc.TrafficConReq{r.Api.APIID, r.Api.TrafficStrategy, ""}, &res)
if err != nil { if err != nil {
if !strings.Contains(err.Error(), "shut down") { if !strings.Contains(err.Error(), "shut down") {
g.Warn("rpc出错了", zap.Error(err)) g.L.Warn("rpc出错了", zap.Error(err))
} }
} }
} }
@ -48,7 +48,7 @@ func (f *Filter) IncApiRate(r *req.Request) (int, error) {
err := f.Rpc.Call("RateLimiter.IncApiRate", &misc.TrafficConReq{r.Api.APIID, r.Api.TrafficStrategy, val}, &res) err := f.Rpc.Call("RateLimiter.IncApiRate", &misc.TrafficConReq{r.Api.APIID, r.Api.TrafficStrategy, val}, &res)
if err != nil { if err != nil {
if !strings.Contains(err.Error(), "shut down") { if !strings.Contains(err.Error(), "shut down") {
g.Warn("rpc出错了", zap.Error(err)) g.L.Warn("rpc出错了", zap.Error(err))
} }
return 0, nil return 0, nil
} }

@ -33,7 +33,11 @@ func (f *Filter) trafficRoute(r *req.Request) {
api := apiI.(*misc.API) api := apiI.(*misc.API)
// 是否在路由ip列表中如果在直接路由 // 是否在路由ip列表中如果在直接路由
if strings.Contains(r.Api.TrafficIPs, r.ClientIP) { if strings.Contains(r.Api.TrafficIPs, r.ClientIP) {
g.Debug(r.DebugOn, "Canary by ip", zap.String("old_api", r.Api.APIID), zap.String("new_api", api.APIID), zap.String("client_ip", r.ClientIP)) if r.DebugOn {
g.DL.Debug("Canary by ip", zap.String("old_api", r.Api.APIID), zap.String("new_api", api.APIID), zap.String("client_ip", r.ClientIP))
} else {
g.L.Debug("Canary by ip", zap.String("old_api", r.Api.APIID), zap.String("new_api", api.APIID), zap.String("client_ip", r.ClientIP))
}
r.Api = api r.Api = api
return return
} }
@ -43,6 +47,11 @@ func (f *Filter) trafficRoute(r *req.Request) {
if n > r.Api.TrafficRatio { if n > r.Api.TrafficRatio {
return return
} }
g.Debug(r.DebugOn, "Canary by random", zap.String("old_api", r.Api.APIID), zap.String("new_api", api.APIID)) if r.DebugOn {
g.DL.Debug("Canary by random", zap.String("old_api", r.Api.APIID), zap.String("new_api", api.APIID))
} else {
g.L.Debug("Canary by random", zap.String("old_api", r.Api.APIID), zap.String("new_api", api.APIID))
}
r.Api = api r.Api = api
} }

@ -38,7 +38,7 @@ func (p *ApiServer) loadAll() {
apisS := make([]*misc.API, 0) apisS := make([]*misc.API, 0)
err := g.DB.Select(&apisS, "select * from api_release") err := g.DB.Select(&apisS, "select * from api_release")
if err != nil { if err != nil {
g.Fatal("load apis error!", zap.Error(err)) g.L.Fatal("load apis error!", zap.Error(err))
} }
an := make([]string, 0, len(apisS)) an := make([]string, 0, len(apisS))
@ -68,7 +68,7 @@ func (p *ApiServer) loadAll() {
strategies := make([]*misc.Strategy, 0) strategies := make([]*misc.Strategy, 0)
err = g.DB.Select(&strategies, "select * from strategy") err = g.DB.Select(&strategies, "select * from strategy")
if err != nil { if err != nil {
g.Fatal("load strategies error!", zap.Error(err)) g.L.Fatal("load strategies error!", zap.Error(err))
} }
for _, s := range strategies { for _, s := range strategies {
@ -110,7 +110,7 @@ func (p *ApiServer) loadUpdated() {
err := g.DB.Select(&apisS, fmt.Sprintf("select * from api_release where modify_date >= '%s'", lastT)) err := g.DB.Select(&apisS, fmt.Sprintf("select * from api_release where modify_date >= '%s'", lastT))
if err != nil { if err != nil {
g.Error("load apis error!", zap.Error(err)) g.L.Error("load apis error!", zap.Error(err))
return return
} }
@ -149,7 +149,7 @@ func (p *ApiServer) loadUpdated() {
query := fmt.Sprintf("select * from strategy where modify_date >= '%s'", lastT) query := fmt.Sprintf("select * from strategy where modify_date >= '%s'", lastT)
err := g.DB.Select(&strategies, query) err := g.DB.Select(&strategies, query)
if err != nil { if err != nil {
g.Error("load strategies error!", zap.Error(err), zap.String("query", query)) g.L.Error("load strategies error!", zap.Error(err), zap.String("query", query))
return return
} }

@ -59,7 +59,7 @@ func (m *Manage) QueryAPI(c echo.Context) error {
err := g.DB.Select(&apis, query) err := g.DB.Select(&apis, query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -101,7 +101,7 @@ func (m *Manage) CountAPI(c echo.Context) error {
rows, err := g.DB.Query(query) rows, err := g.DB.Query(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -156,7 +156,7 @@ func (m *Manage) DefineAPI(c echo.Context) error {
Message: g.AlreadyExistE, Message: g.AlreadyExistE,
}) })
} }
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -169,7 +169,7 @@ func (m *Manage) DefineAPI(c echo.Context) error {
api.APIID, api.PathType, api.Service, api.BackendAddr, misc.API_OFFLINE, date) api.APIID, api.PathType, api.Service, api.BackendAddr, misc.API_OFFLINE, date)
_, err = g.DB.Exec(query) _, err = g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -182,7 +182,7 @@ func (m *Manage) DefineAPI(c echo.Context) error {
*api.Desc, api.RouteType, api.BackendAddr, api.BackendType, api.BwStrategy, api.RetryStrategy, api.TrafficStrategy, *api.MockData, api.TrafficOn, api.TrafficAPI, api.TrafficRatio, api.TrafficIPs, api.VerifyOn, pr, api.CachedTime, api.App, api.AddrType, api.BackendURI, api.Method, api.APIID) *api.Desc, api.RouteType, api.BackendAddr, api.BackendType, api.BwStrategy, api.RetryStrategy, api.TrafficStrategy, *api.MockData, api.TrafficOn, api.TrafficAPI, api.TrafficRatio, api.TrafficIPs, api.VerifyOn, pr, api.CachedTime, api.App, api.AddrType, api.BackendURI, api.Method, api.APIID)
res, err := g.DB.Exec(query) res, err := g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -246,7 +246,7 @@ func (m *Manage) DeleteAPI(c echo.Context) error {
query := fmt.Sprintf("select status,modify_date from api_release where api_id='%s'", apiID) query := fmt.Sprintf("select status,modify_date from api_release where api_id='%s'", apiID)
rows, err := g.DB.Query(query) rows, err := g.DB.Query(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -287,7 +287,7 @@ func (m *Manage) DeleteAPI(c echo.Context) error {
query = fmt.Sprintf("delete from api_release where api_id='%s'", apiID) query = fmt.Sprintf("delete from api_release where api_id='%s'", apiID)
_, err = g.DB.Exec(query) _, err = g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -300,7 +300,7 @@ func (m *Manage) DeleteAPI(c echo.Context) error {
query = fmt.Sprintf("select * from api_define where api_id='%s'", apiID) query = fmt.Sprintf("select * from api_define where api_id='%s'", apiID)
err = g.DB.Get(&api, query) err = g.DB.Get(&api, query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
} }
if api.ParamTable != nil { if api.ParamTable != nil {
d, _ := g.B64.DecodeString(*api.ParamTable) d, _ := g.B64.DecodeString(*api.ParamTable)
@ -314,7 +314,7 @@ func (m *Manage) DeleteAPI(c echo.Context) error {
query = fmt.Sprintf("delete from api_define where api_id='%s'", apiID) query = fmt.Sprintf("delete from api_define where api_id='%s'", apiID)
_, err = g.DB.Exec(query) _, err = g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -335,7 +335,7 @@ func (m *Manage) parseAPI(c echo.Context) (*misc.API, int, string) {
api := &misc.API{} api := &misc.API{}
err := json.Unmarshal([]byte(apiR), &api) err := json.Unmarshal([]byte(apiR), &api)
if err != nil { if err != nil {
g.Info("parse api", zap.Error(err), zap.String("api", string(apiR))) g.L.Info("parse api", zap.Error(err), zap.String("api", string(apiR)))
return nil, g.ParamInvalidC, g.ParamInvalidE return nil, g.ParamInvalidC, g.ParamInvalidE
} }
@ -448,7 +448,7 @@ func (m *Manage) APIRelease(c echo.Context) error {
query := fmt.Sprintf("select * from api_define where api_id='%s'", apiID) query := fmt.Sprintf("select * from api_define where api_id='%s'", apiID)
err := g.DB.Get(&api, query) err := g.DB.Get(&api, query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -462,7 +462,7 @@ func (m *Manage) APIRelease(c echo.Context) error {
_, err = g.DB.Exec(query) _, err = g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -473,7 +473,7 @@ func (m *Manage) APIRelease(c echo.Context) error {
query = fmt.Sprintf("update api_define set release_version='%s' where api_id='%s'", api.ReviseVersion, api.APIID) query = fmt.Sprintf("update api_define set release_version='%s' where api_id='%s'", api.ReviseVersion, api.APIID)
_, err = g.DB.Exec(query) _, err = g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -519,7 +519,7 @@ func (m *Manage) APIOffline(c echo.Context) error {
misc.API_OFFLINE, apiID) misc.API_OFFLINE, apiID)
_, err := g.DB.Exec(query) _, err := g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -531,7 +531,7 @@ func (m *Manage) APIOffline(c echo.Context) error {
query = fmt.Sprintf("update api_define set release_version='%s' where api_id='%s'", "", apiID) query = fmt.Sprintf("update api_define set release_version='%s' where api_id='%s'", "", apiID)
_, err = g.DB.Exec(query) _, err = g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -544,7 +544,7 @@ func (m *Manage) APIOffline(c echo.Context) error {
query = fmt.Sprintf("select * from api_release where api_id='%s'", apiID) query = fmt.Sprintf("select * from api_release where api_id='%s'", apiID)
err = g.DB.Get(&api, query) err = g.DB.Get(&api, query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
} }
if api.ParamTable != nil { if api.ParamTable != nil {
d, _ := g.B64.DecodeString(*api.ParamTable) d, _ := g.B64.DecodeString(*api.ParamTable)
@ -646,7 +646,7 @@ func (m *Manage) APIBatchStrategy(c echo.Context) error {
query = fmt.Sprintf("%s where api_id = '%s'", query, apiID) query = fmt.Sprintf("%s where api_id = '%s'", query, apiID)
res, err := g.DB.Exec(query) res, err := g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -724,7 +724,7 @@ func (m *Manage) APIBatchDelStrategy(c echo.Context) error {
res, err := g.DB.Exec(query) res, err := g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -793,7 +793,7 @@ func (m *Manage) APIBatchRelease(c echo.Context) error {
query := fmt.Sprintf("select * from api_define where api_id='%s'", apiID) query := fmt.Sprintf("select * from api_define where api_id='%s'", apiID)
err := g.DB.Get(&api, query) err := g.DB.Get(&api, query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -807,7 +807,7 @@ func (m *Manage) APIBatchRelease(c echo.Context) error {
_, err = g.DB.Exec(query) _, err = g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -818,7 +818,7 @@ func (m *Manage) APIBatchRelease(c echo.Context) error {
query = fmt.Sprintf("update api_define set release_version='%s' where api_id='%s'", api.ReviseVersion, api.APIID) query = fmt.Sprintf("update api_define set release_version='%s' where api_id='%s'", api.ReviseVersion, api.APIID)
_, err = g.DB.Exec(query) _, err = g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,

@ -33,7 +33,7 @@ func Log(userID string, service string, targetType int, targetID string, opType
userID, service, targetType, targetID, opType, newc, desc) userID, service, targetType, targetID, opType, newc, desc)
_, err := g.DB.Exec(query) _, err := g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("record audit log error", zap.Error(err), zap.String("query", query)) g.L.Info("record audit log error", zap.Error(err), zap.String("query", query))
} }
} }
@ -56,7 +56,7 @@ func Count(c echo.Context) error {
} }
rows, err := g.DB.Query(query) rows, err := g.DB.Query(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -116,7 +116,7 @@ func Load(c echo.Context) error {
} }
err := g.DB.Select(&rs, query) err := g.DB.Select(&rs, query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,

@ -65,7 +65,7 @@ func Create(c echo.Context) error {
Message: "Strategy name already exist", Message: "Strategy name already exist",
}) })
} }
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -103,7 +103,7 @@ func Update(c echo.Context) error {
st.Name, st.SubType, st.Content, st.ID) st.Name, st.SubType, st.Content, st.ID)
_, err := g.DB.Exec(query) _, err := g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -139,7 +139,7 @@ func Load(c echo.Context) error {
err := g.DB.Select(&ss, query) err := g.DB.Select(&ss, query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -191,7 +191,7 @@ func Delete(c echo.Context) error {
} }
_, err := g.DB.Exec(query) _, err := g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -209,7 +209,7 @@ func Delete(c echo.Context) error {
} }
_, err = g.DB.Exec(query) _, err = g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -220,7 +220,7 @@ func Delete(c echo.Context) error {
query = fmt.Sprintf("delete from strategy where id='%s'", id) query = fmt.Sprintf("delete from strategy where id='%s'", id)
_, err = g.DB.Exec(query) _, err = g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -266,7 +266,7 @@ func Change(c echo.Context) error {
query := fmt.Sprintf("update strategy set status='%d' where id='%s'", newS, id) query := fmt.Sprintf("update strategy set status='%d' where id='%s'", newS, id)
_, err := g.DB.Exec(query) _, err := g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,

@ -31,7 +31,7 @@ func (m *Manage) APIQueryParam(c echo.Context) error {
query := fmt.Sprintf("select params from test_api where api_id='%s'", apiID) query := fmt.Sprintf("select params from test_api where api_id='%s'", apiID)
rows, err := g.DB.Query(query) rows, err := g.DB.Query(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,
@ -78,7 +78,7 @@ func (m *Manage) APISaveParam(c echo.Context) error {
_, err = g.DB.Exec(query) _, err = g.DB.Exec(query)
if err != nil { if err != nil {
g.Info("access database error", zap.Error(err), zap.String("query", query)) g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{ return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError, Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC, ErrCode: g.DatabaseC,

@ -20,6 +20,7 @@ type Request struct {
Api *misc.API Api *misc.API
DebugOn bool DebugOn bool
ClientIP string ClientIP string
Url string
BwStrategy *misc.BwStrategy BwStrategy *misc.BwStrategy
RetryStrategy *misc.RetryStrategy RetryStrategy *misc.RetryStrategy
@ -30,7 +31,7 @@ func (r *Request) String() string {
return fmt.Sprintf("method: %s,params: %v, api: %v, client_ip: %s", r.Method, r.Params, *r.Api, r.ClientIP) return fmt.Sprintf("method: %s,params: %v, api: %v, client_ip: %s", r.Method, r.Params, *r.Api, r.ClientIP)
} }
func Parse(c echo.Context) (*Request, error) { func Parse(c echo.Context) (*Request, int, error) {
r := &Request{ r := &Request{
Rid: c.Get("rid").(int64), Rid: c.Get("rid").(int64),
Params: make(map[string]string), Params: make(map[string]string),
@ -67,7 +68,7 @@ func Parse(c echo.Context) (*Request, error) {
//新网关使用以下参数'api_name' //新网关使用以下参数'api_name'
apiName = r.Params["api_name"] apiName = r.Params["api_name"]
if apiName == "" { if apiName == "" {
return r, errors.New("api_name not founded") return r, http.StatusBadRequest, errors.New("api_name not founded")
} }
} }
} else { } else {
@ -84,14 +85,25 @@ func Parse(c echo.Context) (*Request, error) {
// 获取api信息 // 获取api信息
apiI, ok := misc.Apis.Load(apiID) apiI, ok := misc.Apis.Load(apiID)
if !ok { if !ok {
return r, errors.New("api id not exist") return r, http.StatusBadRequest, errors.New("api id not exist")
} }
r.Api = apiI.(*misc.API) r.Api = apiI.(*misc.API)
// 生成策略 // 生成策略
strategy(r) strategy(r)
return r, nil // 获取url
if r.Api.AddrType == misc.ADDR_URL { // direct url
r.Url = r.Api.BackendAddr
} else { // get url from etcd
s := g.GetServer(r.Api.BackendAddr)
if s == nil {
return r, http.StatusServiceUnavailable, errors.New(g.NoServerAvailableE)
}
r.Url = "http://" + s.IP + r.Api.BackendURI
}
return r, 0, nil
} }
func strategy(r *Request) { func strategy(r *Request) {

@ -38,30 +38,35 @@ type router struct {
/*----------------------请求路由---------------------*/ /*----------------------请求路由---------------------*/
func (router *router) route(c echo.Context) error { func (router *router) route(c echo.Context) error {
// 解析请求 // 解析请求
r, err := req.Parse(c) r, status, err := req.Parse(c)
if err != nil { if err != nil {
c.Set("api_id", "error_api_id") c.Set("api_id", "error_api_id")
c.Set("service", "error_service") c.Set("service", "error_service")
c.Set("app", "error_app") c.Set("app", "error_app")
c.Set("error_msg", err) c.Set("error_msg", err)
return c.JSON(http.StatusBadRequest, g.Result{r.Rid, http.StatusBadRequest, g.ParamInvalidC, err.Error(), nil}) return c.JSON(http.StatusOK, g.Result{r.Rid, status, g.ParamInvalidC, err.Error(), nil})
} }
c.Set("api_id", r.Api.APIID) c.Set("api_id", r.Api.APIID)
c.Set("service", r.Api.Service) c.Set("service", r.Api.Service)
c.Set("app", r.Api.App) c.Set("app", r.Api.App)
g.Debug(r.DebugOn, "request content", zap.Int64("rid", r.Rid), zap.String("req", r.String())) if r.DebugOn {
g.DL.Debug("request content", zap.Int64("rid", r.Rid), zap.String("req", r.String()))
} else {
g.L.Debug("request content", zap.Int64("rid", r.Rid), zap.String("req", r.String()))
}
// 判断api是否发布 // 判断api是否发布
if r.Api.Status != misc.API_RELEASED { if r.Api.Status != misc.API_RELEASED {
return c.JSON(http.StatusBadRequest, g.Result{r.Rid, http.StatusBadRequest, manage.APIOfflineC, manage.APIOfflineE, nil}) return c.JSON(http.StatusOK, g.Result{r.Rid, http.StatusBadRequest, manage.APIOfflineC, manage.APIOfflineE, nil})
} }
// 在请求路由之前进行过滤 // 在请求路由之前进行过滤
res := router.BeforeRoute(r) res := router.BeforeRoute(r)
if res.Status != 0 { if res.Status != 0 {
c.Set("error_msg", errors.New(res.Emsg)) c.Set("error_msg", errors.New(res.Emsg))
return c.JSON(res.Status, g.Result{r.Rid, res.Status, res.Ecode, res.Emsg, nil}) return c.JSON(http.StatusOK, g.Result{r.Rid, res.Status, res.Ecode, res.Emsg, nil})
} }
// 开始请求 // 开始请求
@ -80,19 +85,23 @@ func (router *router) route(c echo.Context) error {
// 请求失败,通知客户端 // 请求失败,通知客户端
if err != nil { if err != nil {
c.Set("error_msg", err) c.Set("error_msg", err)
return c.JSON(code, g.Result{r.Rid, code, g.ReqFailedC, err.Error(), nil}) return c.JSON(http.StatusOK, g.Result{r.Rid, code, g.ReqFailedC, err.Error(), nil})
} }
case misc.BACKEND_TYPE_MOCK: case misc.BACKEND_TYPE_MOCK:
code = http.StatusOK code = http.StatusOK
body = talent.String2Bytes(*r.Api.MockData) body = talent.String2Bytes(*r.Api.MockData)
} }
g.Debug(r.DebugOn, "response body", zap.Int64("rid", r.Rid), zap.Int("code", code), zap.String("body", talent.Bytes2String(body))) if r.DebugOn {
g.DL.Debug("response body", zap.Int64("rid", r.Rid), zap.Int("code", code), zap.String("body", talent.Bytes2String(body)))
} else {
g.L.Debug("response body", zap.Int64("rid", r.Rid), zap.Int("code", code), zap.String("body", talent.Bytes2String(body)))
}
// 成功时把请求id放在header中返回避免污染返回结果 // 成功时把请求id放在header中返回避免污染返回结果
c.Response().Header().Add("rid", strconv.FormatInt(r.Rid, 10)) c.Response().Header().Add("rid", strconv.FormatInt(r.Rid, 10))
// 返回给客户端成功的结果 // 返回给客户端请求的结果
return c.String(code, talent.Bytes2String(body)) return c.String(code, talent.Bytes2String(body))
} }
@ -124,17 +133,7 @@ func (rt *router) sync(r *req.Request) (int, []byte, error) {
// 写入客户端真实ip // 写入客户端真实ip
req.Header.Set("X-Forwarded-For", r.ClientIP) req.Header.Set("X-Forwarded-For", r.ClientIP)
var url string var url = r.Url
// 获取url
if r.Api.AddrType == misc.ADDR_URL { // direct url
url = r.Api.BackendAddr
} else { // get url from etcd
s := g.GetServer(r.Api.BackendAddr)
if s == nil {
return http.StatusServiceUnavailable, nil, errors.New("no server available")
}
url = "http://" + s.IP + r.Api.BackendURI
}
switch r.Api.Method { switch r.Api.Method {
case "GET": case "GET":
// 拼接url // 拼接url

@ -39,7 +39,7 @@ var apiCmd = &cobra.Command{
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
misc.InitConfig("juz.conf") misc.InitConfig("juz.conf")
g.InitLogger(misc.Conf.Common.LogLevel) g.InitLogger(misc.Conf.Common.LogLevel)
g.Info("Application version", zap.String("version", misc.Conf.Common.Version)) g.L.Info("Application version", zap.String("version", misc.Conf.Common.Version))
p := &api.ApiServer{} p := &api.ApiServer{}
p.Start() p.Start()
@ -49,7 +49,7 @@ var apiCmd = &cobra.Command{
signal.Notify(chSig, syscall.SIGINT, syscall.SIGTERM) signal.Notify(chSig, syscall.SIGINT, syscall.SIGTERM)
sig := <-chSig sig := <-chSig
g.Info("juz received signal", zap.Any("signal", sig)) g.L.Info("juz received signal", zap.Any("signal", sig))
}, },
} }

@ -36,7 +36,7 @@ var trafficCmd = &cobra.Command{
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
misc.InitConfig("juz.conf") misc.InitConfig("juz.conf")
g.InitLogger(misc.Conf.Common.LogLevel) g.InitLogger(misc.Conf.Common.LogLevel)
g.Info("Application version", zap.String("version", misc.Conf.Common.Version)) g.L.Info("Application version", zap.String("version", misc.Conf.Common.Version))
p := &traffic.Traffic{} p := &traffic.Traffic{}
p.Start() p.Start()
@ -46,7 +46,7 @@ var trafficCmd = &cobra.Command{
signal.Notify(chSig, syscall.SIGINT, syscall.SIGTERM) signal.Notify(chSig, syscall.SIGINT, syscall.SIGTERM)
sig := <-chSig sig := <-chSig
g.Info("juz received signal", zap.Any("signal", sig)) g.L.Info("juz received signal", zap.Any("signal", sig))
}, },
} }

@ -6,7 +6,8 @@ common:
api: api:
port: "8081" port: "8081"
serverid: 1 serverid: 1
cors:
- "MF-Token"
manage: manage:
port: "8089" port: "8089"

@ -30,6 +30,7 @@ type Config struct {
Api struct { Api struct {
Port string Port string
ServerID int64 ServerID int64
Cors []string
} }
Manage struct { Manage struct {
Port string Port string

@ -132,12 +132,12 @@ func InitMysql() {
Conf.Mysql.Addr, Conf.Mysql.Port, Conf.Mysql.Database) Conf.Mysql.Addr, Conf.Mysql.Port, Conf.Mysql.Database)
g.DB, err = sqlx.Open("mysql", sqlConn) g.DB, err = sqlx.Open("mysql", sqlConn)
if err != nil { if err != nil {
g.Fatal("init mysql error", zap.Error(err)) g.L.Fatal("init mysql error", zap.Error(err))
} }
// 测试db是否正常 // 测试db是否正常
err = g.DB.Ping() err = g.DB.Ping()
if err != nil { if err != nil {
g.Fatal("init mysql, ping error", zap.Error(err)) g.L.Fatal("init mysql, ping error", zap.Error(err))
} }
} }

@ -29,7 +29,7 @@ func (t *Traffic) loadAll() {
strategies := make([]*misc.Strategy, 0) strategies := make([]*misc.Strategy, 0)
err := g.DB.Select(&strategies, "select * from strategy") err := g.DB.Select(&strategies, "select * from strategy")
if err != nil { if err != nil {
g.Fatal("load strategies error!", zap.Error(err)) g.L.Fatal("load strategies error!", zap.Error(err))
} }
for _, s := range strategies { for _, s := range strategies {
@ -53,7 +53,7 @@ func (t *Traffic) loadUpdated() {
query := fmt.Sprintf("select * from strategy where modify_date >= '%s'", lastT) query := fmt.Sprintf("select * from strategy where modify_date >= '%s'", lastT)
err := g.DB.Select(&strategies, query) err := g.DB.Select(&strategies, query)
if err != nil { if err != nil {
g.Error("load strategies error!", zap.Error(err), zap.String("query", query)) g.L.Error("load strategies error!", zap.Error(err), zap.String("query", query))
return return
} }

@ -33,7 +33,7 @@ func (t *Traffic) Start() {
} }
func (t *Traffic) Shutdown() { func (t *Traffic) Shutdown() {
g.Info("shutdown tfe..") g.L.Info("shutdown tfe..")
} }
type RateLimiter struct{} type RateLimiter struct{}
@ -49,20 +49,20 @@ func (t *Traffic) startRpcServer() {
server := rpc.NewServer() server := rpc.NewServer()
err := server.Register(rl) err := server.Register(rl)
if err != nil { if err != nil {
g.Fatal("register error", zap.Error(err)) g.L.Fatal("register error", zap.Error(err))
} }
g.Info("Listen tcp on port", zap.String("port", misc.Conf.Traffic.Port)) g.L.Info("Listen tcp on port", zap.String("port", misc.Conf.Traffic.Port))
l, err := net.Listen("tcp", ":"+misc.Conf.Traffic.Port) l, err := net.Listen("tcp", ":"+misc.Conf.Traffic.Port)
if err != nil { if err != nil {
g.Fatal("listen error", zap.Error(err)) g.L.Fatal("listen error", zap.Error(err))
} }
go func() { go func() {
for { for {
conn, err := l.Accept() conn, err := l.Accept()
if err != nil { if err != nil {
g.Error("accept error", zap.Error(err)) g.L.Error("accept error", zap.Error(err))
continue continue
} }
server.ServeConn(conn) server.ServeConn(conn)

Loading…
Cancel
Save