Gin (三) 中间件 并发测试

router.GET("/hello",calcTime,func(c *gin.Context){}) 支持多个函数,每个函数一次调用。这样就可以拦截请求

c.Next() 可以在当前函数不退出的情况下,继续执行下一个中间件,等后续的处理完了,又回到当前中间件

go 复制代码
package main

import "github.com/gin-gonic/gin"
import "fmt"
import "time"
func middleWare(c *gin.Context){
        fmt.Println("将要访问index.html")
}

func calcTime(c *gin.Context){
        time1 := time.Now().UnixNano()

        // 调用后续得代码,
        c.Next()
        newTime := time.Now().UnixNano()

        fmt.Printf("%v 纳秒",newTime - time1)
}

func main(){
        router := gin.Default()
        router.GET("/", middleWare, func(c *gin.Context){
                c.String(200, "Hello world")
        })

        router.GET("/hello",calcTime,func(c *gin.Context){
                c.String(200, "Hello world")
        })

        router.Run()
}

并发测试

wrk -t2 -c20 -d30s https://localhost:8000/hello

  • -t2 并发2个线程
  • -c20 20个并发
  • -d30s 持续时间30秒
go 复制代码
package main

import "github.com/gin-gonic/gin"
import "fmt"
import "time"
func middleWare(c *gin.Context){
        fmt.Println("将要访问index.html")
}

func calcTime(c *gin.Context){
        time1 := time.Now().UnixNano()

        // 调用后续得代码,
        c.Next()
        newTime := time.Now().UnixNano()
        _ = newTime - time1
}

func main(){
        // 关闭所有日志
        gin.SetMode(gin.ReleaseMode)
        router := gin.New()
        router.Use(gin.Recovery())

        router.GET("/", middleWare, func(c *gin.Context){
                c.String(200, "Hello world")
        })

        router.GET("/hello",calcTime,func(c *gin.Context){
                c.String(200, "Hello world")
        })

        router.Run()
}
bash 复制代码
go run main.go &
wrk -t2 -c20 -d30s http://192.168.139.204:8080/hello

Running 30s test @ http://192.168.139.204:8080/hello
  2 threads and 20 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    30.37ms   66.17ms 457.06ms   85.66%
    Req/Sec    99.33k    41.62k  181.85k    71.14%
  5472968 requests in 30.09s, 668.09MB read
Requests/sec: 181858.35
Transfer/sec:     22.20MB
相关推荐
蜗牛互联网8 小时前
WSL Containers GA:本地AI容器的生命周期、网络与治理验收
java·网络·人工智能·后端
Zhou1411369 小时前
SpringBoot_02_自动配置原理
java·spring boot·后端
子兮曰10 小时前
Node.js 50个优势场景盘点:一个人单干,为啥我多数时候只用它
前端·后端
IT_陈寒10 小时前
我花3小时debug,就因为JavaScript这个隐式转换坑
前端·人工智能·后端
程序猿阿越11 小时前
containerd如何拉取镜像
后端·kubernetes·源码阅读
一条小小yu11 小时前
为什么使用springboot
java·spring boot·后端
香瓜子rd11 小时前
MySQL InnoDB 并发控制核心原理:事务、隔离级别、MVCC 与锁机制
数据库·后端
RISCV_Explorer11 小时前
RISC-V RVV向量编程模型机制解析——vsetvl配置、掩码与尾元素策略及长度无关编程
后端·risc-v
对象存储与RustFS11 小时前
升级 RustFS 二进制不停机:一条一条换,留一条退路
后端·rust·开源
hasty11 小时前
限制写了却没生效:OpenTelemetry Go 的 Unicode 截断边界
开发语言·后端·golang