既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取 Nginx 统计数据失败:", err)
return
}
stats := string(body)
lines := strings.Split(stats, "\n")
for \_, line := range lines {
if strings.Contains(line, "Active connections") {
fmt.Println(line)
} else if strings.HasPrefix(line, "server accepts handled") {
parts := strings.Fields(line)
fmt.Println("接受的连接数:", parts[2])
fmt.Println("处理的连接数:", parts[3])
fmt.Println("已经完成的请求次数:", parts[4])
} else if strings.HasPrefix(line, "Reading: ") {
parts := strings.Fields(line)
fmt.Println("正在读取的连接数:", parts[1])
} else if strings.HasPrefix(line, "Writing: ") {
parts := strings.Fields(line)
fmt.Println("正在写入的连接数:", parts[1])
} else if strings.HasPrefix(line, "Waiting: ") {
parts := strings.Fields(line)
fmt.Println("等待的连接数:", parts[1])
}
}
}
上述代码首先将响应数据按行拆分,并进行逐行解析。根据 Nginx 统计模块的文档,我们可以判断每一行的内容是哪些流量数据,并输出相应的信息。
#### 3. 定时采集数据
为了实现实时监控和分析,我们可以使用 Golang 的 `time` 包定时采集数据,并将数据保存到文件或发送到服务器进行进一步分析。
package main
import (
“fmt”
“io/ioutil”
“net/http”
“strings”
“time”
)
func main() {
ticker := time.NewTicker(10 * time.Second)
defer ticker.Stop()
for range ticker.C {
resp, err := http.Get("http://localhost/nginx\_status")
if err != nil {
fmt.Println("获取 Nginx 统计数据失败:", err)
continue
}
body, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
if err != nil {
fmt.Println("读取 Nginx 统计数据失败:", err)
continue
}
stats := string(body)
lines := strings.Split(stats, "\n")
for \_, line := range lines {
// 解析流量数据...
}
}
}
上述代码使用 `time.NewTicker` 创建一个定时器,每隔 10 秒钟采集一次数据。在每次定时器触发时,发送 HTTP 请求获取数据,并进行解析和处理。您可以根据需要调整定时器的间隔。
### 步骤三:数据监控和分析
最后,我们可以将采集到的数据进行实时监控和分析。您可以使用各种工具和库来实现这一点,如 ECharts、Grafana 等。在此处,我们以 ECharts 为例,展示如何实时展示流量数据。
package main
import (
“fmt”
“io/ioutil”
“net/http”
“strings”
“time”
"github.com/go-echarts/go-echarts/charts"
"github.com/go-echarts/go-echarts/opts"
"github.com/go-echarts/go-echarts/templates"
)
var (
activeConnections []opts.LineData
accepts []opts.LineData
handled []opts.LineData
requests []opts.LineData
reading []opts.LineData
writing []opts.LineData
waiting []opts.LineData
)
func main() {
http.HandleFunc(“/”, func(w http.ResponseWriter, req *http.Request) {
page := charts.NewPage()
line := charts.NewLine()
line.SetGlobalOptions(
charts.InitOpts{PageTitle: "接口流量监控"},
charts.ToolboxOpts{Show: true},
charts.YAxisOpts{Name: "数量"},
charts.XAxisOpts{Name: "时间"},
)
line.AddXAxis(timeValues())
line.AddYAxis("Active Connections", activeConnections)
line.AddYAxis("Accepts", accepts)
line.AddYAxis("Handled", handled)
line.AddYAxis("Requests", requests)
line.AddYAxis("Reading", reading)
line.AddYAxis("Writing", writing)
line.AddYAxis("Waiting", waiting)
page.Add(line)
w.Header().Set("Content-Type", "text/html; charset=utf-8")
page.Render(w)
})
go func() {
ticker := time.NewTicker(10 \* time.Second)
defer ticker.Stop()
for range ticker.C {
resp, err := http.Get("http://localhost/nginx\_status")
if err != nil {
fmt.Println("获取 Nginx 统计数据失败:", err)
continue
}
body, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
if err != nil {
fmt.Println("读取 Nginx 统计数据失败:", err)
continue
}
stats := string(body)
lines := strings.Split(stats, "\n")
for \_, line := range lines {
// 解析流量数据...
}
line := charts.NewLine()
line.SetGlobalOptions(
charts.InitOpts{PageTitle: "接口流量监控"},
charts.ToolboxOpts{Show: true},
charts.YAxisOpts{Name: "数量"},
charts.XAxisOpts{Name: "时间"},
)
line.AddXAxis(timeValues())
line.AddYAxis("Active Connections", activeConnections)
line.AddYAxis("Accepts", accepts)
line.AddYAxis("Handled", handled)
line.AddYAxis("Requests", requests)
line.AddYAxis("Reading", reading)
line.AddYAxis("Writing", writing)
line.AddYAxis("Waiting", waiting)
page := charts.NewPage()
page.Add(line)
s := templates.MustString(echartsTemplate, page)
ioutil.WriteFile("index.html", []byte(s), 0644)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!