首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何利用Kubernetes榨干JAVA

导语

Java到今年5月份,就进入第25年了。一直以来,Java一直是最广泛使用的编程语言之一。IEEE计算机协会将其列为前三位的编程语言之一。2020年,JetBrains公司将其列为是最流行的主要编程语言。

正文

Java的早期魅力在于它承诺一次写入的能力,它可以将标准代码实践紧密耦合到特定硬件的任何地方进行对比的任何地方运行。从理论上讲,这种可移植性应允许开发人员编写可在任何平台上未经修改地运行的代码。

但是,Java作为企业平台的持续流行可能与该语言的稳定性和向后兼容性有关,这意味着,尽管随着时间的推移逐渐对Java标准进行了增强,但十年前编写的应用程序代码仍然可以运行。还有一些围绕Java开发的应用程序框架,这些框架一直使它成为构建企业应用程序和服务的坚定支持者。例如,诸如Java数据库连接(JDBC)API之类的框架为Java应用程序提供了一种查询数据库的标准方法。

但是,技术日新月异,现代IT生态系统正朝着原生云技术发展,例如容器和构建应用程序,它们的模块化和分布性更高,使其更易于扩展。当然,Java早于云原生时代,它是为单片应用程序堆栈设计的,其中单个应用程序可能在其自己的专用物理服务器上运行。

这并不意味着您不能在容器中运行Java应用程序,仅意味着在创建Java时所做的一些假设使其对于这种应用程序部署样式不理想。开发人员必须意识到这些,有时还要解决它们。例如,Java应用程序的启动速度可能很慢,而内存却有些沉重,这在寿命相对较短的轻量级容器化应用程序世界中都是不利的。

Java被设计为在自己的环境中运行,并带有Java虚拟机(JVM)来在执行过程中管理应用程序资源。JVM是Java实现可移植性的方式– Java应用程序被编译为Java字节码,由为每个平台创建的JVM执行。或者,可以在运行时将字节码编译为本地代码,这就是启动延迟的原因。

Red Hat是一家在Java和云原生领域都站稳脚跟的公司,其一侧拥有JBoss企业应用程序平台和自己的OpenJDK构建,而另一侧则具有围绕Kubernetes构建的OpenShift容器平台。为了改善Java在基于容器的环境中运行的方式,该公司启动了一个名为Quarkus的新开源项目,旨在创建Kubernetes原生Java框架。红帽。

“在过去的几年中,我们发现Java确实不适合高密度,低资源的环境,” Sharples告诉The Next Platform。“ Java JDK运行时是一项了不起的工程壮举,它完成了一些令人难以置信的事情,但是它确实是为这样一个时代设计的:您拥有一台专用计算机,一个拥有大量内存的大型多处理器系统,而Java的工作是最大限度地利用机器必须提供的所有资源,并为大型银行应用程序提供最佳的吞吐量。”

Java应用程序的一个显著问题是,如果开发人员允许JVM为诸如垃圾收集器和堆大小之类的功能设置默认值,则在容器内运行的Java进程将不会表现出预期的行为。这恰恰是因为Java早于Linux内核功能(例如cgroup),这些功能控制着容器内部进程使用的资源,因此它只是查看整个系统可用的资源,并相应地为其分配内存和CPU。

Java 10的发布部分解决了该特定问题,因此JVM能够识别cgroup设置的约束,从而可以直接为容器中的Java应用程序定义内存和CPU约束。

但这不是唯一的问题。如前所述,容器背后的学说是容器是短暂的。实例在需要时产生,它们运行一小段时间,然后被杀死,如果再次需要其功能,则新实例将取代它们。这几乎与Java设计的运行方式截然相反。

“我们现在生活在一个世界上,您很幸运能得到一台物理机的一小部分,您将在虚拟机中得到一个容器,您可能只是获得足够的CPU和内存来一次执行您的功能。您的应用程序组件,微服务或功能本质上是短暂的-它们来来往往,每小时可能重新部署数十次。Java所做的许多令人惊奇的事情是它可以随时间进行的概要分析和调整,以优化代码执行。再说一次,如果您的代码一次运行数月甚至数年,那完全有道理。如果您只能按功能运行,那么您将无能力执行任何操作。” Sharples解释说。

这意味着Java代码将浪费宝贵的时间在分布式容器部署模型中多余的事情上。Java应用程序或应用程序服务器所做的事情是在启动时花费大量时间来进行类加载和加载配置数据,并且每次应用程序启动时都会这样做。

“所有这些开始变成真正的开销,您要做的所有初始化工作。因此,我们基本上将所有这些东西都拿走了,并把它推到了编译时间,所以只完成了一次。您可以将其完全脱离生产环境。这确实大大缩短了启动时间,这对于可以经常部署的微服务很重要。从按下部署按钮到能够处理第一个请求之间的时间是至关重要的–如果您必须等待30秒或一分钟才能开始处理请求,那真是浪费。

本质上,这就是Quarkus所要提供的-提供一个Java执行框架,以最大程度地减少内存和CPU占用空间,并减少将代码部署为容器实例时延迟启动和运行的所有代码。

实现此目标的主要方法是合并另一个开源项目GraalVM。(开源软件项目通常像俄罗斯玩偶一样,包含其他开源项目的层)。GraalVM替代了广泛使用的HotSpot JVM,而不是通常的Java字节码即时编译,而是将应用程序代码提前编译为本地可执行文件。诸如内存管理和线程调度之类的功能是从另一个称为Substrate VM的JVM中提取的,并与应用程序一起编译为本机可执行文件,以产生具有更快启动时间和更少运行时内存开销的代码块。

但是,应该指出的是,尽管Quarkus使Java成为Kubernetes和容器世界中的一等公民,但并未设想将现有的Java企业应用程序迁移为与Quarkus一起运行。

“我们不希望您使用百万行的整体Java应用程序并在Quarkus中运行它。那是行不通的,”夏普莱斯说。

取而代之的是,Quarkus用于新应用程序的新开发,但允许开发人员在进入云原生应用程序领域时保留其Java技能和编程经验。但是要这样做,这些开发人员必须能够访问过去25年来围绕Java演变的许多代码库和框架,以提供关键的业务功能和服务。

“ Java的真正好处之一是,它确实拥有一个庞大的库和实用程序生态系统,可以执行几乎所有事情。某些语言(例如Golang或Rust)虽然很适合在云原生环境中运行,但是却不适合构建业务应用程序,因为它们没有所有这类库和庞大的生态系统”,夏普尔斯说。

“因此,我们早先决定要确保它仍然有用,并且要获得Java的好处,我们需要确保许多流行的框架也可以在Quarkus环境中运行。我们要做的是向这些项目添加某种元数据,以便Quarkus可以优化它们并确保以正确的方式对其进行编译。”

Sharples声称,现在大约有200个Java框架已经对Quarkus提供了必要的支持,其中包括关键工具,例如用于将面向对象的域模型映射到关系数据库的Hibernate,用于RESTful Java应用程序的RESTEasy以及用于创建微服务的Spring Boot框架。

作为一个开源项目,Quarkus不是Red Hat的“所有者”,但是与其他开源工具(例如OpenStack)一样,IBM软件部门提供了自己的项目构建,该项目已添加到Red Hat Runtimes系列中。旨在与其OpenShift应用程序平台集成。OpenShift本身经历了一次转型,从2015年从定制的Linux容器技术转变为Docker风格的容器和Kubernetes。

这一切意味着开发人员可以使用Quarkus和Kubernetes,并将二者与IntelliJ,Eclipse或VSCode之类的IDE结合在一起,以在容器化框架中操作Java应用程序,而Red Hat将其作为其自身开发和部署环境的一部分提供为客户服务。

值得一提的最后一个因素是,就Quarkus而言,红帽打算“吃掉自己的狗粮”,并打算将其用于未来自己的一些产品的开发中。

随着时间的推移,它将成为Red Hat其他许多产品的基础。我们的许多产品都是用Java编写的,与其他客户一样,我们也将在这些产品的下一代产品中使用Quarkus。” Sharples说。

“我们将构建许多自己的产品,并选择编译成本地产品并以较小的占用空间高效运行,我们希望合作伙伴也能做到这一点。因此,它既是用于开发自己的自定义应用程序的最终用户技术,还是红帽产品以及我们的合作伙伴的支持技术。”

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200620A00X9N00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券