fasthttp和net/http
fasthttp和net/http
fasthttp 是 golang web开发中又一个好的选择,因为它的运行效率官方测试十倍于go 标准库net/http,是目前 golang web 框架中性能最好的框架,它是怎么做到远胜 net/http 库的呢,这是我们这一章需要分析的,本篇文章先来看看fasthttp 和 net/http 的使用上面有什么不同
net/http
VS fasthttp
Go
被大量应用于web
开发的一个关键原因就是Go
内置的标准库net/http
十分的易用、完善,想用Go
开发一个web
应用完全可以不用任何第三方web
框架,并且net/http
的开发效率不低的同时性能也还不错,这点十分的吸引开发者。想想其它的语言想要开发一个成熟的web
应用往往需要第三方的web
框架,像Python
的Flask
、Django
,Java
的Spring
等,而引入第三方库的问题也是显而易见的,带入学习成本的同时由于第三方框架的水平参差不弃,需要开发者自己去踩坑和填坑。所以如果是构建一般的web
应用net/http
绝对足以胜任。但Go
生态环境中又确实有很多优秀的开发框架流行在众多开发者间,究其原因就是这些第三方框架确确实实解决了net/http
的一些问题,有着自身的优势可供开发者选择。比如我们这篇文章要介绍的fasthttp
是提供给需要构建高并发web
应用的开发者。它优化了net/http
的一些问题,尽可能的将资源复用最大化,比如在net/http
中Request
对象必须在每个请求都创建一次,而在fasthttp
中Request
对象是复用的对象之一,因此fasthttp
的测试性能数倍于net/http
,是目前Go
性能最高的web
框架之一,关于框架的性能测试排名见:techempower
fasthttp 和 net/http 的基本使用
Fasthttp使用RequestHandler函数代替实现Handler接口的对象。幸运的是,将绑定的struct方法传递给fasthttp很容易。
import ( "fmt" "github.com/valyala/fasthttp" ) type MyHandler struct { foobar string } // net/http 的风格,handler func 绑定在 handler struct 上 func (h *MyHandler) HandleFastHTTP(ctx *fasthttp.RequestCtx) { // 这里可以直接访问MyHandler的结构体属性 fmt.Fprintf(ctx, "Hello, world! Requested path is %q. Foobar is %q", ctx.Path(), h.foobar) } // fasthttp 风格,直接原生处理函数 func fastHTTPHandler(ctx *fasthttp.RequestCtx) { fmt.Fprintf(ctx, "Hi there! RequestURI is %q", ctx.RequestURI()) } // pass bound struct method to fasthttp myHandler := &MyHandler{ foobar: "foobar", } fasthttp.ListenAndServe(":8080", myHandler.HandleFastHTTP) // 也可以直接传递handlerFunc 进去 fasthttp.ListenAndServe(":8081", fastHTTPHandler)
fasthttp
的requestHandler
函数只接收一个参数,那就是RequestCtx *fasthttp.RequestCtx
,而不像net/http
的handlerFunc
一样接收两个参数w http.ResponseWriter, r *http.Request
:
import ( "fmt" "net/http" ) func Hello(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello") } func main() { http.HandleFunc("/", Hello) err := http.ListenAndServe(":9090", nil) if err != nil { fmt.Printf("http server failed,
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
<p> <span style="font-size:14px;">本专刊是Go开源项目源码分析专栏,共 17 篇文章,挑选了Go 开源界知名的 4 个开源项目gnet(高效的网络库)、gin(知名的Go微型web框架)、fasthttp(高性能web框架)、nsq(Go消息队列)来对它们进行源码分析,分析它们的设计思想和代码实现。每个项目的讲解都是由浅入深,由设计思想的剖析到源码实现的分析,更易于读者理解。</span> </p> <p> <br /> </p> <h2> <b><span style="font-size:16px;line-height:1;">购买须知:</span></b> </h2> <span style="font-size:14px;">订阅成功后,用户即可通过牛客网 PC 端、App 端享有永久阅读的权限;</span><br /> <span style="font-size:14px;">牛客专刊为虚拟内容服务,订阅成功后概不退款;</span><br /> <span style="font-size:14px;line-height:1;">在专刊阅</span><span style="font-size:14px;line-height:1;">读过程中,如有任何问题,可在文章评论区底部留言,或添加牛客导师,加入读者交流群;</span><br /> <span style="font-size:14px;">想成为牛客作者,请邮件联系yinxiaoxiao@nowcoder.com,邮件主题【牛客作者+写作方向】,并附上个人简历一份及近期作品一份;</span><br /> <p> <span style="font-size:14px;">牛客专刊版权归本平台所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布 / 发表,违者将依法追究责任</span><span style="font-size:14px;">。</span> </p> <p> <br /> </p>