go 性能监测、gin、resty、gin等框架的使用

本文介绍了Golang中的 Gin 框架和 go-resty 库的使用方法,以及如何利用pprof进行性能监控。通过pprof的内存和CPU使用情况查看,可以有效地优化Go应用的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

加载顺序

go语言标准规定了多个编译单元的初始化顺序,包的初始化顺序按照包引入的顺序进行初始化,如果有依赖关系先解决依赖关系,按依赖的顺序进行初始化。
  • 如果某个包被多次导入的话,也只会初始化一次。
  • 对于同一个包中的多个 .go 文件,实现一般按照文件名排序,进行初始化
  • 首先按顺序初始化全局常量和变量,如果有依赖关系先解决依赖关系,按依赖的顺序进行初始化
  • 再调用 init 函数进行初始化

并且go语言是不允许包循环引用的,也不允许全局常量变量循环引用。
总结来说,不用担心全局变量之间的初始化顺序了。

gin

 
router := gin.Default()
//静态资源映射
router.StaticFile("/favicon.ico", "./resources/favicon.ico/gomod.html")


// 导入所有模板,多级目录结构需要这样写
router.LoadHTMLGlob("./resources/favicon.ico/*")


// website分组
v := router.Group("/")
{
   v.GET("/index.html", IndexHandler)
}


router.GET("/", func(c *gin.Context) {
   time.Sleep(5 * time.Second)
   c.String(http.StatusOK, "Welcome Gin Server")
})


//router.Run(":8080")
srv := &http.Server{
   Addr:    ":8080",
   Handler: router,
}


go func() {
   // service connections
   if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
      log.Fatalf("listen: %s\n", err)
   }
}()


// Wait for interrupt signal to gracefully shutdown the server with
// a timeout of 5 seconds.
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
<-quit
log.Println("Shutdown Server ...")


ctx, cancel := context.WithTimeout(context.Background(), 5* time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
   log.Fatal("Server Shutdown:", err)
}
log.Println("Server exiting")

//模板映射功能
func IndexHandler(c *gin.Context) {
   time.Sleep(21 * time.Second)
   c.HTML(http.StatusOK, "index.html", gin.H{
      "Title": "作品欣赏",
   })
}

以上优雅停止服务,要测试的话需要通过命令行启动 go run .\main_gin.go   然后CTL+C 退出就可以看到效果了,如果此时正在请求服务端,并且请求还未结束(比如sleep5秒),那么结束的时候会等此请求结束后停止的

go-resty

简单的get请求加上重试机制
 
  client := resty.New()
   client.SetRetryCount(3).
      SetRetryWaitTime(1 * time.Second).
      SetRetryMaxWaitTime(2 * time.Second).
      SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
         println("我已经重试过了")
         return 0, errors.New("quota exceeded")
      })


   //resp, err := client.R().Get("http://httpbin.org/get")
   resp, err := client.R().Get("http://localhost:8081/sync/initTemplateCategory")
   fmt.Printf("\nError: %v", err)
   fmt.Printf("\nResponse Status Code: %v", resp.StatusCode())
   fmt.Printf("\nResponse Status: %v", resp.Status())
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

alexander137

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值