首页 > 其他分享 >golang fasthttp服务端的简单实现

golang fasthttp服务端的简单实现

时间:2024-03-18 11:16:15浏览次数:27  
标签:http err 复用 golang 路由 fasthttp net 服务端

使用示例:

package main

import (
   "github.com/buaazp/fasthttprouter"
   "github.com/valyala/fasthttp"
   "log"
)

func main() {
   // 创建路由
   r := fasthttprouter.New()
   r.GET("/", Index)
   if err := fasthttp.ListenAndServe(":8080", r.Handler); err != nil {
      log.Fatalf("ListenAndServe fatal: %s\n", err)
   }
}

func Index(ctx *fasthttp.RequestCtx)  {
   ctx.WriteString("hello, fasthttp client")
}

fasthttp据说性能比 net/http 好很多,主要是以下几个方面:

  • 1.大量使用 sync.Pool 来内存复用请求处理,减少每个请求过来就新建一个协程处理
  • 2.连接复用,连接处理先从 ready字段的 workerChan 中获取 worker,没有就从 workerPool 中获取
  • 3.bytes <-> string 的转换用的 unsafe.Pointer,避免内存分配与拷贝带来的消耗

从共性上来说,fasthttp 包很多思想还是借用 net/http 的,比如路由的处理,通过 map 映射不同的 method 树,但与单纯的 net/http 不同的是,fasthttp通过 method 区分不同的路由树,类似 gin框架 思想,net/http 使用的就是 map[path]Handler,简单粗暴,另外在连接方面其实和 net/http 也有很多类似的方面。

fasthttp 暂未做深入研究,不过这种大量使用 复用内存 的思想确实使得其性能比 net/http 更好,甚至有大佬专门通过 pprof 比对了其性能,比较和 gin 的差异。

参考:
Go的fasthttp快的秘诀:简单事情做到极致

标签:http,err,复用,golang,路由,fasthttp,net,服务端
From: https://www.cnblogs.com/davis12/p/18079901

相关文章

  • 【golang语言】
    目录数据类型基础数据类型boolstringintint8int16int32int64uintuint8uint16uint32uint64uintptrbyterunefloat32float64complex64complex128类型转换go语言不允许隐式转换别名类型和原有类型也不能进行隐式转换类型的预定义值......
  • 网络常用服务端口
    网络常用端口有很多,以下是一些常见的端口HTTP:超文本传输协议,默认端口是80,用于网页浏览和Web服务。HTTPS:安全的HTTP协议,默认端口是443,用于安全的网页连接和加密通信。FTP:文件传输协议,用于传输文件,默认端口是21。SMTP:简单邮件传输协议,用于发送邮件,默认端口是25。POP3......
  • Golang使用Socket.io
    什么是Socket.IO?Socket.io是建立在WebSocket之上的一个实时应用程序框架。它封装了WebSocket,并提供了更高级别的接口,包括实时事件处理、自动重新连接、多房间支持等功能。Socket.IO在客户端和服务器端分别有对应的库,简化了实时通信的开发。gopackagemainimport( "fm......
  • golang select底层原理
    select语句在Go语言中用于在多个通信操作(发送和接收)之间进行选择。在底层,Go运行时维护了关于每个case的状态信息,这些信息通常存储在scase结构体中。下面我将详细解释select语句的工作原理,并尝试用文字描述来模拟这一过程,因为直接在这里画图可能不太方便。首先,让我们回......
  • GoLang:云原生时代致力于构建高性能服务器的后端语言
    Go语言的介绍概念Golang(也被称为Go)是一种编程语言,由Google于2007年开始设计和开发,并于2009年首次公开发布。Golang是一种静态类型、编译型的语言,旨在提供高效和可靠的软件开发体验。它具有简洁的语法、高效的编译器和强大的并发支持。Golang的设计目标之一是提供一种简单......
  • 数组扩容golang
    packagemainimport( "fmt" "unsafe")funcmain(){ which:=make([]byte,0) which=append(which,[]byte("123")...) which1:=which fmt.Printf("which:%s varpointer:%p arrpointer%p cap:%d len:%d, w......
  • golang 开发经验
    介绍本篇章将简述,使用golang开发的时候遇到的一些坑,随时更新中~go语法gin框架ctx.Json()细节gin配置路由函数的时候,调用的回调函数,如getBook,在调用c.JSON(200,msg{"hxdyjx",18,})时,单线程情况,必须要执行完,return之前的所有代码才会返回packagemainimport( "g......
  • golang 随机数组的性能对比测试
    最近需要用到随机数,但在随机数的生成方面遇到些问题,如加了seed后反而生成的数组是固定的,没有加是随机的,后面查资料了解到,如果seed值是一样的,序列中的值就固定的,而不加seed时,每次的都是随机的,后面想到如果用来做负载均衡呢,性能又如何。下面是源码:packagebenchimport( ......
  • python项目开发——总结笔记(csv excel读取 服务端端口进程 拟合预测 时间格式转化 服
    目录部署服务端程序主服务端控制程序main.py子目录的计算程序jisuan.py读取数据读取csv数据读取读取excel时间格式转换时间戳转datetime并且生成时间序列最后格式化时间 常用函数拟合预测服务端程序控制与维护部署服务端程序主服务端控制程序main.pyfromfl......
  • golang内存管理
     解释定义:mheap:用于管理整个堆内存,mheap管理多个arena,arena管理多个span,一个span由多个page组成,一个arena有8192个page,page由内存块组成mspan:一个span对应一个mspanmcentral:mheap里有一个全局的mspan管理中心包含mcentral数组,0-135mcentral,一个mcentral(管理对应类型的spa......