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. 安装node环境以及cnpm

    其实我老早以前就发现 node 版本太高也不行 以往的版本下载地址: https://nodejs.org/zh-cn/download/releases/ 下载并解压到 /usr/local/ 下 ...

  2. 利用Visual Studio调试JavaScript脚本

    方法1: 方法2: 打开IE,按F12调试. 方法3: JS断电点debugger代替

  3. AJAX基本操作

    XMLHttpRequest对象: XMLHttpRequest 是 AJAX 的基础.所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject) ...

  4. HDOJ-1114(完全背包模板题)

    Piggy-Bank HDOJ-1114 本题就是完全背包的模板题,注意复习一下关于背包九讲中的问什么这里使用的是顺序遍历. 还需要注意的一个问题就是初始化的问题,dp[0]初始化为0,其他的初始化为 ...

  5. pip命令安装python包到指定目录

    pip install wxpython --target=D:\Server\Python38\Lib\site-packages

  6. .net 程序员的centos命令总结

    1,ssh相关 在初始化一台云服务器的时候,第一件事情就是去把该关的门都关上,首先第一关就是禁用root登录,禁用密码登录,顺便改一下远程登录端口,让登录都通过ssh密钥对来进行,阿里云里有密钥对管理 ...

  7. POJ_1273 Drainage Ditches 【网络流】

    一.题面 Drainage Ditches 二.分析 网络流的裸题. 1 Edmonds-Karp算法 求解网络流其实就是一个不断找增广路,然后每次找到一条增广路后更新残余网络的一个过程. EK算法主 ...

  8. Bug调试专项练习三笔记

    前言:大家需要将文件夹中"有问题的代码" 导入到自己的工作空间中一. 训练一: 正确效果:首先要求大家导入给大家的项目, 给项目的"虚拟路径" 设定为" ...

  9. MySQL中where和on,where和having 的区别

    where和on的区别 用到连接查询时on会常用到,我们以左连接为例,来了解on的作用. on是在生成临时表使用的条件,不管on子句的条件是否为真,其都会返回左表的数据,如果条件为真则右表对应的数据也 ...

  10. 解析库--XPath

    from lxml import etree 2 text = ''' 3 <div> 4 <ul> 5 <li class = "item-0"&g ...