随着云支配的兴起,IT 部门利用的物理做事器减少,用电量也相应降落,结果是通过减少碳排放帮助缓解了景象变革。云架构有助于实现这一点,由于它们不须要掩护竖井式的打算资源,而是在须要保持业务做事运行时,高效共享所在云上的可用资源。
然而短期内,云迁移的这些好处对付二氧化碳的排放并没有产生显著的影响。这是由于采取云的速率比转向无碳根本举动步伐的速率要快得多。例如,谷歌云目前已实现碳中和,但他们正在努力成为无碳、可持续的云打算系统。

与此同时,开拓职员和架构师仍旧在尽可能地优化运用程序的性能,缩小容器镜像,缩短启动和相应韶光以及减少内存占用。他们相信,这终极能够减少运用层的打算花费。

Java 出身于 27 年前,用于运行业务做事。它有诸多优点,如较高的网络吞吐量、长期运行的进程和面向可变系统的动态行为。几十年前,这些都是很棒的特性,开拓职员可以编写灵巧、丰富的互联网运用,然后在多台运用做事器上运行。这些做事器位于由物理做事器和虚拟机组成的根本举动步伐上。
然而,自从 Kubernetes 和 Linux 容器面世以来,事情发生了变革。它为我们供应了一种新的模式,让我们可以重构现有运用。在云上,我们该当将这些运用当作牛而非猫。新运用的紧张特性是可移植、不可变及可快速扩展。
遗憾的是,Java 的动态特性在这个新时期并无多大上风。只管如此,企业仍旧掩护着大量基于 Java 技能栈构建的关键业务运用程序,这可能成为将事情负载迁移到云平台的障碍。这也使企业失落去了减少二氧化碳排放的机会,由于他们须要花不少钱来坚持传统根本举动步伐上的单体运用。
颇具讽刺意味的是,根据TIOBE排行榜,Java 仍旧是第三大最受欢迎的编程措辞。顺应这一趋势,涌现了许多开源项目和工具,如Shenandoah GC。它们试图从吞吐量管理方面优化 Java 的性能,通过扩展、临时状态及减少不可变系统的内存占用。遗憾的是,这些努力不敷以说服开拓职员将 Java 运用程序留在 Kubernetes 集群中,而不是采取 JavaScript 和 Python 等替代方案。
无做事器 Java作为减少云打算资源的无尽努力的一部分,通过定期监控运用程序事情负载和资源利用情形,许多企业已经意识到,所有业务做事都不须要一贯运行(例如 24 x 7 x 365)。
举例来说,某些做事(如订单做事)只有不敷 10%的韶光被终极用户和第三方访问。在这种情形下,当运用程序在某段韶光内(如 5 分钟或 30 秒)没有网络通信时,无做事器架构让你能够自动将运用程序缩减为零。
事实上,无做事器行为不仅可以运用于基于 HTTP 的微做事,还可以运用于来自物联网(IoT)边缘设备和 Kafka 做事器的分布式流做事。
作为一名 Java 开拓职员,你会问:“Java 如何处理无做事器架构?”更大的问题是:“Java 适宜开拓无做事器运用程序吗?”根据NewRelic的调查,由于重量级的程序包和动态行为,开拓职员常日不会在 AWS Lambda 上运行 Java 运用程序,如图 1 所示。
图 1:无做事器之爱
这便是为什么越来越多的开拓职员希望将 Node.Js 和 Python 运用程序引入无做事器平台和函数即做事(Function as a Service,FaaS),而不是演进现有 Java 运用程序的缘故原由。不要放弃你的 Java 技能!
下一节将先容如何使 Java 运用程序更适宜于无做事器架构。
构建一个原生可实行的 Java 运用程序不仅有巨大的好处,如启动和相应韶光缩短、内存占用变小,而且还办理了传统 Java 技能栈中存在的上述寻衅。让我们深入理解一下原生可实行文件的事情事理吧!
原生可实行文件是利用预编译器(AOT)构建的。该编译器会天生一个独立的原生镜像,个中包含运用程序类、依赖库和运行时。你可以理解为和 Linux 容器镜像类似,包含了在任何容器运行时和 Kubernetes 上运行运用程序所需的所有东西。
有了原生可实行文件,就不再须要 Java 虚拟机(JVM)来运行 Java 运用程序了。相反,原生镜像可以运行在 Substrate VM 上,它是GraalVM中的运行时组件(如垃圾网络器、线程调度)。
其余,Java 原生编译使开拓职员在无做事器事情负载中也连续坚持利用 Java 运用程序,由于原生可实行文件可以缩短冷启动的启动韶光,而这原来是许多企业想要采取无做事器架构时面临的最大寻衅之一。
下面是一份大略的教程,先容如何安装必要的 C 措辞库和依赖项,然后在你的操作系统年夜将 Java 运用程序编译成一个原生可实行的镜像。
安装 C 措辞库为了支持 C 措辞原生编译,须要利用以下命令安装 GCC 和干系库:
Fedora:
$ sudo dnf install gcc glibc-devel zlib-devel libstdc++-static
Debian:$ sudo apt-get install build-essential libz-dev zlib1g-dev
macOS$ xcode-select --install
要理解更多关于如何安装GraalVM的信息,请访问这个网站。
配置 GraalVM设置环境变量 GRAALVM_HOME:
Linux
$ export GRAALVM_HOME=$HOME/Development/graalvm/
macOS$ export GRAALVM_HOME=$HOME/Development/graalvm/Contents/Home/
安装原生镜像工具:
${GRAALVM_HOME}/bin/gu install native-image
如果还没设置的话,请利用以下命令设置环境变量 JAVA_HOME:
$ export JAVA_HOME=${GRAALVM_HOME}
不过,天生原生镜像须要预先供应很多关于运用程序的信息。只有当一个类或方法被明确注册后,反射才会起浸染。这就哀求 Java 开拓者在构建原生可实行镜像之前,对当前所有的运用程序进行转换,以便注册反射。
Kubernetes 原生 Java 入门:Quarkus如果可以连续开拓云原生微做事,而且不须要花太多韶光处理反射,那么你是否只须要在支配到 Kubernetes 集群之前构建一个原生可实行镜像?我很确定,这对 Java 开拓者来说是很好的。
Quarkus是一个开源项目,旨在供应一个标准的 Java 技能栈,使 Java 开拓者不仅可以在 OpenJDK 上构建容器优先的运用程序,还可以编译天生原生可实行文件,在 Kubernetes 集群上运行,从而得到以下好处:
将尽可能多的事情转移到构建阶段最大限度地减少运行时依赖最大限度地肃清去世代码引入清晰的元数据左券增强开拓职员的体验(如DEV UI、开拓做事、命令行)。Quarkus 还供应了一个扩展,即Funqy,其目的是针对OpenShift无做事器、Knative、AWS Lambda、Azure Functions和谷歌云平台等无做事器平台编写可移植的无做事器函数。
下面是一份快速入门指南,先容如何利用 Quarkus 新建一个利用了原生可实行编译的无做事器函数。
新建一个无做事器 Java 项目搭建一个 Quarkus 项目,并利用Quarkus命令行工具创建一个函数:
$ quarkus create quarkus-serverless-example -x funqy-http
这个命令会帮你下载 Funqy 扩展,并启用 Quarkus Funqy 功能,其输出如下所示:
Creating an app (default project type, see --help).-----------selected extensions: - io.quarkus:quarkus-funqy-httpapplying codestarts... java maven quarkus config-properties dockerfiles maven-wrapper funqy-http-codestarts-----------
Quarkus 项目成功创建到下面的目录里:
--> /Users/USERNAME/quarkus-serverless-example-----------
进入项目的根目录,打开src/main/java/org/acme目录下的MyFunctions.java文件。个中默认天生了一个大略的函数方法fun,可以返回问候信息。@Funq表明使一样平常方法成为可以通过 RESTful API 访问的函数。
@Funqpublic String fun(FunInput input) { return String.format("Hello %s!", input != null ? input.name : "Funqy");}
可以新增一个函数或在现有的函数中添加业务逻辑。这里,我们暂时保留默认代码。
构建并将原生可实行文件支配到 KubernetesQuarkus 供应了一个 OpenShift 扩展,用于构建运用程序并将其支配到 Kubernetes 集群上。实行以下 Quarkus 命令行来添加扩展:
$ cd quarkus-serverless-example$ quarkus ext add openshift
输出如下所示:
Looking for the newly published extensions in registry.quarkus.io
[SUCCESS] ✅ Extension io.quarkus:quarkus-openshift has been installed
在src/main/resources目录中的application.properties文件中添加以下用于 Kubernetes 支配的配置。须要将YOUR_NAMESPACE更换为实际支配该功能的命名空间(例如doh-dev)。
quarkus.container-image.group=YOUR_NAMESPACEquarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000quarkus.kubernetes-client.trust-certs=truequarkus.kubernetes.deployment-target=knativequarkus.kubernetes.deploy=truequarkus.openshift.build-strategy=dockerquarkus.openshift.expose=true
也可以利用容器运行时(如 Docker 或 Podman)构建一个原生可实行镜像,只要添加以下配置:quarkus.native.container-build=true
请把稳,这里有办理方案库。
为了支配该函数,你可以利用自己的 Kubernetes 集群(例如minikube),但我建议利用红帽OpenShift开拓者沙盒。你只要注册一个免费账户,它会供应一个共享 Kubernetes 集群。该沙盒使你能够在 10 分钟内启动一个新的 Kubernetes 集群,无需在本地文件系统上进行任何安装或配置。
实行以下 Quarkus 命令行,构建并支配函数到 Kubernetes 集群:
$ quarkus build --native --no-tests
输出该当以BUILD SUCCESS结束。
进入 OpenShift 开拓掌握台的 Topology 视图,可以看到 Java 函数(quarkus-serverless-example-00001)已经支配完毕。该函数可能会被缩减为零,由于 Knative 做事的默认设置为 30 秒,如果在这段韶光内没有网络流量到达该函数的 pod,函数就会停掉,如图 2 所示。
图 2:Topology 视图中的函数
请把稳,可以给 REV 和 KSVC 添加一个新标签,将 pod 显示为 Quarkus 函数,让你在查看 Topology 视图时可以轻松区分各 pod。利用oc命令行,如下所示:
向 REV 添加一个 Quarkus 标签:
oc label rev/quarkus-serverless-example-00001 app.openshift.io/runtime=quarkus --overwrite向 KSVC 添加一个 Function 标签:
oc label ksvc/quarkus-serverless-example boson.dev/function=true --overwrite
复制RouteURL,然后粘贴到以下 CURL 命令行中来访问该函数。例如,该 URL 看起来可能是这样:https://quarkus-serverless-example-doh-dev.apps.sandbox.x8i5.p1.openshiftapps.com。
$ curl --header "Content-Type: application/json" \ --request POST \ --data '{"name":"Daniel"}' \ YOUR_ROUTE_URL/fun
输入类似下面这样:Hello Daniel!
回到 Topology 视图,你会看到函数 pod 在一秒钟内自动启动,如图 3 所示。
图 3:向上扩展函数
查看 pod 日志,你会创造 Java 无做事器函数是作为一个native镜像运行的。它的启动韶光是 17 毫秒,如图 4 所示。
图 4:原生可实行文件的启动韶光
啊,一个超音速的亚原子运用!
从现在开始,这些新的 Java 无做事器函数将使你能够在 Kubernetes 上优化资源利用,减少二氧化碳排放。
本文先容了 Java 无做事器运用程序。在容器平台上(如 Kubernetes),它供应了比其他任何编程措辞都高的资源密度,可以帮助组织减少二氧化碳排放,如图 5 所示。
图 5:容器平台上多个运用程序的资源密度
要构建 Java 运用程序原生镜像,开拓职员还可以选择三个 GraalVM 发行版中的一个:Oracle GraalVM 社区版(CE)、Oracle GraalVM 企业版(EE)和 Mandrel。从这里可以进一步理解 GraalVM 和 Mandel 之间的差异。如果要连续 Kubernative 原生 Java 之旅,可以访问这个网站。
作者简介:
Daniel Oh 是红帽公司高等首席技能营销经理,卖力向开拓者先容如何利用云原生运行时(即 Quarkus、Spring Boot、Node.js)和 OpenShift/Kubernetes 构建云原生微做事和无做事器函数。作为 CNCF 大使,Daniel 将连续为各种云开源项目和生态系统做出贡献,以加速 DevOps 在企业中的运用。他在许多技能研讨会、事情坊和聚会上发言,为企业开拓职员和 DevOps 团队阐述新兴技能。
原文链接:
Reduce Carbon Dioxide Emissions with Serverless and Kubernetes Native Java










