服务器之家

服务器之家 > 正文

golang高性能的http请求 fasthttp详解

时间:2021-11-13 11:12     来源/作者:pebblecome

fasthttpgolang下的一个http框架,顾名思义,与原生的http实现相比,它的特点在于快,按照官网的说法,它的客户端和服务端性能比原生有了十倍的提升。

它的高性能主要源自于“复用”,通过服务协程和内存变量的复用,节省了大量资源分配的成本。

fasthttp 据说是目前golang性能最好的http库,相对于自带的net/http,性能说是有10倍的提升,具体介绍可以看看官方介绍:valyala/fasthttp

1,首先安装fasthttp

?
1
go get -u github.com/valyala/fasthttp

2,简单的一个get请求

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
 
import (
    "github.com/valyala/fasthttp"
)
 
func main() {
    url := `http://httpbin.org/get`
 
    status, resp, err := fasthttp.Get(nil, url)
    if err != nil {
        fmt.Println("请求失败:", err.Error())
        return
    }
 
    if status != fasthttp.StatusOK {
        fmt.Println("请求没有成功:", status)
        return
    }
 
    fmt.Println(string(resp))
}

2,简单的Post请求

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func main() {
    url := `http://httpbin.org/post?key=123`
    
    // 填充表单,类似于net/url
    args := &fasthttp.Args{}
    args.Add("name", "test")
    args.Add("age", "18")
 
    status, resp, err := fasthttp.Post(nil, url, args)
    if err != nil {
        fmt.Println("请求失败:", err.Error())
        return
    }
 
    if status != fasthttp.StatusOK {
        fmt.Println("请求没有成功:", status)
        return
    }
 
    fmt.Println(string(resp))
}

比如有些API服务需要我们提供json body或者xml body也就是,Content-Type是application/json、application/xml或者其他类型

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
func main() {
    url := `http://httpbin.org/post?key=123`
    
    req := &fasthttp.Request{}
    req.SetRequestURI(url)
    
    requestBody := []byte(`{"request":"test"}`)
    req.SetBody(requestBody)
 
    // 默认是application/x-www-form-urlencoded
    req.Header.SetContentType("application/json")
    req.Header.SetMethod("POST")
 
    resp := &fasthttp.Response{}
 
    client := &fasthttp.Client{}
    if err := client.Do(req, resp);err != nil {
        fmt.Println("请求失败:", err.Error())
        return
    }
 
    b := resp.Body()
 
    fmt.Println("result:\r\n", string(b))
}

翻阅文档发现了他提供了几个方法:AcquireRequest()AcquireResponse(),而且也推荐了在有性能要求的代码中,通过 AcquireRequest 和 AcquireResponse 来获取 req 和 resp。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
func main() {
    url := `http://httpbin.org/post?key=123`
 
    req := fasthttp.AcquireRequest()
    defer fasthttp.ReleaseRequest(req) // 用完需要释放资源
    
    // 默认是application/x-www-form-urlencoded
    req.Header.SetContentType("application/json")
    req.Header.SetMethod("POST")
    
    req.SetRequestURI(url)
    
    requestBody := []byte(`{"request":"test"}`)
    req.SetBody(requestBody)
 
    resp := fasthttp.AcquireResponse()
    defer fasthttp.ReleaseResponse(resp) // 用完需要释放资源
 
    if err := fasthttp.Do(req, resp); err != nil {
        fmt.Println("请求失败:", err.Error())
        return
    }
 
    b := resp.Body()
 
    fmt.Println("result:\r\n", string(b))
}

到此这篇关于golang高性能的http请求 fasthttp的文章就介绍到这了,更多相关golang fasthttp http请求内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/pebblecome/p/15270680.html

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部