Go Web 框架
1. 原生
Go 的 net/http
库比较丰富,借助 mux 即可自己完成一个 server 基本需求。
router := mux.NewRouter() router.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) { resp.Write([]byte("ok")) }) httpServer := &http.Server{ Addr: ":8080", Handler: router, } go func() { if err := s.HTTPServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("server error, %s\n", err) } }()
2. gin
gin 是一个 Go 的 Web 框架,当然很多的其它框架。
router := gin.New() router.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "ok") }) srv := &http.Server{ Addr: ":8080", Handler: router, } go func() { if err := server.HttpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("server failure : %s\n", err) } }()
有没发现,gin 的定位类似 mux,也是在解决路由问题。
当然,gin 除了提供 router 之外,还提供了 middleware 的功能,middleware 对于一个 Web Server 来讲是至关重要的,比如你可以:
func AuthRequired() gin.HandlerFunc { return func(c *gin.Context) { token := c.Request.Header.Get("X-Login-Token") if token != "xxx" { c.String(http.StatusUnauthorized, "login required") c.Abort() // must abort to next handler return } c.Set("username", "xxx") c.Next() } } apiv1 := r.Group("/api/v1") apiv1.Use(AuthRequired())
3. 结论
使用原生的库还是框架,我的思路是:
- 如果服务侧重于 agent/proxy 对外暴露的 API 比较单一,比如用于收集机器 metric 的 exporter,建议使用原生
- 如果服务侧重于业务,对外暴露的 API 很多,需要分组和鉴权相关,建议用框架
本文档的示例用的都是 gin,其实区别不大的。