使用golang反向代理统计api访问次数
2021-03-14 03:38
标签:images 目标地址 tle mon amp 技术 term 构造 情况 今天写点有趣的小东西。事情是这样的,我经常看到有些软件加了统计数据的sdk,之后就可以实现统计接口的访问量,接口负载等等数据。而这些功能不需要原有的软件做些什么,对原来的业务完全无***,我觉得这样的功能很有实用性,所以没有参考其他类似的软件或者工具,我想自己试试怎么实现这样的功能。 首先,我们先给要做的工具起个名字,就叫monitor。要实现无侵入,那么只能是在业务软件外面套一层,经由业务软件的流量,都需要经过monitor这一层,这让人很容易得想到了网关的功能也是类似的。恰好,golang实现反向代理十分简单。所以,思路就有了。先实现一个反向代理,将经由业务的流量都由monitor反向代理给业务软件。接着,将访问的api放进通道中,对api进行分类,就可以统计api的访问量了。在这篇文章中,我还会用一个golang的图形库,这个库很酷,可以在终端图形化地展示我们的数据统计。 我们先构造一个proxy类型为*httputil.ReverseProxy,这个proxy的req会向目标地址访问,也就是我们要代理的目标访问。这段代码中,我们用9090反向代理了9091端口,也就是说,访问9091的流量会经过9090,这样我们就可以在这之间收集我们要的数据。我将req.RequestURI放进了一个channel中来实现统计。 我还想要把统计的数据用图形化的方式展现出来。我用了github.com/gizak/termui,一个很棒的图形库。 接着,写一个定时器,每秒钟刷新数据,并渲染图形。 先写个监听9091端口的test,并运行起来。 启动monitor,并访问9090端口。 访问多几个不同的api,之后查看monitor界面。 使用golang的反向代理可以简单地实现api统计的功能,并且在此基础上可以有其他的扩展,可以统计api负载情况,可以统计访问频率等等数据,在图形化界面上也可以展示更多聚合数据。完整代码可见:https://github.com/TomatoMr/monitor。 欢迎关注我的公众号:onepunchgo,给我留言。 使用golang反向代理统计api访问次数 标签:images 目标地址 tle mon amp 技术 term 构造 情况 原文地址:https://blog.51cto.com/14664952/2478471思路
实现反向代理
func NewMultipleHostsReverseProxy(target url.URL) *httputil.ReverseProxy {
director := func(req *http.Request) {
req.URL.Scheme = target.Scheme
req.URL.Host = target.Host
req.URL.Path = target.Path
go func() {
ch
//更新访问数据
go func() {
for {
select {
case label :=
渲染数据
首先初始化界面参数。 //初始化图形数据
bc := widgets.NewBarChart()
bc.Title = "api访问量"
bc.SetRect(5, 5, 100, 25)
bc.BarWidth = 5
bc.BarColors = []ui.Color{ui.ColorRed, ui.ColorGreen}
bc.LabelStyles = []ui.Style{ui.NewStyle(ui.ColorBlue)}
bc.NumStyles = []ui.Style{ui.NewStyle(ui.ColorYellow)}
uiEvents := ui.PollEvents()
ticker := time.NewTicker(time.Second).C
for {
select {
case e := ":
return
}
case
测试
func TestProxy(t *testing.T) {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello 9091"))
})
log.Fatal(http.ListenAndServe(":9091", nil))
}
总结