返回顶部
首页 > 资讯 > 精选 >云原生时代是Java还是Go
  • 449
分享到

云原生时代是Java还是Go

2023-06-16 09:06:46 449人浏览 薄情痞子
摘要

这篇文章主要讲解了“云原生时代是Java还是Go”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“云原生时代是Java还是Go”吧!Java曾经著名的座右铭:"一次编写,到处运行&qu

这篇文章主要讲解了“云原生时代是Java还是Go”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“云原生时代是Java还是Go”吧!

Java曾经著名的座右铭:"一次编写,到处运行",已经很过时了,因为现在我们只想在容器里运行代码。在容器里,一个 "Just in time  "的编译器意义不大。

出于这个原因,可能为了更好地适应云计算,Java生态系统正处于转型之中。oracle  的GraalVm允许将字节码编译成linux可执行文件(ELF),而Rad  Heat的Quarkus以及其他框架,则立志让响应式服务这件事变得更简单。Quarkus以Netty和Vertx.x为核心,可以用来构建非常高效的响应式WEB服务。

云原生时代是Java还是Go

Java编译成可执行二进制文件,以毫秒级的速度启动,内存占用很小。这样就可以利用Java生态系统,甚至可以用其他JVM语言(如ScalaKotlin)编写。你可以用online项目生成器玩玩Quarkus,或者用Maven插件在本地生成一个项目。

golang则是为云而生的,在容器中运行时,没有遗留负担。它被认为是云端的编程语言。生成的二进制可执行文件很小,快速启动,内存占用也很小,而且这是从Go诞生之初就具备的特性。Golang的流行对  Java 世界形成了严峻的挑战。

Java有机会吗,也许只有时间才会告诉我们最终答案。然而,出于好奇,我想从性能和开发体验方面比较一下 Java 和 Golang 的云原生服务。

在这篇文章中,我将使用两种语言来写同样的服务。比较它们的CPU使用率、RAM、延迟和运行速度。这些服务将在容器中启动,资源分配相同,使用ab来测试

对于我的案例来说,这是一个 "足够好 "的基准,因为我不假设找到最好/最差的基准结果,而是在同一环境下执行运行两个基准测试进行比较。

场景

这两个服务将连接到在另一个容器中运行的MySQL数据库,有一个表和三行数据。

云原生时代是Java还是Go

每一个服务都会获取所有记录,将它们转化为对象,然后输出JSON数组

ab将发出10K请求,并发级别为100,quarkus JVM版本运行两次(用于测试 "冷"/"暖 "JVM)。

云原生时代是Java还是Go

Go语言版本

Go语言版本使用gin框架。

# the service package main  import (     "database/sql"     "fmt"     "GitHub.com/gin-gonic/gin"     _ "github.com/go-sql-driver/Mysql"     "net/Http" )  type Fruit struct {     Id  int `json:"id"`     Name string `json:"name"` }  var con *sql.DB  func init(){   //opening a mysql connection pool with another container    db, err := sql.Open("mysql", "root:passWord@tcp(host.Docker.internal:3306)/payments")    if err != nil {        panic("failed to open a mysql connection")    }    con = db }  func main() {     r := gin.Default()     r.GET("/fruits", fruits)     r.Run() //server up on 8080 }  // THE REQUEST HANDLER func fruits(c *gin.Context) {     fruits := getFruits()     c.JSON(http.StatusOK, fruits) }  func getFruits() []Fruit {     rows, _ := con.Query("SELECT * FROM fruits")     fruits := []Fruit{}     for rows.Next() {         var r Fruit         rows.Scan(&r.Id, &r.Name)         fruits = append(fruits, r)     }     return fruits }

Golang的MySQL驱动的使用go-sql-driver。golang的代码风格是非常明确的。一种一切都在眼前态度。主函数启动服务器,配置请求处理程序,打开DB连接。

编译本地可执行文件

云原生时代是Java还是Go

Kotlin版本

package org.acme import io.vertx.core.json.JsonArray import io.vertx.core.json.JsonObject import io.vertx.mutiny.mysqlclient.MySQLPool import io.vertx.mutiny.sqlclient.Row import io.vertx.mutiny.sqlclient.RowSet import java.util.concurrent.CompletionStage import javax.inject.Inject import javax.ws.rs.GET import javax.ws.rs.Path import javax.ws.rs.Produces import javax.ws.rs.core.MediaType  @Path("/fruits") class FruitResource {     @field:Inject     lateinit var client: MySQLPool       @GET     @Produces(MediaType.APPLICATION_JSON)     fun listFruits(): CompletionStage<JsonArray> {         return client.query("SELECT * FROM fruits").execute()                 .map { rows: RowSet<Row> ->                     rows.fold(JsonArray()) { array, row ->                         array.add(JsonObject()                                 .put("id", row.getLong("id"))                                 .put("name", row.getString("name")))                     }                 }.subscribeAsCompletionStage()     } }

数据库连接使用Quarkus React Mysql 扩展。

云原生时代是Java还是Go

与Go版本相比,代码有很大不同,比如CDI依赖注入,使用javax注释的声明式路由,自动配置解析,以及数据源/连接创建/服务器引导。这是使用框架的代价,它为你完成了繁重的工作,并决定了做事方式。不过,它比go版本代码要简短很多。

这里使用Netty响应式web服务器,由Vert.x多事件循环包装,还有一个Vert.x响应式MySQL驱动,这样可以用一个线程处理多个DB连接。

另外,我可以使用Kotlin的集合库的fold函数,这种函数还没有通用的Go版本。

编译Java版本的可执行文件

云原生时代是Java还是Go

我已经弄清楚构建过程中发生了什么,其核心是SubstrateVM。它被设计在AOT过程中的可嵌入虚拟机,它会链接到我们的代码,并作为一个单元进行编译。然而根据Oracle的说法,SubstrateVM的优化比HotSpot  Vm少,垃圾收集器也比较简单。

该AOT编译器被称为  "Graal",它是语言不相关的。java字节码需要被翻译成一种中间表示法(Truffle语言)。这在这篇文章【1】中可以找到关于Graal和Truffle的相关论述。

构建一个 Java 本地可执行文件看起来更复杂,编译得更慢,它产生的二进制文件几乎是Go版本两倍大小。然而一个35M的可执行二进制文件和Java  Fatjar相比,还是小D多了。35MB甚至可以让你使用aws lambda运行。

压力测试

我在本机运行所有测试,设置如下。

  • MacBook Pro(15英寸,2017年

  • 9 GHz英特尔酷睿i7(8个核心)。

  • 16 GB 2133 MHz LPDDR3

使用cAdvisor的工具监控容器的统计数据。

场景

  • Quarkus JVM hotspot

  • Quarkus Java native

  • Golang

上述的每种情况都在以下三种配置上测试

  • 100MB / 0.5 CPU | 200MB / 1 CPU | 300MB / 2 CPU

我主要关注:

  • cpu/ram利用率(多核的利用率)

  • cpu/ram峰值

  • cpu/ram空余

  • 启动时间

  • 响应延迟avg/max

  • 吞吐量(每秒请求数)

测试结果

云原生时代是Java还是Go

看起来Quarkus已经为生产环境做好准备了,它允许简单的JVM/原生发布/开发  模式,并允许在本地运行原生测试。只要你不使用反射或JNI,根据GraalVM的配置就是可行的。否则,你将不得不自己配置graal编译器,然而现在也有解决方案。

延迟和吞吐量

Golang 和原生 Java 的测试结果比较接近,虽然平均来说 Golang 版本的测试结果略好一些。不过,Java  Native版本的测试结果更稳定。Golang服务有时在1.25&mu;s内完成响应,也有一部分需要7s才能完成。

"预热 "后的JVM版本结果也不差,但比Native或Go版本稍逊一筹。

CPU利用率

使用0.5核的时候,Go和native-java在负载下似乎都表现不佳,而用2核启动时,也没有明显改善。这可能是因为工作负载的瓶颈是IO。或者是因为gin/Netty的默认配置没有考虑到多核的问题。

而JVM版本则利用了所有给定的核心,并在各个维度上提升了性能。

内存使用率

在压力下,Java native 使用40MB,Golang 使用24MB。两种情况下都还不错,虽然Golang版本使用的内存几乎少了一倍。

JVM使用了140MB。和Quarkus官方的统计完全一样。对于JVM来说还不错,但比Golang版本多了近6倍。

启动时间

Golang和cloud-native  java都能立即启动,然而JVM版本需要几秒钟(取决于分配的CPU),并且在启动时产生CPU峰值。如果配置不当,会导致k8s  HPA发飙,并增加pods。

开发体验

这与其说是一个实际问题,不如说是一个宗教问题。Quarkus 使用了在 Java  世界中很常见的抽象(比如基于注解的DI)。它为你启动服务并创建连接池。它可以使用丰富的集合标准库和generics。然而,这可能感觉有点像黑魔法,一旦有些组件不工作,你会感觉很无助。此外,将  Java  代码编译成原生二进制并不是那么简单,有一些限制和注意事项是你必须知道的,并非每个Java库都能兼容原生编译。一旦使用一个不兼容的库(比如Guice),你就需要自己配置Graal  VM。

Quarkus 和 Graal VM "相对  "较新。所以可能会有一些问题。但由于双模式(JVM或原生)。在原生版本的某些组件停止工作的情况下,总是有一个后备方案,这对任何新问题来说都是很好的变通方法。

另一方面,Golang 在成立10年后才承认它需要generics。而且它肯定不喜欢框架使用很多魔法操作。这在很多方面既是好事也是坏事。此外,尽管 Go  社区做的非常好,然而可用的工具和库还是相对较少。然而它的编译和构建过程更快/更简单。而且兼容每个Golang的包,没有java-native平台带来的限制。

感谢各位的阅读,以上就是“云原生时代是Java还是Go”的内容了,经过本文的学习后,相信大家对云原生时代是Java还是Go这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 云原生时代是Java还是Go

本文链接: https://lsjlt.com/news/283018.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 云原生时代是Java还是Go
    这篇文章主要讲解了“云原生时代是Java还是Go”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“云原生时代是Java还是Go”吧!Java曾经著名的座右铭:"一次编写,到处运行&qu...
    99+
    2023-06-16
  • 选择Go好还是Java好
    这篇文章主要介绍“选择Go好还是Java好”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“选择Go好还是Java好”文章能帮助大家解决问题。1. 初遇 Go2017 年初,我接手了一个非常有趣的项目,...
    99+
    2023-06-27
  • Java Kubernetes 与 Java:引领云原生时代的新潮流
    Java一直是企业软件开发的热门选择,其稳定性、成熟度和丰富的库和框架生态系统使其成为构建高性能、可扩展应用程序的理想选择。Kubernetes作为容器编排和管理系统,提供了一个统一的平台来部署、管理和扩展容器化应用程序。Java和Ku...
    99+
    2024-02-10
    Java Kubernetes 云原生 微服务 DevOps 弹性 可移植性
  • 云原生已来,云原生是什么?
    前言Internet 改变了人们生活、工作、学习和娱乐的方式。技术发展日新月异,云计算市场风起“云”涌,从最初的物理机到虚拟机(裸金属) ,再到容器(Container),而互联网架构也从集中式架构到分布式架构 ,再到云原生架构。如今 “云...
    99+
    2023-06-05
  • 开发php用原生好还是框架好
    这篇文章主要介绍“开发php用原生好还是框架好”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“开发php用原生好还是框架好”文章能帮助大家解决问题。原生 PHP当我们说“使用原生 PHP 时”,我们指...
    99+
    2023-07-05
  • 阿里云是找代理还是官网
    对于想要使用阿里云服务的用户来说,寻找可靠的代理或官网是非常重要的。以下是一些建议,以帮助您了解如何选择阿里云的产品和服务: 寻找具有资质的代理或官网。在选择阿里云产品和服务时,需要确保代理或官网的资质和认证是否真实可靠。一些代理或官网...
    99+
    2023-10-28
    阿里 官网 云是找
  • 阿里云是代理的吗还是直销
    首先,我发现阿里云在某些方面存在一些不透明的情况。比如,在用户购买阿里云产品时,阿里云会强调其采用的是什么品牌的硬件和软件,并声称这些硬件和软件可以保证高稳定性和高性能。然而,当用户实际使用阿里云时,这些宣传往往会被证明是不可靠的。另外,一...
    99+
    2023-10-27
    阿里
  • 实时数据处理怎么选?Go还是NumPy?
    随着数据量的不断增大,实时数据处理变得越来越重要。对于实时数据处理,选择合适的工具和技术是至关重要的。在本文中,我们将比较两种流行的实时数据处理工具:Go 和 NumPy,以便您选择最适合您的应用程序的工具。 Go是一种由Google开发...
    99+
    2023-06-22
    numy numpy 实时
  • GO还是JavaScript?哪个更适合实时应用?
    随着互联网的快速发展,越来越多的应用程序需要实时响应用户的操作。这就引发了一个问题:GO还是JavaScript更适合实时应用? GO是一种由Google开发的编程语言,它的设计目标是在保持简单易用的同时,提高程序的运行效率。JavaScr...
    99+
    2023-06-26
    javascript 实时 linux
  • Python写代码时使用tab还是空格
    本篇内容介绍了“Python写代码时使用tab还是空格”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对于程序员来说,其实Tab和空格远远不只...
    99+
    2023-06-02
  • Java 与 Kubernetes 携手起舞:云原生时代的华丽变身
    在云计算的浩瀚海洋中,Java 和 Kubernetes 犹如一艘航行平稳的巨轮,携手共舞,开辟了云原生时代的崭新航线。Java 作为企业级开发的基石,以其稳定性、安全性、跨平台兼容性和丰富的库生态系统而闻名。而 Kubernetes,...
    99+
    2024-02-29
    Java、Kubernetes、云原生、微服务、容器化
  • java原生序列化机制是什么
    Java原生序列化机制是一种将对象转换成字节流的过程,以便在网络上进行传输或将对象保存到文件中。通过Java原生序列化机制,可以将对...
    99+
    2023-10-11
    java
  • Kubernetes 赋能 ASP 应用:拥抱云原生时代
    Kubernetes 概述 Kubernetes 是一个开源的容器编排系统,用于自动化管理容器化的应用程序。它提供了容器编排、调度、自动伸缩、负载均衡、秘密管理、服务发现等一系列功能,可以帮助企业构建和运行可扩展、可移植、可管理的现代应...
    99+
    2024-02-21
    Kubernetes ASP 应用 云原生 扩展性 弹性 资源利用效率
  • java生成随机数的原理是什么
    java生成随机数的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程...
    99+
    2023-06-14
  • 阿里云代理服务器是真的吗还是假的
    首先,阿里云代理服务器是否真的可靠取决于其提供的服务质量。阿里云在国内市场的知名度和影响力比较高,而且在全球市场也有着广泛的布局,这些都为其提供了可靠的代理服务提供了基础。如果阿里云代理服务器的性能和稳定性不足,可能会导致客户无法访问和使用...
    99+
    2023-10-27
    阿里 代理服务器
  • 阿里云代理返利是真的吗吗还是假的
    近年来,阿里云作为国内领先的云计算服务提供商,在市场上拥有很高的知名度和良好的口碑。但是,很多人对阿里云代理返利的真假持怀疑态度。那么,阿里云代理返利到底是真的还是假的呢? 首先,我们需要了解一下阿里云代理返利的真实性。阿里云的代理模式是...
    99+
    2023-10-27
    阿里
  • 阿里云官网买好还是代理商
    但是,购买云计算服务并不是一件简单的事情。购买阿里云需要考虑很多因素,例如产品的可靠性、性能、价格、服务支持等等。如果您想要购买阿里云的云计算服务,可以通过以下方式进行购买: 访问阿里云的官方网站:在阿里云的官方网站上可以查看不同的产品...
    99+
    2023-10-28
    阿里 官网 代理商
  • java动态代理的原理是什么
    小编给大家分享一下java动态代理的原理是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、说明使用代理将对象包装起来,然后用该代理对象取代原始对象。任何对原...
    99+
    2023-06-15
  • python生成词云的原理是什么
    Python生成词云的原理是通过对文本进行分词处理,统计每个词出现的频率,然后根据词频的大小,将词语以不同的字体大小和颜色显示在图像...
    99+
    2023-10-26
    python
  • 阿里云原生服务器是什么
    什么是阿里云原生服务器? 阿里云原生服务器是指由阿里云自主研发和生产的服务器产品,它采用最新的技术架构和高性能硬件,具有高可靠性、高可用性、高性能等特点,可以满足不同规模和应用场景的需求。阿里云原生服务器的优势高性能:阿里云原生服务器采用最...
    99+
    2024-01-20
    阿里 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作