项目地址
n9e-transfer-proxy
架构说明
- 分析前端请求发现在使用
m3db
作为后端时需要下面4
个接口
/*
下面对应都是transfer
- Request URL: http://127.0.0.1:8032/api/index/metrics 对应 QueryMetrics(recv dataobj.EndpointsRecv) *dataobj.MetricResp
- Request URL: http://127.0.0.1:8032/api/index/tagkv 对应 QueryTagPairs(recv dataobj.EndpointMetricRecv) []dataobj.IndexTagkvResp
- Request URL: http://127.0.0.1:8032/api/index/counter/fullmatch 对应 QueryIndexByFullTags(recv []dataobj.IndexByFullTagsRecv) ([]dataobj.IndexByFullTagsResp, int)
- Request URL: http://127.0.0.1:8032/api/transfer/data/ui 对应 QueryDataForUI(input dataobj.QueryDataForUI) []*dataobj.TsdbQueryResponse
*/
- 所以
proxy
只需要实现上述4个接口的代理即可 - 将原始请求并发打向后端所有
transfer
接口 - 将数据
merge
后在返回前端 - 在使用
m3db
作为存储时,有布隆过滤器
顶在最前端,所以查询不存在该机房的数据所引发的资源开销不大 - 优化点可以在
proxy
hold一个map,将请求的endpoint精细打向执行的机房 - map的来源可以是长链接server端的数据
使用说明
编译 or 下载二进制
# 编译
export GOPROXY=https://goproxy.io,direct
export GO111MODULE=on
go build src/main.go -o n9e-transfer-proxy
# 下载二进制
wget https://github.com/ning1875/n9e-transfer-proxy/releases/download/v1.0/n9e-transfer-proxy-1.0.linux-amd64.tar.gz
修改配置文件
启动proxy服务
n9e-transfer-proxy --config.file="n9e-transfer-proxy.yml"
修改n9e前端指向的nginx.conf
- 将使用
m3db
作为后端时的/api/index /api/transfer指到proxy
即可
upstream n9e.proxy {
server proxy的地址如 localhost:9032;
keepalive 60;
}
location /api/index {
proxy_pass http://n9e.proxy;
}
location /api/transfer {
proxy_pass http://n9e.proxy;
}
transfer的路由中还有些path没实现,但是看起来和前端请求无关,可以自行实现下
或者在修改nginx配置时精细化 比如只配置以下4条和前端相关的指向proxy,其余的还是指向transfer
/api/index/metrics
/api/index/tagkv
/api/index/counter/fullmatch
/api/transfer/data/ui
upstream n9e.proxy {
server proxy的地址如 localhost:9032;
keepalive 60;
}
location /api/index/metrics {
proxy_pass http://n9e.proxy;
}
location /api/index/tagkv {
proxy_pass http://n9e.proxy;
}
location /api/index/counter/fullmatch {
proxy_pass http://n9e.proxy;
}
location /api/transfer {
proxy_pass http://n9e.proxy;
}
func Config(r *gin.Engine) {
sys := r.Group("/api/transfer")
{
sys.GET("/ping", ping)
sys.GET("/pid", pid)
sys.GET("/addr", addr)
sys.POST("/stra", getStra)
sys.POST("/which-tsdb", tsdbInstance)
sys.POST("/which-judge", judgeInstance)
sys.GET("/alive-judges", judges)
sys.POST("/push", PushData)
sys.POST("/data", QueryData)
sys.POST("/data/ui", QueryDataForUI)
}
index := r.Group("/api/index")
{
index.POST("/metrics", GetMetrics)
index.POST("/tagkv", GetTagPairs)
index.POST("/counter/clude", GetIndexByClude)
index.POST("/counter/fullmatch", GetIndexByFullTags)
}
pprof.Register(r, "/api/transfer/debug/pprof")
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。