RPC增加数据mock能力

This commit is contained in:
2022-10-14 14:54:20 +08:00
parent cc32decb80
commit b6aaa49ab6
5 changed files with 87 additions and 35 deletions

111
rpc.go
View File

@ -14,7 +14,9 @@ import (
"errors"
"fmt"
"io"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"strings"
"sync"
@ -73,6 +75,10 @@ func InitRPCFromCfgDir(cfgDir string, logger *zap.Logger) error {
if err = util.File.ReadAnyFileContent(filepathNames[i], &serviceInfo); nil != err {
return err
}
if len(serviceInfo.MockPath) == 0 {
// 填充默认的mock数据存储路径
serviceInfo.MockPath = util.Project.BuildPath("mock")
}
serviceTable[serviceInfo.Flag] = &serviceInfo
}
return InitRPC(serviceTable, logger)
@ -268,6 +274,7 @@ func (r *request) Send(ctx *gin.Context, serviceFlag string, apiFlag string, par
response *httpclient.Response
responseBody []byte
code, message, data string
mockFilePath string
)
// 日志数据
@ -284,48 +291,60 @@ func (r *request) Send(ctx *gin.Context, serviceFlag string, apiFlag string, par
logDataList = append(logDataList, zap.Any("read_api_config_fail", err.Error()))
return err
}
logDataList = append(logDataList, zap.Any("api_config", apiConfig))
logDataList = append(logDataList,
zap.Any("api_config", apiConfig),
zap.Any("service_mock_enable", serviceConfig.MockEnable),
zap.Any("api_mock_enable", apiConfig.MockEnable),
)
// 完整的请求地址
fullURL, body = r.getFullURLAndBody(serviceConfig, apiConfig, parameter)
if responseBody, mockFilePath, err = r.getMockData(serviceConfig, apiConfig); nil == err {
logDataList = append(logDataList, zap.Any("mock_file_path", mockFilePath))
} else {
logDataList = append(logDataList,
zap.Any("mock_file_path", mockFilePath),
zap.Any("mock_disable_reason", err.Error()),
)
// 完整的请求地址
fullURL, body = r.getFullURLAndBody(serviceConfig, apiConfig, parameter)
logDataList = append(logDataList, zap.String("full_utl", fullURL))
fullHeader := make(map[string]string)
for k, v := range apiConfig.Header {
fullHeader[k] = v
}
for k, v := range header {
fullHeader[k] = v
}
// 获取客户端
client = r.GetHttpClient(fullHeader, apiConfig.Timeout)
var bodyReader io.Reader
if nil != body {
logDataList = append(logDataList, zap.String("request_body", string(body)))
bodyReader = bytes.NewReader(body)
}
logDataList = append(logDataList, zap.String("full_utl", fullURL))
fullHeader := make(map[string]string)
for k, v := range apiConfig.Header {
fullHeader[k] = v
}
for k, v := range header {
fullHeader[k] = v
}
// 获取客户端
client = r.GetHttpClient(fullHeader, apiConfig.Timeout)
var bodyReader io.Reader
if nil != body {
logDataList = append(logDataList, zap.String("request_body", string(body)))
bodyReader = bytes.NewReader(body)
}
requestStartTime := time.Now().UnixNano() / 1e6
requestFinishTime := int64(0)
requestStartTime := time.Now().UnixNano() / 1e6
requestFinishTime := int64(0)
logDataList = append(logDataList, zap.Int64("start_time", requestStartTime))
if response, err = client.Do(apiConfig.Method, fullURL, apiConfig.Header, bodyReader); nil != err {
requestFinishTime = time.Now().UnixNano() / 1e6
logDataList = append(logDataList, zap.Int64("finish_time", requestFinishTime))
logDataList = append(logDataList, zap.Int64("used_time", requestFinishTime-requestStartTime))
logDataList = append(logDataList, zap.String("request_fail_reason", err.Error()))
return err
}
logDataList = append(logDataList, zap.Int64("start_time", requestStartTime))
if response, err = client.Do(apiConfig.Method, fullURL, apiConfig.Header, bodyReader); nil != err {
requestFinishTime = time.Now().UnixNano() / 1e6
logDataList = append(logDataList, zap.Int64("finish_time", requestFinishTime))
logDataList = append(logDataList, zap.Int64("used_time", requestFinishTime-requestStartTime))
logDataList = append(logDataList, zap.String("request_fail_reason", err.Error()))
return err
}
logDataList = append(logDataList, zap.Any("response_header", response.Header))
logDataList = append(logDataList, zap.Any("response_http_code", response.StatusCode))
requestFinishTime = time.Now().UnixNano() / 1e6
logDataList = append(logDataList, zap.Int64("finish_time", requestFinishTime))
logDataList = append(logDataList, zap.Int64("used_time", requestFinishTime-requestStartTime))
logDataList = append(logDataList, zap.Any("response_header", response.Header))
logDataList = append(logDataList, zap.Any("response_http_code", response.StatusCode))
if responseBody, err = r.getResponseBody(response); nil != err {
logDataList = append(logDataList, zap.String("read_body_fail_reason", err.Error()))
return err
if responseBody, err = r.getResponseBody(response); nil != err {
logDataList = append(logDataList, zap.String("read_body_fail_reason", err.Error()))
return err
}
}
logDataList = append(logDataList, zap.Any("response_body", string(responseBody)))
@ -352,6 +371,30 @@ func (r *request) Send(ctx *gin.Context, serviceFlag string, apiFlag string, par
return err
}
// getMockData 获取mock数据
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 14:29 2022/10/14
func (r *request) getMockData(serviceConfig *Service, apiConfig *Api) ([]byte, string, error) {
mockFilePath := util.Project.BuildPath(serviceConfig.MockPath, serviceConfig.Flag, apiConfig.Flag+".json")
if !serviceConfig.MockEnable || !apiConfig.MockEnable {
// 未启用mock服务
return nil, mockFilePath, errors.New("mock is forbidden")
}
var (
err error
mockData []byte
)
if _, err = os.Stat(mockFilePath); nil != err {
return nil, mockFilePath, errors.New("get mock fileInfo fail : " + err.Error())
}
if mockData, err = ioutil.ReadFile(mockFilePath); nil != err {
return nil, mockFilePath, errors.New("read mock file content fail :" + err.Error())
}
return mockData, mockFilePath, nil
}
// getResponseBody 获取响应体
//
// Author : go_developer@163.com<白茶清欢>