Capsule:开源的 JVM 应用部署工具

【编者按】本文做者 Ron Pressler 是 Parallel Universe 公司的创始人,拥有着丰富的高性能开发经验。经过这篇文章,Ron 向你们详细介绍了全新的开源 JVM 部署工具——Capsule, 本文系 OneAPM 工程师编译整理。html

现实世界中,应用程序部署过程可能没有想象中的那么简单。应用程序其实很是「敏感」,在部署过程当中,它会发现本身身处一个陌生的环境中,而且在与不一样硬件、不一样基础设施软件,以及陌生的邻居(应用程序)行交互。若是指望应用程序正常地运行,编码和部署过程都是重中之重。二者之间的平衡经常依赖于程序的编写语言、程序构成的运行时和工具,所以,不一样的技术栈可能须要不一样的部署工具。java

但 JVM 应用程序对环境的要求很是少——只需一个 JVM 和一个内核,然而意想不到是,目前为止尚不存在一个通用的 JVM 应用部署工具/机制。Fat JARs 并不总奏效,并且它们须要平台特定的脚本。最近有人使用 Docker 来部署 Java 应用,事实上 Docker 并不适用于这种任务:它的主要目的之一是提供通用的应用可移植性(相似 JVM 应用已经具有的特性),同时它也须要下载、部署并管理各类 full-OS 镜像和存 repositories。做为运行时不可知工具,Docker 也没法利用 JVMs 的优点。web

当下,通过一年的发展,Capsule 1.0 正式发布——一个简单、健壮且灵活的 JVM 应用部署工具。Capsule 迎合 JVM 应用的独特优点和需求,所以这里有理由相信这是最简单、最强大的 JVM 应用部署方式,不论是用于一个桌面应用、microservice 或复杂的 Web 应用。Capsule 不只适用于 Java 应用程序,还能应用于全部 JVM 语言,从 Jruby、Jython 和 Groovy,到 Kotlin、Clojure 和 Scala,再到 Frege 和 OCaml-Java。若是你在写 JVM 程序,给 Capsule 一个机会。shell

你能够这样来理解 capsule,将它看成 steroids 上的1个 fat JAR(在容许本地库的同时也不会干扰到依赖项)与1个声明式启动脚本的整合;另外一个理解方式是,将其看成部署阶段的构建工具。正如构建管理工具同样, Capsule 从构建到应用发布的各个环节都有全方位的管理。编程

Capsule 在设计时一直遵循如下原则:缓存

  • 打包应该是轻量、可移植和便捷的。不管多么复杂,无论有多少 JAR 文件组成,或者有多少脚本语言的源文件仍是本地库,Capsule 均可以包装任何 JVM 应用到一个名为 Capsule 的可执行 JAR,而且能够在任何平台上运行。Capsule 能够直接包含应用的全部依赖项,或简单地声明部分或者所有,一旦发布将会被完整的下载。这就是 fat JAR 的工做方式。若是愿意, capsules 自己也能够置于 Maven repositories,在发布时进行下载。安全

  • 安装对主机系统的影响最小,并对更新选择性支持。在 capsule 首次安装时,其正常运行须要依赖在1个临时目录中生成的一些文件,随后用户能够在任什么时候刻删除这些文件,不会对 capsule 产生任何不良影响。capsule 能够选择性地支持更新——不论是应用或者是其依赖关系——当启动时会自动下载。这些依赖关系——能够是语言运行时或者是 Web 容器——也能够被其余 capsule 共享。ruby

  • 发布必须是肯定和灵活的,多是安全的且有选择地限制。发布一个 capsule 不须要启动脚本。Capsules 查找请求的 JVM 版本、设置 classpath、必要的 agents 并设置 JVM flags。Capsules 在启动时也能够建立本身的容器(来限制资源使用,或使用已知的端口以免对其余项目造成干扰),同时 JVM 应用能够在无特权的容器下运行,这些容器是安全的。另外,安全性由 JVM 提供的安全机制保证。此外, capsules 只须要一个内核和一个 JVM ——甚至不须要 shell,他们便能在 JVM microkernels 上运行,好比 OSv。经过 caplets 和组件定制 capsule 的行为,全部这些功能都是彻底可编程、可组合的。服务器

当工具和标准已经存在时,不用再重造车轮。Capsule 是用 Java 编写的,并能够经过 Java 扩展。它遵循 JVM 生态系统,而不是重造车轮,仅使用现有的工具和标准。capsule 打包在一个可执行 JAR,并将全部元数据存储为简单的 JAR-manifest attributes 中;而且能够根据须要,从 Maven repositories 中下载所有或者部分,并经过 Maven、Gradle 和 Leiningen 这些流行的 JVM 工具构建。Capsule 自己是一个简单的 Maven 依赖,就像全部的构建工具插件,不须要再安装其余新工具。网络

经过 Caplets 实现的 Capsule 魔法

Capsule 之因此能保持简单还能提供这些功能主要归功于 caplets,以模块化定制 Capsule 行为。Caplets 能够嵌入到1个 capsule,或者单独进行包装并使用命令行包装和修改现有 capsule 行为。

Capsule 的第一个 caplet 是 Maven caplet,容许开发者在 manifest attributes 中声明部分或所有的应用依赖关系,而不用嵌入到 capsule JAR 里。虽然这对许多应用来讲并没必要要,不妨经过如下两个用例来深刻了解 Capsule 的潜力。

首先是一个简单的 Hello World servlet。建成后,它将建立一个标准的 WAR 文件并部署到任何 servlet 容器。仔细观察后发现,WAR 的确有点特别。其内容是:

247 META-INF/MANIFEST.MF 
    1124 WEB-INF/classes/co/paralleluniverse/examples/HelloWorldServlet.class 
    653 WEB-INF/web.xml 
    161596 Capsule.class 
    1467463 capsule-maven-1.0.jar

如你所见, WAR 包含 Capsule 类,这意味着它是一个capsule,也是嵌入式 JAR,而 capsule-maven-1.0.jar是 Maven caplet。JAR manifest 是这样的:

Manifest-Version: 1.0
Main-Class: Capsule
Premain-Class: Capsule
Caplets: co.paralleluniverse:capsule-maven:1.0
Application: org.eclipse.jetty:jetty-runner:9.3.3.v20150827
Allow-Snapshots: true
Min-Java-Version: 1.7.0
Args: $CAPSULE_JAR

取代部署 WAR 到 servlet 容器,你能够直接执行 java -jar build/libs/capsule-runnable-war.war (或者,甚至简单的./capsule-runnable-war.war,若是 capsule是「真正可执行」——见用户文档的指令),它会自动下载 Jetty,并用 Jetty 来启动 servlet。Jetty 工件将被缓存,并能够共享到其余须要的 caplets中。

另外一个例子使用 JavaScript,Avatar 项目在 JVM 上实现 Node.js。capsule JAR 包含了 JavaScript 源、 Capsule 类和 Maven caplet:

608 META-INF/MANIFEST.MF
    161596 Capsule.class
    1467463 capsule-maven-1.0.jar
    266 app.js

当 capsule 发布,Avatar 运行时——包括针对本地操做系统的本地库,将从 Maven repository 下载到本地并缓存,并与其余 Avatar capsules 共享。

其余 caplets 将包含:一个守护进程 caplet, 做为 Unix 或 Windows 守护进程来发布 capsule;一个安全 caplet,会在 Java 沙箱(经过安全策略定义)内启动 capsule;一个 desktop caplet,会将包含了一个 GUI 应用程序的 capsule 转化为一个 Windows、Mac 或 Linux 的本地可执行程序;一个容器 caplet,在一个或多个容器内运行 capsule。

为 Capsules 设计的轻量级容器

容器对沙箱应用来讲是一个有效方式,能够简化部署和巩固服务器,因此对任何的软件堆栈而言,它们都很是有利于 dev-ops 和安全。然而,因为 JVM 应用只有最小的环境需求 (即一个内核和一个 JVM),它们一般是可移植的,使用一个像 Docker 的容器解决方案无疑是浪费时间和空间。另外一方面,shield caplet 建立了一个轻量级容器,无需建立大图像。

例如,能够经过简单地桥接网络在1个容器中方便地运行 quasar-stocks Web 应用。

java -jar capsule-shield-0.1.0.jar quasar-stocks-thin.jar

随后就能够轻松地检索程序所运行的容器IP地址:

lxc-attach -P ~/.capsule/apps/quasarstocks.Application_0.1.0-SNAPSHOT/capsule-shield/ -n lxc -- /sbin/ifconfig

当一切如预期那样正常工做,无需任何复杂的操做,就能够在最终部署的服务器上(多是一个守护进程)发布相同的命令来配置端口转发使服务公共可用,并经过沙箱保证了应用程序的强安全性。

如今

是时间打开 capsule.io 并启动 capsules 了!

  1. 它们须要跟踪以免冲突,甚至这样还不够,由于它们不支持本地库。
  2. 它们可能须要不可移植的发布脚本,以便于在操做系统 shell 命令下执行,并选择正确的 JRE 版本、设置类路径、代理和 JVM 参数。
  3. 全部平台都支持 JVM,必要的脚本和本地构件可能也同样须要。
  4. 可能须要更长的启动时间,好比依赖项须要从新下载。
  5. shield caplet 使用 LXC 将 capsule 放于容器内。

原文连接:https://dzone.com/articles/open-source-jvm-application-deployment-tool-capsul-1

OneAPM for Java 可以深刻到全部 Java 应用内部完成应用性能管理和监控,包括代码级别性能问题的可见性、性能瓶颈的快速识别与追溯、真实用户体验监控、服务器监控和端到端的应用性能管理。想阅读更多技术文章,请访问 OneAPM 官方博客

相关文章
相关标签/搜索