1 简要概述

最近看起go lang,真的被go的goroutine(协程)惊艳到了,一句 go function(){#todo},即可完成一个并发的工作。
看到gin这个web框架时,突然就特别想拿它和springboot来做个性能对比,马上撸一遍。
请求:/ping
返回:{"message":"pong"}
先透露下对比报告:
  qps  CPU  内存  包大小
gin 14900  150% 0.4% 9M 
springboot 11536 143% 12% 24M 
 
 2 环境准备
  • 2台2C4G的云主机(172.16.60.211,172.16.60.210),这个自己到阿里云上购买即可。一小时0.8元左右。
  • gin的helloworld代码:https://github.com/qinxiongzhou/gin-vs-springboot/tree/main/springboot
  • springboot的helloworld代码:https://github.com/qinxiongzhou/gin-vs-springboot/tree/main/gin/src/http_gin
  • 172.16.60.211机器上,上次gin和springboot编译好的包,并启动运行。gin运行在8080端口,springboot运行在8090端口
  • 172.16.60.210机器上,安装AB 工具包,做压测控制

3 代码工程及打包

3.1 gin

关键代码:
 1 func main() {
2 gin.SetMode(gin.ReleaseMode)
3 gin.DefaultWriter = ioutil.Discard
4 r := gin.Default()
5 r.GET("/ping", func(c *gin.Context) {
6 c.JSON(200, gin.H{
7 "message": "pong",
8 })
9 })
10 r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
11 }

打包:

1 set GOOS=linux #windows环境需要设置GOOS,才能build成linux环境的可运行二进制文件
2 go build http_gin.go

上传linux环境:

1 修改成可执行文件 chmod +x http_gin
2 运行 ./http_gin &

3.2 springboot

关键代码:

 1 @RestController
2 public class DemoController {
3 Result result = new Result("pong");
4
5 @RequestMapping("/ping")
6 public Result hello(){
7 return result;
8 }
9 }
10
11
12 class Result{
13 String Message;
14 public String getMessage() {
15 return Message;
16 }
17 public void setMessage(String message) {
18 Message = message;
19 }
20 public Result(String message) {
21 Message = message;
22 }
23 }

编译上传:

1 maven编译 :mvn install

运行:

1 java -jar demo-0.0.1-SNAPSHOT.jar &

 4 benchmark
模拟20个用户,发出20万个请求
1 ab -c 20 -n 200000 http://172.16.60.211:8080/ping

 4.1 gin benchmark

1 ab -c 20 -n 200000 http://172.16.60.211:8080/ping

benchmark结果:

 1 Concurrency Level:      20
2 Time taken for tests: 13.423 seconds
3 Complete requests: 200000
4 Failed requests: 0
5 Write errors: 0
6 Total transferred: 28200000 bytes
7 HTML transferred: 3600000 bytes
8 Requests per second: 14900.02 [#/sec] (mean)
9 Time per request: 1.342 [ms] (mean)
10 Time per request: 0.067 [ms] (mean, across all concurrent requests)
11 Transfer rate: 2051.66 [Kbytes/sec] received

benchmark过程中,服务器CPU、内存状态:

 4.2 springboot benchmark

1 ab -c 10 -n 200000 http://172.16.60.211:8090/ping

 1 Concurrency Level:      20
2 Time taken for tests: 17.336 seconds
3 Complete requests: 200000
4 Failed requests: 0
5 Write errors: 0
6 Total transferred: 24600000 bytes
7 HTML transferred: 3600000 bytes
8 Requests per second: 11536.65 [#/sec] (mean)
9 Time per request: 1.734 [ms] (mean)
10 Time per request: 0.087 [ms] (mean, across all concurrent requests)
11 Transfer rate: 1385.75 [Kbytes/sec] received

benchmark过程中,服务器CPU、内存状态:

4.3 对比

  qps  CPU  内存  包大小
gin 14900  150% 0.4% 9M 
springboot 11536 143% 12% 24M 

结论:

  • qps上,gin 比 springboot 高出1.3倍。别看只有1.3倍,如果公司现在有10000台服务器呢?
  • CPU上,两者持平
  • 内存上,gin比springboot 小30倍。这个差距是真有点大。
  • 包大小上,gin比springboot 小2.6倍。别看磁盘只是小了2.6倍,流水线持续部署时,磁盘大小和每次传包的时间,也是相当可观的节省
从这些硬指标看,gin有具备比springboot更多的优势。但从社区看,springboot依然是个王者。springboot也做了webflow的支持,后续也可期待下这块的发展。

go gin框架和springboot框架WEB接口性能对比的更多相关文章

  1. JMeter基于http请求的web接口性能测试总结

    [本文出自天外归云的博客园] 基于http请求的web接口性能测试总结 压测的目的:对于Web接口压测的目的最终是要在对数据库造成压力的情况下观察压测服务器的cpu是否达到预警值.memory是否发生 ...

  2. SpringCloud基础组件总结,与Dubbo框架、SpringBoot框架对比分析

    本文源码:GitHub·点这里 || GitEE·点这里 一.基础组件总结 1.文章阅读目录 1).基础组件 Eureka组件,服务注册与发现 Ribbon和Feign组件,实现负载均衡 Hystri ...

  3. 自己写的轻量级PHP框架trig与laravel5.1,yii2性能对比

    看了下当前最热门的php开发框架,想对比一下自己写的框架与这些框架的性能对比.先看下当前流行框架的投票情况. 看结果对比,每个测试脚本做了一个数据库的联表查询并进行print_r输出,查询的sql语句 ...

  4. Python flask 与 GO WEB服务器性能对比

    测试环境: 系统: CentOS 7.1 Mem: 8G CPU: 虚拟机16核 Python版本: python3.6 Flask版本: 0.12.2 Golang版本: 1.6.3 1.首先写一个 ...

  5. JNPF.java前后端分离框架,SpringBoot+SpringCloud开发微服务平台

    JNPF.java版本采用全新的前后端分离架构模式.前后端分离已成为互联网项目开发的业界标准开发方式,通过 nginx+tomcat 等方式有效的进行解耦合,并且前后端分离会为以后的大型分布式架构.弹 ...

  6. python之web框架(2):了解WSGI接口

    python之web框架(2):了解WSGI接口 1.什么是wsgi接口: wsgi:Web Service Gateway Interface.它不是模块,而只是一种规范,方便web服务器和各种框架 ...

  7. 小程序后端项目【Springboot框架】部署到阿里云服务器【支持https访问】

    前言: 我的后端项目是Java写的,用的Springboot框架.在部署服务器并配置https访问过程中,因为做了一些令人窒息的操作(事后发现),所以老是不能成功. 不成功具体点说就是:域名地址可以正 ...

  8. 0001 - Spring 框架和 Tomcat 容器扩展接口揭秘

    前言 在 Spring 框架中,每个应用程序上下文(ApplicationContext)管理着一个 BeanFactory,BeanFactory 主要负责 Bean 定义的保存.Bean 的创建. ...

  9. SpringBoot框架的权限管理系统

    springBoot框架的权限管理系统,支持操作权限和数据权限,后端采用springBoot,MyBatis,Shiro,前端使用adminLTE,Vue.js,bootstrap-table.tre ...

随机推荐

  1. iOS中web与Js的交互

    问题 感觉到uni-app框架有pit,公司强推该框架的小哥识趣的闭嘴,考虑到全盘替换周期跟成本挺大,基于uni-app能打包成H5,采用webview+js的原生方式集成 基本结构:原生壳 + we ...

  2. python爬虫登录保持及对http总结

    [前言]这几天一直看python爬虫登录保持.实现接口太多,太乱,新手难免云山雾罩.各种get.post,深入理解一下,其实就是由于http的特性需要这些操作.http是一种无状态.不保存上次通信结果 ...

  3. jQuery实现QQ简易聊天框

    实现效果: html代码: <section id="chat"> <div class="chatBody"></div> ...

  4. CSDN博客转MD格式

    基于大神作品修改原文,使用了一下发现有一些小问题,爬取的博客标题如果含有字符是Windows不支持的命名格式,会卡在界面,进行了一下优化,加了一些字符过滤处理,但是tomd模块对html的处理还是不是 ...

  5. 内省详解(Introspector/BeanInfo/MethodDescriptor/PropertyDescriptor)

    内省(Introspector)概念 ​ 内省Introspector 是Java提供的操作 JavaBean 的 API,用来访问某个属性的 getter/setter 方法.对于一个标准的 Jav ...

  6. JVM实战调优(空格引发的服务异常)

    JVM实战调优 问题描述 某一个项目中有一个文字转语音的服务,使用的是科大讯飞的语音转换服务,需要调用三方服务.因其转换服务是一个耗时操作,官方给的demo使用的是 WebSocket 进行数据转换操 ...

  7. 2018.9.9 nowcoder 普及组第一场

    2018.9.9 nowcoder 普及组第一场 C-括号 题目大意:一个只包含左右括号的字符串\(S\),希望删掉S中若干个字符,使得剩下的字符串是一个合法的括号串,有多少不同的方案. Soluti ...

  8. python基础学习之类的属性 增删改查

    类中的属性如何在类外部使用代码进行增删改查呢 增加.改变: setattr内置函数以及 __setattr__魔法方法 class A: aaa = '疏楼龙宿' a = A() setattr(a, ...

  9. 怎么用Markdown在github上写书,并用pages展示

    怎么用git写书 安装环境 第一步 安装node npm 先检测自己电脑是否安装了node npm # 查看 node 版本 node -v # 查看 npm 版本 npm -v 复制代码 如果成功打 ...

  10. LiberOJ #124. 除数函数求和 【整除分块】

    一.题目 #124. 除数函数求和 二.分析 比较好的一题,首先我们要对题目和样例进行分析,明白题目的意思. 由于对于每一个$d$,它所能整除的数其实都是定的,且数量是$ \lfloor \frac{ ...