当前位置: 首页 > 科技观察

Java无服务器函数入门

时间:2023-03-20 11:59:56 科技观察

对无服务器Java的研究从一个函数开始——一小段按需运行的代码。这个阶段并没有持续多久。虽然在1.0阶段,基于虚拟机架构的功能使这种范式流行起来,但它仍然存在执行时间、协议和本地开发体验差等局限性,这些都不太理想,如下图所示。开发人员随后意识到,相同的无服务器功能可以应用于微服务和Linux容器,并获得相同的好处。这导致阶段1.5,其中一些无服务器容器完全抽象Kubernetes,通过Knative或其他抽象层在其之上提供无服务器体验。在2.0阶段,Serverless开始处理更复杂的编排和集成模式,并结合某种级别的状态管理。更重要的是,开发人员关心在遗留系统中使用熟悉的Java应用程序运行时组合运行无服务器和非无服务器工作负载。无服务器Java之旅在Java开发人员开始无服务器功能开发之前,第一步是选择一个新的云原生Java框架,该框架可以比传统的单体应用程序更快地运行Java功能,并且内存占用更小。这在各种基础设施环境中都是如此,包括多云或混合云环境中的物理服务器、虚拟机和容器。开发者也可能固执地选择SpringFramework中的SpringCloudFunctions进行命令式和反应式函数开发。Spring还支持将Java函数部署到可安装的无服务器平台,例如Kubeless、ApacheOpenWhisk、Fission和ProjectRiff。但是,Spring启动慢、响应时间长、内存占用大等问题令人担忧。在Kubernetes等可扩展容器环境中运行Java函数时,这些问题可能会加剧。Quarkus是一个新的开源云原生Java框架,可以帮助解决这些问题。它的作用是设计无服务器应用程序并编写在Kubernetes等云基础设施上运行的云原生微服务。Quarkus以封闭的方式重新审视Java来构建和运行Java程序。它将Java变成了可与Go相媲美的运行时。Quarkus还包括100多个扩展,集成了企业级功能,例如数据库访问、无服务器集成、消息传递、安全性、可观察性和业务自动化。这是一个简单的示例,展示了如何使用Quarkus为Java无服务器项目创建框架。1、基于Maven创建Quarkusserverless项目,安装本地Kubernetes集群。开发人员有多种选择,包括Minikube和OKD。因为在Knative和DevOps工具上使用OKD安装serverless相关功能比较方便,所以本文使用OKD安装集群。这些有关OKD安装和Knative操作员安装的相关指南中提供了更多设置材料。以下命令创建一个Quarkus项目(例如quarkus-serverless-restapi),公开一个简单的RESTAPI,并下载用于Knative服务部署的quarkus-openshift扩展:$mvnio.quarkus:quarkus-maven-plugin:1.13.4.Final:create\-DprojectGroupId=org.acme\-DprojectArtifactId=quarkus-serverless-restapi\-Dextensions="openshift"\-DclassName="org.acme.getting.started.GreetingResource"2。在本地运行serverless功能在Quarkus开发模式下运行程序,检查RESTAPI是否有效。稍微调整一下代码:$./mvnwquarkus:dev输出以下内容:____________________________--/__\////_|/_\///_////__/-//_///_//__|/,_/,quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000<2>quarkus.kubernetes-client.trust-certs=true<3>quarkus.kubernetes.deployment-target=knative<4>quarkus.kubernetes.deploy=true<5>quarkus.openshift.build-strategy=docker<6>说明:<1>定义你部署无服务器应用程序的项目名称<2>使用容器注册表<3>在这个简单的例子中,使用自签名证书允许通过相关信任机制创建Knative资源<4>指示构建容器镜像后将扩展部署到OpenShift<6>设置Docker构建策略执行以下命令构建应用并直接部署到OKD集群:$./mvnwcleanpackage-DskipTests注意:oclogincomm并且应该提前使用以确保您登录到正确的项目(例如quarkus-serverless-restapi)。输出应以BUILDSUCCESS结尾。在为Knative服务执行的oc命令中,添加标签:$oclabelrev/quarkus-serverless-restapi-00001app.openshift.io/runtime=quarkus--overwrite然后访问OKDweb控制台,进入Topology即可在开发者视角中查看。您可能会看到您的容器pod(无服务器函数)已缩小为零(白色圆圈)。拓扑视图4。在Kubernetes环境中测试功能运行以下oc命令以搜索包含无服务器功能的路由:$ocgetrt/quarkus-serverless-restapi[...]NAMEURLREADYREASONquarkus-serverless[...]http://quarkus[...].SUBDOMAINTrue使用curl命令访问搜索到的路由:$curlhttp://quarkus-serverless-restapi-quarkus-serverless-restapi.SUBDOMAIN/hello几秒后,你可以得到和下面一样的结果本地:QuarkusFunctiononKubernetes当你回到OKD集群中的拓扑图时,Knative服务会自动展开。缩放KnativeFunction由于Knative服务的默认设置,其pod将在30秒后再次归零。下一步是什么?无服务器在不断发展,从在虚拟机上运行的功能开始,到无服务器容器,并与遗留企业系统集成。在此过程中,借助Quarkus,企业开发者仍然可以使用自己熟悉的技术(如Java)创建项目,然后构建并部署到Kubernetes。本系列的下一篇文章将指导您优化Kubernetes中的JavaServerlessFunctions,从而加快程序启动速度并减少内存占用。