Quarkus(Java)与Gin(Go)性能比拼


在下面的文章中,我们将探讨两种常用框架的性能评估:在 Go 上运行的 Gin 和在 Java 上运行的 Quarkus。Gin 在 Go 社区中非常受欢迎,而 Quarkus 的创建是为了让 Java 开发人员能够为现代的云原生世界创建应用程序。需要强调的是,这种比较分析的重点是框架本身,而忽略了底层的编程语言。

Go Gin
Go Gin 是一个用于构建 Web 应用程序的轻量级的 Go 语言框架。它基于 HTTP 的路由器和中间件的概念,使得开发者能够快速地构建高性能的 Web 服务。Go Gin 设计简单,性能优越,适用于构建 RESTful API 和 Web 应用。

以下是 Go Gin 框架的一些主要特点和优势:

  1. 轻量级: Go Gin 设计简洁,代码量相对较小,使得应用程序更加轻便。
  2. 高性能: 框架的设计追求高性能,通过有效地利用 Go 语言的特性,提供了快速的路由和中间件处理。
  3. HTTP 路由: 支持灵活的路由定义,可以方便地处理各种 HTTP 请求,包括 GET、POST、PUT、DELETE 等。
  4. 中间件支持: 中间件是 Go Gin 框架的核心概念,可以通过中间件实现各种功能,例如日志记录、认证、授权等。
  5. JSON 支持: 内置了对 JSON 的支持,便于处理 RESTful API 请求和响应。
  6. 模板引擎: 提供了支持 HTML 模板的功能,方便构建 Web 页面。
  7. 支持 WebSocket: Go Gin 支持 WebSocket,可以用于构建实时应用程序。


go Gin测试代码

package main 

import
  "net/http" 
 
"github.com/gin-gonic/gin"
 ) 

func  main () { 
  r := gin.New() 

  r.GET(
"/" , func (c *gin.Context) { 
    c.String(http.StatusOK,
"Hello world!"
  }) 

  r.Run(
":3000"
}

Java Quarkus
Quarkus旨在成为Java应用程序的高性能框架。它使用诸如提前编译(AOT)和本机镜像生成等技术,以实现快速启动时间和较低的内存消耗。

以下是 Quarkus 的一些主要特点和优势:

  1. 快速启动时间: Quarkus 采用了一系列技术,如静态编译、AOT(Ahead of Time)编译和优化的垃圾回收,以实现极快的应用程序启动时间。这使得 Quarkus 特别适合云原生场景,其中快速启动对于弹性和伸缩性至关重要。
  2. 低内存消耗: Quarkus 针对云环境和容器化应用程序进行了优化,通过减少内存占用来提高效率。这有助于在资源有限的环境中更有效地运行多个应用程序实例。
  3. 微服务支持: Quarkus 提供了对微服务架构的良好支持,包括构建和部署微服务、使用 REST 和 GraphQL 构建 API 等功能。
  4. 容器友好: Quarkus 的设计考虑了容器化部署,支持 Docker 和 Kubernetes 等容器编排工具,简化了在容器环境中的部署和管理。
  5. 多种构建工具支持: Quarkus 提供了对 Maven 和 Gradle 等主流构建工具的支持,使开发者可以使用他们熟悉的构建工具。
  6. 扩展模型: Quarkus 引入了一个扩展模型,使得开发者能够轻松地添加和配置依赖。这些扩展包括数据库连接、消息队列、安全性等,以满足各种应用程序的需求。
  7. Java 标准兼容: Quarkus 是构建在 Java 标准上的,因此与 Java 生态系统的现有技术和库兼容。开发者可以在 Quarkus 中使用他们喜欢的 Java 框架和库。

代码:

package org.acme;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import io.smallrye.common.annotation.NonBlocking;

@Path("/")
public class HelloWorldApplication {

    @GET
    @NonBlocking
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return
"Hello World!";
    }
}

性能测试结果
所有测试均在配备 16G 内存的 MacBook Pro M2 上进行。在负载测试中,我们使用了 Bombardier 测试工具。软件版本如下

  • Go v1.21.3
  • Quarkus 3.5.1(Java v21)

所有测试均使用 50、100 和 300 个并发连接执行了 1 千万次请求。

  • 在速度方面,Quarkus(Java)超过了 Gin(Go),这可能令人惊讶,因为 Java 虚拟机(JVM)的性能比机器代码更快。
  • 在资源利用方面,Gin 的 CPU 使用率较高。
  • 不过,值得注意的是,Quarkus 的内存消耗明显高于 Gin。

在最大延迟方面,Quarkus要差于 Gin五倍左右,并发50时,要慢10倍。

详细点击标题