ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Kubeless JVM 运行时实战指南:用 Java 与 Scala 打包并部署 JVM 函数

Kubeless JVM 运行时实战指南:用 Java 与 Scala 打包并部署 JVM 函数 后端云原生微服务【免费下载链接】kubelessKubernetes Native Serverless Framework项目地址https://gitcode.com/gh_mirrors/ku/kubeless点击查看免费下载Kubeless 原生支持多种语言的 Serverless 函数除了常见的 Node.js、Python、Go 之外还提供了基于 Java 虚拟机JVM的运行时变体。本指南以仓库 examples/jvm 目录中的示例文档为主线完整讲解如何把编译好的 JVM 代码Java/Scala打包成自包含的 fat jar并通过kubeless function deploy在 Kubernetes 上运行同时深入剖析 JVM 运行时的函数签名约定、_替代.的 handler 命名规则及其底层原理帮助你在 Kubeless 上快速跑通第一个 JVM 函数。JVM 示例Kubeless 中的编译型语言运行时模板仓库 examples/jvm/Readme.md 的定位非常明确这些示例用于在 Kubeless 中运行编译后的 JVM 代码并作为把其他语言接入 Kubeless 的模板参考。这暗示了 JVM 运行时与解释型运行时如 Node.js 直接提交.js、Python 直接提交.py的本质区别——JVM 函数在部署前需要先在本地完成编译与打包产出的是一个包含全部依赖的 jar 文件而非裸源码。JVM 示例在仓库中的整体编排可以参见 examples/Makefile其中对应的构建与验证目标如下get-jvm-java: kubeless function deploy get-jvm-java --runtime jvm1.8 --from-file jvm/java/test-java-jvm.jar --handler io_ino_Handler.sayHello get-jvm-java-verify: kubeless function call get-jvm-java | grep Hello world可以看到部署命令直接以编译产物test-java-jvm.jar作为--from-file的输入运行时 ID 为jvm1.8验证方式则是调用函数并检查返回内容。这套「构建 → 部署 → 调用」的闭环就是 JVM 运行时在 Kubeless 中的标准工作流。Java 函数Gradle 打包与部署仓库 examples/jvm/java/Readme.md 给出了 Java 函数的完整操作路径核心就两步先用 Gradle 构建带全部依赖的 fat jar再用 kubeless CLI 部署。第一步用 Gradle 构建 fat jargradle shadowJarshadowJar是 Gradle 插件 com.github.johnrengelman.shadow 中buildscript { repositories { jcenter() } dependencies { classpath com.github.jengelman.plugins.shadow:2.0.4 } } apply plugin: java apply plugin: com.github.johnrengelman.shadow version 0.1 jar { manifest { attributes Implementation-Title: jvm-test, Implementation-Version: version } }依赖部分值得注意示例显式声明了 JVM 运行时桥接包de.inoio.kubeless:jvm-runtime:0.1同时引入了log4j作为普通依赖并用 JUnit 支撑测试。也就是说示例中的函数并不依赖 Kubeless 官方仓库提供的io.kubeless参数类而是通过第三方协调包jvm-runtime来获得Event/Context类型——这正体现了 JVM 运行时“以 jar 为交付物、桥接包可替换”的灵活性。构建完成后产物位于build/libs/下文件名形如jvm-test-0.1-all.jarversion为0.1shadow 插件生成-all后缀的完整包。第二步部署函数kubeless function deploy test --runtime jvm1.8 --from-file build/libs/jvm-test-0.1-all.jar --handler io_ino_Handler.sayHello这里出现了一个 JVM 运行时特有的关键约定handler 中的包名路径使用_代替.。即函数类io.ino.Handler中的sayHello方法对应的--handler参数要写成io_ino_Handler.sayHello包名中的.全部替换为_类名与方法名之间仍以.分隔。这条规则在文档中明确强调为“The package name use_instead of.for the path.”是 JVM 函数最容易踩坑的地方。Java 函数签名示例examples/jvm/java/src/main/java/io/ino/Handler.java 给出了标准的 JVM 函数实现package io.ino; public class Handler { public String sayHello(io.kubeless.Event event, io.kubeless.Context context) { System.out.println(event.toString()); return Hello world! AFDFCH; } }函数签名符合 Kubeless 的通用约定接收Event与Context两个参数返回String。这里的io.kubeless.Event/io.kubeless.Context由依赖中的jvm-runtime包提供与 Kubeless 官方 Java 运行时见 docs/runtimes.md中约定的类型命名保持一致便于你从官方运行时切换到自定义 JVM 桥接。Scala 函数sbt assembly 打包与部署examples/jvm/scala/Readme.md 提供了 Scala 版本的完整示例。构建工具换成了 sbt打包任务为 assembly。构建 fat jarsbt assemblysbt-assembly插件由 examples/jvm/scala/project/assembly.sbt 引入addSbtPlugin(com.eed3si9n % sbt-assembly % 0.14.7)examples/jvm/scala/build.sbt 中除配置插件外还指定了产物名称、Scala 版本与依赖assemblyJarName in assembly : scala-test.jar organization : de.inoio scalaVersion : 2.12.1 libraryDependencies de.inoio.kubeless % jvm-runtime % 0.1注意 Scala 示例同样以de.inoio.kubeless:jvm-runtime:0.1作为 JVM 桥接依赖产物名称被固定为scala-test.jar构建后位于target/scala-2.12/目录下。部署与已知限制kubeless function deploy testscala --runtime jvm1.8 --from-file target/scala-2.12/scala-test.jar --handler de_inoio_Handler.fooBarhandler 规则与 Java 完全一致de.inoio.Handler的fooBar方法写作de_inoio_Handler.fooBar。文档同时给出了一个重要的已知限制提示Scala 示例生成的 jar 对存储后端来说体积过大此时需要改为把 jar 的 URL 传给--from-file而非本地文件路径。这也是 Scala 等依赖链较重的语言在 Serverless 部署中的典型注意事项——注意控制最终 jar 的体积或改用可被函数构建器拉取的远程地址。Scala 函数签名示例examples/jvm/scala/src/main/scala/de/inoio/Handler.scala 展示了 Scala 风格的实现package de.inoio import io.kubeless.{Context, Event} class Handler { def fooBar(event: Event, context: Context): String { FOO Bar aus Hamburg } }与 Java 版本相比Scala 示例将Event与Context通过import io.kubeless.{Context, Event}显式引入函数体直接返回字符串。可以看到无论 Java 还是 ScalaJVM 函数的核心契约就是(Event, Context) String。深入 JVM 运行时Event/Context 契约与官方 Java 运行时对照要理解 JVM 示例为什么这样写可以对照 Kubeless 官方文档 docs/runtimes.md 中 Java 运行时的说明。官方 Java 运行时要求函数使用io.kubeless作为包名导入io.kubeless.Event与io.kubeless.Context函数必须是public类中的方法签名接收Event和Context两个输入、返回String部署时--handler采用Classname.Methodname格式例如kubeless function deploy get-java --runtime java1.8 --handler Foo.foo --from-file Foo.java官方 Java 运行时还支持通过 Mavenpom.xml声明依赖部署命令如下详见 examples/java 与 docs/runtimes.mdkubeless function deploy get-java-deps --runtime java1.8 --handler Hello.sayHello --from-file java/HelloWithDeps.java --dependencies java/pom.xmlMaven 构建参数可通过环境变量传入例如代理配置kubeless function deploy get-java --runtime java1.8 --handler Foo.foo --from-file Foo.java --env MAVEN_OPTS-DproxySettrue -DproxyHostproxy_host -DproxyPortproxy_port而 JVM 示例所走的是一条不同的路线不提交源码、直接提交编译后的 fat jar运行时 ID 使用jvm1.8非官方运行时的java1.8。jvm1.8运行时在 docs/runtimes.md 中通过kubeless get-server-config输出的支持运行时清单里并未直接出现官方清单为java1.8等从仓库结构看jvm1.8属于社区/自定义运行时变体因此示例中才需要自带jvm-runtime桥接依赖来提供Event/Context类型。无论走哪条路线Event与Context的字段语义都可以从 Kubeless 的 Go 侧参数定义 pkg/functions/params.go 得到印证// Event includes information about the event source type Event struct { Data string EventID string EventType string EventTime string EventNamespace string Extensions Extension } // Context includes information about the function environment type Context struct { FunctionName string Timeout string Runtime string MemoryLimit string }Event承载事件来源信息数据、事件 ID/类型/时间/命名空间以及可扩展字段Context则描述函数运行环境函数名、超时、运行时、内存限制。JVM 运行时中的io.kubeless.Event/io.kubeless.Context在语义上即对应这套模型这也是所有 Kubeless 运行时统一遵循的函数入参契约。快速上手清单与排错提示结合上述内容在 Kubeless 上部署 JVM 函数的完整流程可归纳为编写函数实现(Event, Context) String签名的方法参考 examples/jvm/java/src/main/java/io/ino/Handler.java 或 examples/jvm/scala/src/main/scala/de/inoio/Handler.scala打包Java 用gradle shadowJar配置见 examples/jvm/java/build.gradleScala 用sbt assembly配置见 examples/jvm/scala/build.sbt产出包含全部依赖的 fat jar部署kubeless function deploy name --runtime jvm1.8 --from-file jar路径或URL --handler 包名用_分隔的类名.方法名验证通过kubeless function call name调用并检查输出或在 examples/Makefile 中直接复用get-jvm-java与get-jvm-java-verify目标。常见注意事项handler 命名包名中的.必须替换为_例如io.ino.Handler.sayHello→io_ino_Handler.sayHellojar 体积若 jar 过大导致存储后端无法承载需将 jar 发布到可访问的 URL 并在--from-file中传入该 URLScala 示例即有此限制桥接依赖使用jvm1.8这类自定义运行时需在项目中引入de.inoio.kubeless:jvm-runtime:0.1以保证io.kubeless.Event/Context类型可用运行时差异官方java1.8运行时提交 Java 源码并由 Maven 构建而jvm1.8运行时直接消费编译后的 jar二者部署参数与构建流程不同请根据实际运行时选择对应流程。至此你已掌握 Kubeless JVM 运行时从构建、打包到部署、验证的完整链路并理解了其函数签名约定与_命名规则的底层逻辑。这套「先编译打包、再上传 jar」的模式同样适用于任何基于 JVM 的语言可作为在 Kubeless 中接入新 JVM 系语言的起点模板。赞分享后端云原生微服务【免费下载链接】kubelessKubernetes Native Serverless Framework项目地址https://gitcode.com/gh_mirrors/ku/kubeless点击查看免费下载相关推荐Windows 文件被占用PowerToys 文件锁匠 3 步帮你快速释放文件占用Windows 文件被占用PowerToys 文件锁匠 3 步帮你快速释放文件占用 你想删除或移动一个文件Windows 却提示文件被另一个程序占用。P后端云原生微服务JCSprout 精读Java 运行时内存划分与 JVM 内存参数实战指南JCSprout 精读Java 运行时内存划分与 JVM 内存参数实战指南 导读本文以 JCSprout 仓库中的 MD/MemoryAllocation.文档知识库后端教程Deeplearning4J SameDiff深度解析JVM里的自动求导与图执行框架如何超越传统APIDeeplearning4J SameDiff深度解析JVM里的自动求导与图执行框架如何超越传统API SameDiff 是 Deeplearning4JD后端云原生微服务上一篇ScanTailor Advanced终极扫描文档处理完全指南下一篇FAST Colors 像素读取实战指南详解 PixelBlob.getPixel(x, y) 接口与 ImageDataPixelBlob 实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表