Go中7个流行的网络框架

1,774 阅读8分钟

自推出以来,Golang(谷歌的Go编程语言)已经成为编写API和网络服务的一个强大而流行的选择。这个列表汇编了Go语言中最受欢迎的七个网络框架--从统计学角度来看。

你可能还想看看DeepSource的Go静态分析,它可以检测出Go代码中300多个错误风险、反模式和安全漏洞。

1.Gin

Gin Gin是一个HTTP网络框架,具有类似于Martini的API,其性能要好得多 -- 最多可提高40倍。如果你需要惊人的性能,就给自己买点Gin吧。

特点

  • 更快的性能。基于Radix树的路由,内存占用小。无反射。可预测的API性能。
  • 中间件支持。一个传入的HTTP请求可以由一连串的中间件和最终的行动来处理。比如说。Logger, Authorization, GZIP,最后在数据库中发布消息。
  • 无崩溃。Gin可以捕捉到在HTTP请求中发生的恐慌,并恢复它。这样一来,你的服务器将永远可用。作为一个例子--它也可以向Sentry报告这种恐慌!
  • JSON验证。Gin可以解析和验证一个请求的JSON,例如,检查所需的值是否存在。
  • 路由分组。更好地组织你的路由。需要授权与不需要授权,不同的API版本......此外,分组可以无限嵌套而不降低性能。
  • 错误管理。Gin提供了一个方便的方法来收集HTTP请求期间发生的所有错误。最终,中间件可以把它们写进日志文件、数据库并通过网络发送。
  • 渲染内置:Gin为JSON、XML和HTML渲染提供了一个易于使用的API。
  • 可扩展。创建一个新的中间件是非常容易的,只要看看示例代码就可以了。

安装

go get -u github.com/gin-gonic/gin

注意: 需要Go v1.10以上版本。

Hello world示例

来源github.com/gin-gonic/g…

文档gin-gonic.com/docs/

2.Beego

Beego Beego用于快速开发RESTful APIs、Web应用和后端服务。它的灵感来自Tornado、Sinatra和Flask。Beego有一些Go特有的功能,如接口和结构嵌入。

特点

  • 支持RESTful,MVC模型,使用bee工具快速构建你的应用程序,功能包括代码热编译,自动测试,自动打包和部署。
  • 通过智能路由和监控,它能够监控你的QPS,内存和CPU的使用,以及goroutine状态。它为你提供对你的在线应用程序的完全控制。
  • 拥有强大的内置模块,包括会话控制、缓存、日志、配置解析、性能监督、上下文处理、ORM支持和请求模拟。你可以为任何类型的应用程序提供强大的基础。
  • 通过原生的Go http包来处理请求和高效的goroutine并发。你的Beego应用程序可以处理大量的流量,就像Beego在许多产品中做的那样。

安装

go get -u github.com/astaxie/beego

你好,世界的例子

package main

import "github.com/astaxie/beego"

func main(){
    beego.Run()
}

来源github.com/astaxie/bee…

文档beego.me/docs/intro/

3.回声

Echo Echo将自己定位为高性能和简约的网络框架。

功能介绍

  • 优化的路由器。高度优化的HTTP路由器,零动态内存分配,智能地确定路由的优先次序。
  • 可扩展性。建立强大和可扩展的RESTful API,容易组织成组。
  • 自动TLS:自动安装来自Let's Encrypt的TLS证书。
  • HTTP/2支持。对HTTP/2的支持提高了速度并提供了更好的用户体验。
  • 中间件。许多内置的中间件可以使用,或者定义你自己的。中间件可以在根、组或路由级别设置。
  • 数据绑定。对HTTP请求有效载荷进行数据绑定,包括JSON、XML或表单数据。
  • 数据渲染。发送各种HTTP响应的API,包括JSON, XML, HTML, File, Attachment, Inline, Stream 或 Blob。
  • 模板化。使用任何模板引擎进行模板渲染。
  • 可扩展性。定制的中央HTTP错误处理。易于扩展的API。

安装

go get -u github.com/labstack/echo

你好,世界的例子

来源github.com/labstack/ec…

文档echo.labstack.com/guide

4.Go套件

Go Kit Go套件是一个用于构建微服务(或优雅的单体)的编程工具箱。

特点

  • 在异质SOA中运行 - 希望与大部分非Go-kit服务进行交互。
  • RPC是主要的信息传递模式。
  • 可插拔的序列化和传输--不仅仅是HTTP上的JSON。
  • 在现有的基础结构中运行--不强制要求使用特定的工具或技术。

安装

go get -u github.com/go-kit/kit

示例godoc.org/github.com/…

来源github.com/go-kit/kit

文档godoc.org/github.com/…

5.快速HTTP

Fast HTTP 快速HTTP包被调整为高性能,在热路径中的内存分配为零。从性能上讲,它比`net/http`快10倍。

特点

  • 速度优化:在现代硬件上可轻松处理超过100K qps和超过100万的并发保持连接。
  • 为低内存使用而优化。
  • 服务器提供了许多抗DoS限制,如每个客户端IP的并发连接,每个连接的请求数等等。
  • Fasthttp API被设计成能够扩展现有的客户端和服务器实现,或者从头开始编写自定义的客户端和服务器实现。

安装

go get -u github.com/valyala/fasthttp

你好,世界的例子

package main

import (
    "flag"
    "fmt"
    "log"

    "github.com/valyala/fasthttp"
)

var (
    addr     = flag.String("addr", ":8080", "TCP address to listen to")
    compress = flag.Bool("compress", false, "Whether to enable transparent response compression")
)

func main() {
    flag.Parse()

    h := requestHandler
    if *compress {
        h = fasthttp.CompressHandler(h)
    }

    if err := fasthttp.ListenAndServe(*addr, h); err != nil {
        log.Fatalf("Error in ListenAndServe: %s", err)
    }
}

func requestHandler(ctx *fasthttp.RequestCtx) {
    fmt.Fprintf(ctx, "Hello, world!\n\n")
}

来源github.com/valyala/fas…

文档godoc.org/github.com/…

6.Mux

Mux Mux(大猩猩)实现了一个请求路由器和调度器,用于将传入的请求匹配到它们各自的处理程序。

特点

  • 它实现了http.Handler接口,所以它与标准的http.ServeMux兼容。
  • 可以根据URL主机、路径、路径前缀、方案、头和查询值、HTTP方法或使用自定义匹配器来匹配请求。
  • URL主机、路径和查询值可以有变量,可以选择正则表达式。
  • 注册的URL可以被建立,或 "反转",这有助于维护对资源的引用。
  • 路由可以作为子路由使用:嵌套的路由只有在父路由匹配时才会被测试。这对于定义共享主机、路径前缀或其他重复属性等共同条件的路由组非常有用。作为奖励,这优化了请求匹配。

安装

go get -u github.com/gorilla/mux

你好,世界的例子

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/articles", ArticlesHandler)
    http.Handle("/", r)
}

func ArticlesCategoryHandler(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "Category: %v\n", vars["category"])
}

来源github.com/gorilla/mux

文档gorillatoolkit.org/pkg/mux

7.HttpRouter

HttpRouter是一个轻量级的高性能HTTP请求路由器(也叫多路复用器,简称mux)。

与Go的net/http 包的默认mux相比,这个路由器支持路由模式中的变量,并与请求方法匹配。它的扩展性也更好。

特点

  • 只进行显式匹配。对于其他路由器,如http.ServeMux ,一个请求的URL路径可以匹配多个模式。因此,他们有一些尴尬的模式优先规则,如最长的匹配或首先注册,首先匹配。根据这个路由器的设计,一个请求只能准确地匹配一个或没有路线。因此,也没有非故意的匹配,这对搜索引擎优化很有好处,也提高了用户体验。
  • 不要再关心尾部斜杠了。选择你喜欢的URL样式,如果缺少尾部斜杠或多了一个,路由器会自动重定向客户端。当然,它只在新路径有处理程序时才这样做。如果你不喜欢它,你可以关闭这个行为。
  • 路径自动更正。除了免费检测缺失的或额外的尾部斜杠外,路由器还可以修正错误的情况,并删除多余的路径元素(如./或//)。CAPTAIN CAPS LOCK是你的用户之一吗?HttpRouter可以通过进行不区分大小写的查找来帮助他,并将他重定向到正确的URL。
  • 你的路由模式中的参数。停止解析请求的URL路径,只需给路径段一个名称,路由器就会把动态值交付给你。由于路由器的设计,路径参数是非常便宜的。
  • 零垃圾。匹配和分配过程产生零字节的垃圾。唯一的堆分配是为路径参数建立键值对的片断,以及建立新的上下文和请求对象(后者只在标准Handler/HandlerFunc API中)。在3个参数的API中,如果请求路径不包含任何参数,则不需要任何堆分配。
  • 性能。基准数据不言自明。
  • 不再有服务器崩溃。你可以设置一个Panic处理程序来处理在处理HTTP请求时发生的恐慌。路由器会恢复,并让PanicHandler记录发生了什么,并提供一个漂亮的错误页面。
  • 对API来说是完美的。路由器的设计鼓励建立合理的、分层的RESTful APIs。此外,它还内置了对OPTIONS 请求和405 Method Not Allowed 回复的本地支持。

安装

go get -u github.com/julienschmidt/httprouter

你好,世界的例子

package main

import (
    "fmt"
    "net/http"
    "log"

    "github.com/julienschmidt/httprouter"
)

func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    fmt.Fprint(w, "Welcome!\n")
}

func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    fmt.Fprintf(w, "hello, %s!\n", ps.ByName("name"))
}

func main() {
    router := httprouter.New()
    router.GET("/", Index)
    router.GET("/hello/:name", Hello)

    log.Fatal(http.ListenAndServe(":8080", router))
}

来源github.com/julienschmi…

文档godoc.org/github.com/…