fasthttp
其号称比net/http包快十倍!
在了解fasthttp前,先对net/http包进行了解
net/http: 由go内置的包,它提供了HTTP客户端和服务端的实现,通过http.HandleFunc()和http.ListenAndServe()两个函数就可以轻松创建一个简单的Go web服务器
//简单的服务端实现
package main
import (
"fmt"
"net/http"
)
func hello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello!")
}
func main() {
//关联路径和方法
http.HandleFunc("/hello", hello)
//设置监听端口,第二个参数的事件处理器,默认使用多路复用器
//多路复用器原理:根据请求的URL地址找到对应的处理器,调用处理器对应的ServeHTTP()方法处理请求。
//定义一个自己的处理器myHanlder := http.NewServeMux()
http.ListenAndServe(":8080", nil)
}
/**
也可以这样进行详细的配置
s := &http.Server{
Addr: ":8082",
Handler: myHandler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
*/
响应流程如下:
- 客户端发送请求
- 服务器的多路复用器收到请求
- 多路复用器根据请求的URL找到注册的处理器,将请求交由处理器处理
- 处理器执行程序逻辑,与数据库交互
- 调用模板引擎选择模板
- 服务器端将数据通过Http响应返回给客户端
- 客户端拿到数据呈现给用户
fasthttp之所以能比net/http快,只要是由于复用:
- 复用 goroutine(协程),减轻 runtime(类似jvm,在编译时,go会将runtime部分代码连接进去) 压力;
- 对象复用,大量使用 sync.Pool (go提供的内存池,里面的对象进行复用)减轻 GC 压力。
jsoniter:一款快且灵活的 JSON 解析器,据说比go的官方库快6倍,且完全兼容。尽量减少不必要的内存复制,同时减少reflect的使用——同一类型的对象,jsoniter只调用reflect解析一次之后即缓存下来
官方库为encoding/json,是go提供的JSON转换库
ProtoBuf : gogo/protobuf 是由 Google 开发和定义的与 XML、JSON 类似的一种协议格式,用于高效存储与读取结构化数据。它基于二进制,因此使用 ProtoBuf 能将数据压缩得更小。(官方库为goland/protobuf)
gogoproto 的概念简单而吸引人。他们在 proto 声明中使用自定义扩展,从而为 Go 量身定制更好的代码生成。特别是如果你放弃一些协议缓冲区合约
gogo/protobuf是基于官方库golang/protobuf的增强版实现:
- 比golang/protobuf更快地序列化与反序列化;
- 更规范的 Go 结构;
- 兼容golang/protobuf;
- 可选地生成额外的帮助代码,减少代码输入;
- 可以生成测试代码和 benchmark 代码;
- 其他序列化格式;
valyala/quicktemplate:
quicktemplate会先将编写的模板代码转换为 Go 语言代码,再进行编译渲染。因此,它比标准库html/template快 20 倍以上。
quicktemplate的语法与 Go 语法非常类似,几乎没有学习成本。
几乎所有的 bug 都能在模板编译时被捕获,因此在实际项目中,很少会有受模板相关的bug影响。
模板中可以嵌入任意 Go 代码。
- Golang的
html/template包实现了数据驱动的模板,用于生成可对抗代码注入且安全HTML输出。