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框架,像PythonFlaskDjangoJavaSpring等,而引入第三方库的问题也是显而易见的,带入学习成本的同时由于第三方框架的水平参差不弃,需要开发者自己去踩坑和填坑。所以如果是构建一般的web应用net/http绝对足以胜任。但Go生态环境中又确实有很多优秀的开发框架流行在众多开发者间,究其原因就是这些第三方框架确确实实解决了net/http的一些问题,有着自身的优势可供开发者选择。比如我们这篇文章要介绍的fasthttp是提供给需要构建高并发web应用的开发者。它优化了net/http的一些问题,尽可能的将资源复用最大化,比如在net/httpRequest对象必须在每个请求都创建一次,而在fasthttpRequest对象是复用的对象之一,因此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)

fasthttprequestHandler 函数只接收一个参数,那就是RequestCtx *fasthttp.RequestCtx ,而不像net/httphandlerFunc 一样接收两个参数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%内容,订阅专栏后可继续查看/也可单篇购买

go高薪必备:面试框架17讲 文章被收录于专栏

<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>

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务