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

现实世界中,应用程序部署过程可能没有想象中的那么简单。应用程序其实非常「敏感」,在部署过程中,它会发现自己身处一个陌生的环境中,并且在与不同硬件、不同基础设施软件,以及陌生的邻居(应用程序)行交互。如果期望应用程序正常地运行,编码和部署过程都是重中之重。两者之间的平衡常常依赖于程序的编写语言、程序构成的运行时和工具,因此,不同的技术栈可能需要不同的部署工具。

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

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

你可以这样来理解 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 共享。

  • 发布必须是确定和灵活的,可能是安全的且有选择地限制。发布一个 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 官方博客

Capsule:开源的 JVM 应用部署工具的更多相关文章

  1. puppet开源的软件自动化配置和部署工具——本质就是CS,服务端统一管理配置

    1.  概述 puppet是一个开源的软件自动化配置和部署工具,它使用简单且功能强大,正得到了越来越多地关注,现在很多大型IT公司均在使用puppet对集群中的软件进行管理和部署,如google利用p ...

  2. UAVStack JVM监控分析工具:图形化展示采集及分析监控数据

    摘要:UAVStack推出的JVM监控分析工具提供基于页面的展现方式,以图形化的方式展示采集到的监控数据:同时提供JVM基本参数获取.内存dump.线程分析.内存分配采样和热点方法分析等功能. 引言 ...

  3. Openstack部署工具

    Openstack发展很猛,很多朋友都很认同,2013年,会很好的解决OpenStack部署的问题,让安装,配置变得更加简单易用. 很多公司都投入人力去做这个,新浪也计划做一个Openstack的is ...

  4. 开源的 Restful Api 集成测试工具 Hitchhiker

    Hitchhiker 是一款开源的 Restful Api 集成测试工具,你可以在轻松部署到本地,和你的team成员一起管理Api. 先上图看看: 简单介绍 背景是Team在开发一些Api,这些Api ...

  5. Hitchhiker 是一款开源的 Restful Api 测试工具

    Hitchhiker 是一款开源的 Restful Api 测试工具 开源API测试工具 Hitchhiker v0.4更新 - 没有做不到,只有想不到 Hitchhiker 是一款开源的 Restf ...

  6. Syncd-开源自动化部署工具

    官网地址:https://gitee.com/dreamans/syncd/issues syncd是一款开源的代码部署工具,它具有简单.高效.易用等特点,可以提高团队的工作效率. 目前只支持类Lin ...

  7. openstack部署工具简介

    个人使用方面DevStack无疑,在可预见的未来时间内,DevStack仍将是众多开发者们的首选安装方式或工具.该方式主要是通过配置参数,执行shell脚本来安装一个OpenStack的开发环境.Gi ...

  8. CloudBase Framework丨第一个 Deno 部署工具是如何打造的?

    云端一体化部署工具 CloudBase Framework (简称 CBF)自开源发布以来迭代迅速,不仅支持 Vue.React 等前端框架,也支持 Nuxt 等 SSR 框架,基于 Node 开发的 ...

  9. 云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上

    @ 目录 概述 定义 工作原理 主要组件 核心概念 环境准备 概述 安装Kubekey 创建K8S 安装K9S OpenLB 安装ArgoCD 安装 ArgoCD CLI 从Git库中创建一个应用程序 ...

随机推荐

  1. js 设置 获取css样式

    先看一段代码,为了体现一会下面说的js用style获取css样式的不同 一:给div设置margin-left(用style设置css样式没什么问题) box.style.marginLeft=&qu ...

  2. 灰度直方算法 C++

    #include <string> #include "20140318计算类的面积.cpp" //////////////////////////////////// ...

  3. 必须知道的.NET FrameWork

    这部分内容呢,对普通开发者来说,意义不是特别大.但是作为一个有情怀的开发者,应该追根溯源,懂一些自己用的工具, 的粗浅知识.并且这部分内容可以用来个HR吹嘘一下自己的情怀.基本就是这样. .NET生成 ...

  4. 【风马一族_Android】Button 按钮之记录

    Button button = new Button(); Button button = (Button)findViewById(R.id.bt_button);//让按钮显示灰色,失效 butt ...

  5. L014-oldboy-mysql-dba-lesson14

          L014-oldboy-mysql-dba-lesson14             来自为知笔记(Wiz) 附件列表

  6. Qt for Android 程序禁止屏幕旋转

    有时候我们希望让一个程序的界面始终保持在一个方向,不随手机(平板)方向旋转而变化:在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入 android:screen ...

  7. nginx配置多个网址

    实战Nginx与PHP(FastCGI)的安装.配置与优化:http://ixdba.blog.51cto.com/2895551/806622 Nginx配置文件详细说明:http://www.cn ...

  8. linux gd库不支持jpeg解决办法

    1. 查看gd库是否支持jpeg gd_info(); 2. 如果JPEG Support 不为1则不支持. 3.首先下载 libjpeg http://www.ijg.org/ ,进行安装 安装目录 ...

  9. 重绘panel控件,实现panel的阴影效果

    最近想在项目中添加一个要有阴影的panel控件,找了好多资料,最后通过采用图片的方式实现了panel的阴影效果,效果图如下: 重绘代码如下: using System; using System.Co ...

  10. 如何在SAE上使用DjangoUeditor

    之前的一个项目是部署到SAE上的,其中富文本编辑器使用到了Ueditor,对于Django有一个开源项目DjangoUeditor可以简化继承过程,直接引用app就可以使用.但是不支持SAE的文件上传 ...