上一个章节,我们搞定了golang获取系统信息,在这一课,我们需要搭建一个简易的web服务器,将设备信息通过gin的json接口提供给网页。
Gin的web服务开启后会长期提供服务,上一课的获取CPU占用信息内容,需要延时1秒才可以得到结果。这个情况会影响客户体验,我们可以通过golang实现简单的并发程序。
由于golang的全局变量是可以多个并发同时访问的,而我们这边只涉及到两个线程(Gin的服务线程读取CPU占用信息,获取CPU占用信息的线程写入CPU占用信息)。这种简单的应用,并不需要设置什么读写锁,也不需要考虑什么线程安全问题,直接使用全局变量就行了。
所以我们将上一期的代码修改成独立的文件sysinfo.go
package main
import (
"github.com/shirou/gopsutil/cpu"
"github.com/shirou/gopsutil/host"
"github.com/shirou/gopsutil/mem"
"time"
)
var AvailableMemory float64
var UsedPercent float64
var ModelName string
var AvgPercent float64
var UpTime float64
var KernelVersion string
func getCpuInfo() {
perPercents, _ := cpu.Percent(1*time.Second, false)
AvgPercent = perPercents[0]
}
func getUpTime() {
timestamp, _ := host.BootTime()
t := time.Unix(int64(timestamp), 0)
now := time.Now()
duration := now.Sub(t)
UpTime = duration.Hours()
}
// 获取内存信息
func getMemInfo() {
memInfo, _ := mem.VirtualMemory()
AvailableMemory = float64(memInfo.Available) / (1024 * 1024 * 1024)
UsedPercent = memInfo.UsedPercent
}
func getCPUAndUptime() {
for {
getMemInfo()
getCpuInfo()
getUpTime()
time.Sleep(5 * time.Second)
}
}
func getInfo() {
// 获取cpu信息和系统平台信息
infos, _ := cpu.Info()
ModelName = infos[0].ModelName
kernel, _ := host.KernelVersion()
platform, _, _, _ := host.PlatformInformation()
KernelVersion = kernel + "--" + platform
// 开启另一个线程获取CPU、内存、开机时间
go getCPUAndUptime()
}
这个代码其实很简单,就是开启一个线程,每隔5秒钟获取一次信息存储到全局变量里。同时在getInfo函数里,会获取一些不会变化的信息,例如CPU类型,内核版本,等等。
Gin是一个用Go语言编写的Web框架,它具有高性能和低内存消耗的特点。Gin框架提供了快速的路由功能、中间件支持、参数解析、JSON/XML响应等功能,使得编写Web应用变得简单和高效。可以使用Gin框架来构建RESTful API、Web服务等。
根据官方文档的提示,使用Gin编写一个提供JSON响应接口的web 服务器很简单。代码如下
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func setupRouter() *gin.Engine {
gin.SetMode(gin.ReleaseMode)
r := gin.Default()
r.GET("/getSystemInfo", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"ModelName": ModelName,
"MemAvailable": AvailableMemory * 1024,
"MemUsed": UsedPercent,
"CPUAvgPercent": AvgPercent,
"UpTime": UpTime,
"KernelVersion": KernelVersion,
})
})
return r
}
func main() {
getInfo()
r := setupRouter()
// Listen and Server in 0.0.0.0:8080
r.Run(":80")
}
就是这么简单的代码,就可以开启一个绑定了80端口的web服务器,这个服务器提供了一个/getSystemInfo路径的JSON接口,用于提供我们获取到的系统信息。我们可以在另一台电脑上,使用curl命令来测试。
我们在开发板上,也可以看到这个服务程序的响应速度,以及访问的客户端IP。几百微秒就完成响应了,可以说在T113-i上做这种简单的应用,完全是小意思。
更多回帖