自推出以来,Golang(谷歌的Go编程语言)已经成为编写API和网络服务的一个强大而流行的选择。这个列表汇编了Go语言中最受欢迎的七个网络框架--从统计学角度来看。
你可能还想看看DeepSource的Go静态分析,它可以检测出Go代码中300多个错误风险、反模式和安全漏洞。
1.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示例
2.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()
}
3.回声
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
你好,世界的例子
4.Go套件
Go套件是一个用于构建微服务(或优雅的单体)的编程工具箱。
特点
- 在异质SOA中运行 - 希望与大部分非Go-kit服务进行交互。
- RPC是主要的信息传递模式。
- 可插拔的序列化和传输--不仅仅是HTTP上的JSON。
- 在现有的基础结构中运行--不强制要求使用特定的工具或技术。
安装
go get -u github.com/go-kit/kit
5.快速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")
}
6.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"])
}
7.HttpRouter
HttpRouter是一个轻量级的高性能HTTP请求路由器(也叫多路复用器,简称mux)。
与Go的net/http 包的默认mux相比,这个路由器支持路由模式中的变量,并与请求方法匹配。它的扩展性也更好。
特点
- 只进行显式匹配。对于其他路由器,如
http.ServeMux,一个请求的URL路径可以匹配多个模式。因此,他们有一些尴尬的模式优先规则,如最长的匹配或首先注册,首先匹配。根据这个路由器的设计,一个请求只能准确地匹配一个或没有路线。因此,也没有非故意的匹配,这对搜索引擎优化很有好处,也提高了用户体验。 - 不要再关心尾部斜杠了。选择你喜欢的URL样式,如果缺少尾部斜杠或多了一个,路由器会自动重定向客户端。当然,它只在新路径有处理程序时才这样做。如果你不喜欢它,你可以关闭这个行为。
- 路径自动更正。除了免费检测缺失的或额外的尾部斜杠外,路由器还可以修正错误的情况,并删除多余的路径元素(如./或//)。CAPTAIN CAPS LOCK是你的用户之一吗?HttpRouter可以通过进行不区分大小写的查找来帮助他,并将他重定向到正确的URL。
- 你的路由模式中的参数。停止解析请求的URL路径,只需给路径段一个名称,路由器就会把动态值交付给你。由于路由器的设计,路径参数是非常便宜的。
- 零垃圾。匹配和分配过程产生零字节的垃圾。唯一的堆分配是为路径参数建立键值对的片断,以及建立新的上下文和请求对象(后者只在标准
Handler/HandlerFuncAPI中)。在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))
}