广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang请求fasthttp实践
  • 340
分享到

Golang请求fasthttp实践

2024-04-02 19:04:59 340人浏览 八月长安
摘要

目录基础api演示 高性能API演示测试服务 golang单元测试 测试报告 原计划学完Golang语言Http客户端实践之后,就可以继续了,没想到才疏学浅,在搜资料的时候发现除了G

原计划学完Golang语言Http客户端实践之后,就可以继续了,没想到才疏学浅,在搜资料的时候发现除了Golang SDK自带的net/http,还有一个更牛的HttpClient实现GitHub.com/valyala/fasthttp,据说性能是net/http的10倍,我想可能是有点夸张了,后期我会进行测试,以正视听。

github.com/valyala/fasthttp用到了对象池,为了在高性能测试中减少内存的使用,fasthttp使用了两个对象池(我只看了这俩):requestPool sync.Pool和responsePool sync.Pool,当然fasthttp也提供了正常的对象创建API,后面我在案例中也会写到。

基础API演示

首先分享一下基础的用法封装:

PS:这个属于练习版本,所以没写多少注释。


package ft

import (
 "encoding/JSON"
 "fmt"
 "funtester/task"
 "github.com/valyala/fasthttp"
)


func FastGet(url string, args map[string]interface{}) ([]byte, error) {
 uri := url + "?" + task.ToValues(args)
 _, resp, err := fasthttp.Get(nil, uri)
 if err != nil {
  fmt.Println("请求失败:", err.Error())
  return nil, err
 }
 return resp, err
}

func FastPostFORM(url string, args map[string]interface{}) ([]byte, error) {

 // 填充表单,类似于net/url
 params := &fasthttp.Args{}
 for s, i2 := range args {
  sprintf := fmt.Sprintf("%v", i2)
  params.Add(s, sprintf)
 }
 _, resp, err := fasthttp.Post(nil, url, params)
 if err != nil {
  fmt.Println("请求失败:", err.Error())
  return nil, err
 }
 return resp, nil
}

func FastPostjson(url string, args map[string]interface{}) ([]byte, error) {

 req := &fasthttp.Request{}
 req.SetRequestURI(url)

 marshal, _ := json.Marshal(args)
 req.SetBody(marshal)

 // 默认是application/x-www-form-urlencoded,其实无所谓
 req.Header.SetContentType("application/json")
 req.Header.SetMethod("POST")

 resp := &fasthttp.Response{}
 if err := fasthttp.Do(req, resp); err != nil {
  fmt.Println("请求失败:", err.Error())
  return nil, err
 }
 return resp.Body(), nil
}

其中两点主要注意:

  • FastGet、FastPostForm使用的fasthttp提供的默认获取请求的方式,FastPostJson使用了自定义请求和获取响应的方式
  • 关于请求头中的req.Header.SetContentType方法,其实无所谓,服务端都可以解析

高性能API演示

下面分享使用更高的性能(基于对象池)的API创建请求和获取响应的方式:


package task

import (
 "crypto/tls"
 "encoding/json"
 "fmt"
 "github.com/valyala/fasthttp"
 "log"
 "time"
)

var FastClient fasthttp.Client = fastClient()

// FastGet 获取GET请求对象,没有进行资源回收
// @Description:
// @param url
// @param args
// @return *fasthttp.Request
func FastGet(url string, args map[string]interface{}) *fasthttp.Request {
 req := fasthttp.AcquireRequest()
 req.Header.SetMethod("GET")
 values := ToValues(args)
 req.SetRequestURI(url + "?" + values)
 return req
}

// FastPostJson POST请求JSON参数,没有进行资源回收
// @Description:
// @param url
// @param args
// @return *fasthttp.Request
func FastPostJson(url string, args map[string]interface{}) *fasthttp.Request {
 req := fasthttp.AcquireRequest()
 // 默认是application/x-www-form-urlencoded
 req.Header.SetContentType("application/json")
 req.Header.SetMethod("POST")
 req.SetRequestURI(url)
 marshal, _ := json.Marshal(args)
 req.SetBody(marshal)
 return req
}

// FastPostForm POST请求表单传参,没有进行资源回收
// @Description:
// @param url
// @param args
// @return *fasthttp.Request
func FastPostForm(url string, args map[string]interface{}) *fasthttp.Request {
 req := fasthttp.AcquireRequest()
 // 默认是application/x-www-form-urlencoded
 //req.Header.SetContentType("application/json")
 req.Header.SetMethod("POST")
 req.SetRequestURI(url)
 marshal, _ := json.Marshal(args)
 req.BodyWriter().Write([]byte(ToValues(args)))
 req.BodyWriter().Write(marshal)
 return req
}

// FastResponse 获取响应,保证资源回收
// @Description:
// @param request
// @return []byte
// @return error
func FastResponse(request *fasthttp.Request) ([]byte, error) {
 response := fasthttp.AcquireResponse()
 defer fasthttp.ReleaseResponse(response)
 defer fasthttp.ReleaseRequest(request)
 if err := FastClient.Do(request, response); err != nil {
  log.Println("响应出错了")
  return nil, err
 }
 return response.Body(), nil
}

// DoGet 发送GET请求,获取响应
// @Description:
// @param url
// @param args
// @return []byte
// @return error
func DoGet(url string, args map[string]interface{}) ([]byte, error) {
 req := fasthttp.AcquireRequest()
 defer fasthttp.ReleaseRequest(req) // 用完需要释放资源
 req.Header.SetMethod("GET")
 values := ToValues(args)
 req.SetRequestURI(url + "?" + values)
 resp := fasthttp.AcquireResponse()
 defer fasthttp.ReleaseResponse(resp) // 用完需要释放资源
 if err := FastClient.Do(req, resp); err != nil {
  fmt.Println("请求失败:", err.Error())
  return nil, err
 }
 return resp.Body(), nil
}

// fastClient 获取fast客户端
// @Description:
// @return fasthttp.Client
func fastClient() fasthttp.Client {
 return fasthttp.Client{
  Name:                     "FunTester",
  nodefaultUserAgentHeader: true,
  TLSConfig:                &tls.Config{InsecureSkipVerify: true},
  MaxConnsPerHost:          2000,
  MaxIdleConnDuration:      5 * time.Second,
  MaxConnDuration:          5 * time.Second,
  ReadTimeout:              5 * time.Second,
  WriteTimeout:             5 * time.Second,
  MaxConnWaitTimeout:       5 * time.Second,
 }
}

测试服务

用的还是moco_FunTester测试框架,脚本如下:


package com.mocofun.moco.main

import com.funtester.utils.ArgsUtil
import com.mocofun.moco.MocoServer
import org.apache.tools.ant.taskdefs.condition.And

class Share extends MocoServer {

    static void main(String[] args) {
        def util = new ArgsUtil(args)
        //                def server = getServerNoLog(util.getIntOrdefault(0,12345))
        def server = getServer(util.getIntOrdefault(0, 12345))
        server.get(both(urlStartsWith("/test"),existArgs("code"))).response("get请求")
        server.post(both(urlStartsWith("/test"), existForm("fun"))).response("post请求form表单")
        server.post(both(urlStartsWith("/test"), existParams("fun"))).response("post请求json表单")
        server.get(urlStartsWith("/qps")).response(qps(textRes("恭喜到达QPS!"), 1))
//        server.response(delay(jsonRes(getJson("Have=Fun ~ Tester !")), 1000))
        server.response("Have Fun ~ Tester !")
        def run = run(server)
        waitForKey("fan")
        run.stop()
    }
}

Golang单元测试

第一次写Golang单测,有点不适应,搞了很久才通。


package test

import (
 "funtester/ft"
 "funtester/task"
 "log"
 "testing"
)

const url = "http://localhost:12345/test"

func args() map[string]interface{} {
 return map[string]interface{}{
  "code": 32,
  "fun":  32,
  "msg":  "324",
 }
}

func TestGet(t *testing.T) {
 get := task.FastGet(url, args())
 res, err := task.FastResponse(get)
 if err != nil {
  t.Fail()
 }
 v := string(res)
 log.Println(v)
 if v != "get请求" {
  t.Fail()
 }
}

func TestPostJson(t *testing.T) {
 post := task.FastPostJson(url, args())
 res, err := task.FastResponse(post)
 if err != nil {
  t.Fail()
 }
 v := string(res)
 log.Println(v)
 if v != "post请求json表单" {
  t.Fail()
 }
}

func TestPostForm(t *testing.T) {
 post := task.FastPostForm(url, args())
 res, err := task.FastResponse(post)
 if err != nil {
  t.Fail()
 }
 v := string(res)
 log.Println(v)
 if v != "post请求form表单" {
  t.Fail()
 }
}

func TestGetNor(t *testing.T) {
 res, err := ft.FastGet(url, args())
 if err != nil {
  t.Fail()
 }
 v := string(res)
 log.Println(v)
 if v != "get请求" {
  t.Fail()
 }
}

func TestPostJsonNor(t *testing.T) {
 res, err := ft.FastPostJson(url, args())
 if err != nil {
  t.Fail()
 }
 v := string(res)
 log.Println(v)
 if v != "post请求json表单" {
  t.Fail()
 }
}

func TestPostFormNor(t *testing.T) {
 res, err := ft.FastPostForm(url, args())
 if err != nil {
  t.Fail()
 }
 v := string(res)
 log.Println(v)
 if v != "post请求form表单" {
  t.Fail()
 }
}

测试报告

用的自带的控制台输出内容:

=== RUN   TestGet
2021/10/18 18:56:49 get请求
--- PASS: TestGet (0.01s)
=== RUN   TestPostJson
2021/10/18 18:56:49 post请求json表单
--- PASS: TestPostJson (0.00s)
=== RUN   TestPostForm
2021/10/18 18:56:49 post请求form表单
--- PASS: TestPostForm (0.00s)
=== RUN   TestGetNor
2021/10/18 18:56:49 get请求
--- PASS: TestGetNor (0.00s)
=== RUN   TestPostJsonNor
2021/10/18 18:56:49 post请求json表单
--- PASS: TestPostJsonNor (0.00s)
=== RUN   TestPostFormNor
2021/10/18 18:56:49 post请求form表单
--- PASS: TestPostFormNor (0.00s)
=== RUN   TestStageJSON

到此这篇关于Golang请求fasthttp实践的文章就介绍到这了,更多相关Golang请求fasthttp内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Golang请求fasthttp实践

本文链接: https://www.lsjlt.com/news/156305.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang请求fasthttp实践
    目录基础API演示 高性能API演示测试服务 Golang单元测试 测试报告 原计划学完Golang语言HTTP客户端实践之后,就可以继续了,没想到才疏学浅,在搜资料的时候发现除了G...
    99+
    2022-11-12
  • Golang如何请求fasthttp
    小编给大家分享一下Golang如何请求fasthttp,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!基础API演示首先分享一下基础的用法封装:PS:这个属于练习版本,所以没写多少注释。package ftimpo...
    99+
    2023-06-25
  • golang高性能的http请求 fasthttp详解
    fasthttp是golang下的一个http框架,顾名思义,与原生的http实现相比,它的特点在于快,按照官网的说法,它的客户端和服务端性能比原生有了十倍的提升。 它的高性能主要源...
    99+
    2022-11-12
  • http请求 golang
    一、什么是HTTP请求HTTP请求是指客户端向服务器发送请求的行为。在网络中,客户端和服务器之间可以通过HTTP协议进行通信。客户端发送HTTP请求,服务器根据请求返回响应。因此,HTTP请求是构成网络通信的关键部分之一。在HTTP请求中,...
    99+
    2023-05-16
  • golang arp请求
    本文将介绍如何使用Golang发送ARP请求来获取目标设备的MAC地址。ARP(Address Resolution Protocol)是解析网络层地址(IP地址)和数据链路层地址(MAC地址)的一种协议。在局域网中,每个设备都有一个唯一的...
    99+
    2023-05-16
  • golang http 请求
    Golang是一种开源的编程语言,它的出现让许多开发者都非常感兴趣。在网络开发方面,Golang使用起来非常方便,使得HTTP请求更加简单和可靠。Golang对于HTTP请求提供了良好的支持,可以很容易地创建HTTP请求来达到目的。本文将探...
    99+
    2023-05-16
  • php请求golang
    PHP和Golang是两种不同的编程语言,它们在应用场景、语法设计和性能等方面有着各自的优势。其中,PHP是一种流行的服务器端脚本语言,适用于Web应用和互联网开发,而Golang则是一种静态类型、编译型语言,适用于大规模分布式系统和高并发...
    99+
    2023-05-16
  • golang cookie请求
    Golang 中发起 HTTP 请求时通常会需要使用 Cookie 等认证信息,同时也需要获取 Cookie。本文将介绍如何使用 Golang 发起带有 Cookie 的 HTTP 请求,并将 Cookie 保存到变量中供后续使用。HTTP...
    99+
    2023-05-21
  • golang delete请求
    随着互联网的快速发展,Web应用程序变得越来越流行。而随着Web应用程序和互联网的快速发展,越来越多的开发人员将目光投向了使用Go编程语言。Go作为一种高效、简单和易于学习的编程语言,其在Web应用程序开发领域中的表现备受好评。其中,使用g...
    99+
    2023-05-22
  • golang 异步请求
    随着互联网的快速发展,越来越多的应用需要与外部服务交互,而这些服务所提供的 API 往往都是异步的。在单线程的程序中,同步请求往往会造成程序的堵塞,影响程序的性能和响应速度。因此,在异步请求方面,golang 这门语言的独特设计可以让我们更...
    99+
    2023-05-18
  • golang并发请求
    在当今的互联网时代,快速、高效地请求和处理数据是所有程序开发人员的必备技能。而并发请求是实现这一目标的有效方法之一。本文将介绍golang中如何实现并发请求。一、什么是并发请求并发请求指的是同时向多个服务器发送请求,以加快数据请求和处理速度...
    99+
    2023-05-21
  • golang发送请求
    Go是一种开源的编程语言,它非常适合编写高效、可靠、并发的网络应用。由于其卓越的性能和容易编写的特性,Go已经成为了许多应用程序的首选编程语言。在本文中,我们将介绍如何使用Go发送HTTP请求。首先引入net/http包在Go中发送HTTP...
    99+
    2023-05-21
  • golang请求计数
    Golang是一种被广泛使用的编程语言,特别是在网络应用程序方面。在构建网络应用程序时,经常需要进行请求计数。请求计数将帮助我们跟踪应用程序的请求量,识别任何潜在的性能问题或安全问题,使运维和开发人员更容易了解应用程序。本文将介绍如何使用G...
    99+
    2023-05-19
  • golang 并发请求
    在现代化的Web应用中,网络请求是至关重要的部分。通过网络请求,我们可以轻松地获取和发送数据。但是,随着应用规模的不断扩大,请求的数量也会增加。在这种情况下,如何保证系统的稳定性和效率就变得尤为重要。Go语言是一种高效的并发编程语言,具有良...
    99+
    2023-05-19
  • golang 登录请求
    随着互联网的不断发展,越来越多的服务需要用户登录才能使用,因此登录功能成为了每个Web应用必须具备的功能之一。使用Golang开发登录功能,可以有效提高运行效率和可维护性。Golang(也被称为Go)是由谷歌开发的一种开源编程语言,自推出以...
    99+
    2023-05-16
  • golang 发起请求
    Golang是一种快速、简单、安全的编程语言,广泛用于Web应用程序的开发。在Golang中发起HTTP请求是一个很常见的任务,本文将介绍如何在Golang中发起HTTP请求。使用标准库Golang的标准库中包含了net/http包,提供了...
    99+
    2023-05-16
  • golang http请求头
    Golang是一门流行的编程语言,用于构建高性能网络应用程序。在开发网络应用程序时,HTTP请求头是必不可少的一部分,它提供了关于请求的信息,以及指示如何应处理该请求的指令。本文将探讨Golang中HTTP请求头的相关内容,包括什么是HTT...
    99+
    2023-05-14
  • Golang中怎么实现GET请求
    这篇文章主要讲解了“Golang中怎么实现GET请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中怎么实现GET请求”吧!一、Golang中的GET请求在Golang中,我们可...
    99+
    2023-07-05
  • golang 接受http请求
    Golang是一种高效而又简洁的编程语言,它的应用范围非常广泛。在Web开发方面,Golang的高效、并发等特性赋予了它强大的能力,因此Golang成为了Web开发的一种热门技术之一。本文将解析如何使用Golang来接收HTTP请求。一、H...
    99+
    2023-05-15
  • golang 读取请求body
    在使用Golang进行Web开发时,有时候需要读取HTTP请求的body部分(例如POST请求中携带的提交数据),以便进行处理。本文将介绍Golang如何读取HTTP请求的body。一、使用ioutil.ReadAll()读取Golang标...
    99+
    2023-05-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作