阅读更多

1顶
0踩

编程语言

原创新闻 Capsule:开源的JVM应用部署工具

2015-09-22 16:59 by 见习编辑 tuhaihe 评论(1) 有6648人浏览
编者按:本文作者Ron Pressler是Parallel Universe公司的创始人,拥有着丰富的高性能开发经验。通过这篇文章,Ron向大家详细介绍了全新的开源JVM部署工具——Capsule。

以下为译文:

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

但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依赖,就像所有的构建工具插件,不需要再安装其他新工具。

Capsule Magic with Caplets

通过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中。

    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



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

Go with Capsule

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

  • 它们需要跟踪以避免冲突,甚至这样还不够,因为它们不支持本地库。
  • 它们可能需要不可移植的发布脚本,以便于在操作系统shell命令下执行,并选择正确的JRE版本、设置类路径、代理和JVM参数。
  • 所有平台都支持JVM,必要的脚本和本地构件可能也一样需要。
  • 可能需要更长的启动时间,比如依赖项需要重新下载。
  • shield caplet使用LXC将capsule放于容器内。


原文链接:Open Source JVM Application Deployment Tool: Capsule(译者/OneAPM工程师)
来自: CSDN
1
0
评论 共 1 条 请登录后发表评论
1 楼 yin_bp 2015-09-24 16:57
请看一个更加轻量级的应用程序执行容器:
bboss应用程序运行容器使用介绍

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Ruby的伪线程

    Ruby的Thread是伪线程,不管代码中写了多少个Thread.new,Ruby都只启动了一个线程去运行这些Thread的代码。 这样做的确使得Ruby的Thread很容易控制,程序也不容易产生类似死锁这类严重的线程问题。但是效率始终...

  • 线程间的通信

    多线程并发执行,它们之间不是相互独立的个体,而是相互通信协作,更好的利于cpu时间片完成工作 等待通知机制与生产消费模型,最经典的例子: 生产者向队列发送消息,消费者负责消费,如何协调它们各自的速率呢,...

  • Rails Ruby 线程 进程 和相关资料的杂烩

    和 [url=http://bot.iteye.com/]机器人[/url]就 [url=http://qichunren.iteye.com/blog/551968]在Rails中的 Model中使用current_user[/url]的问题进行...首先,Rails从2.2开始支持线程安全,这个可以参照官方2.2 re...

  • Ruby 2.x 源代码学习:线程

    Ruby 使用 pthread 线程库来实现线程概念 本文涉及到的源代码: vm.c thread.c thread_pthread.c(linux/unix 平台) 线程类 Thread 参考 Ruby 2.x 源代码学习:bootstrap 这篇文章,Ruby 解释器在 bootstrap 阶段...

  • 关于 ruby / rails 的线程模型

    inu 的项目中有一个导入功能,将用户从浏览器、del.icio.us 导出的收藏条目导入到 inu 收藏夹中。这个功能推出以来,用户的反响并...每次导入一条记录,都需要更新好几个表,本身 ruby 在目前虚拟机下效率并不高,...

  • Java内存模型与线程

    Java内存模型与线程 本文来源《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》

  • 强大的ruby,居然给我报死锁

    都说ruby线程时伪线程,只能使用单个处理器(1.9以后改进了?)

  • Java 内存模型与线程

    摘自《深入理解 Java 虚拟机:JVM 高级特性与最佳实践》(第二版) 我们首先了解虚拟机 Java 内存模型的结构及操作,然后讲解了原子性、可见性、有序性在 ...另外,我们还了解了线程在 Java 语言之中是如何实现的。

  • 线程,看这一篇就够啦

    文章目录多线程一 进程和多线程进程线程并发和并行上下文切换CAS算法协程死锁为什么要使用多线程二 使用多线程2.1继承Thread类2.2实现Runnable接口2.3实现Callable接口,callable+futureTask2.4实现Callable接口,...

  • python和ruby对比

    1、python和ruby的相同点: * 都强调语法简单,都具有更一般的表达方式。python是缩进,ruby是类basic的表达。都大量减少了符号。 * 都是动态数据类型。都是有丰富的数据结构。 * 都具有c语言扩展能力,都...

  • 玩转Python多进程和多线程,你学废了吗

    进程(process)和线程(thread)是非常抽象的概念, 也是程序员必需掌握的核心知识。关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”。 这样一句话虽然简单,但是...

  • Python和Ruby两大语言全方位对比

    最近在考虑学习一门后端语言,在Ruby和Python直接犹豫,然后自己做了一些对比,希望能帮到有同样问题的你。 一、异同对比选择 1、Python和ruby的相同点: 都强调语法简单,都具有更一般的表达方式。python是缩进,...

  • Ruby标准库一览

    文本  base64.rb 处理Base64... csv.rb CSV(Comma Separated Values)库 ruby 1.8 特性   digest.so 消息摘要库 请参考[ruby-src:ext/digest/digest.txt.ja]   digest/md5.so   digest/rmd160.so   dige

  • ruby 类库组成

    一. 核心类库: ... base64.rb 处理Base64编码的模块 csv.rb CSV(Comma Separated Values)库 ruby 1.8 特性 digest.so 消息摘要库 请参考[ruby-src:ext/digest/digest.txt.ja] digest/md5.so digest/...

  • python的线程是并发还是并行_为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快。...

    python里的多线程是单cpu意义上的多线程,它和多cpu上的多线程有着本质的区别。单cpu多线程:并发多cpu多线程:并行内部包含并发首先强调背景:1、GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),...

  • 听Ruby之父畅谈编程语言的设计

    本文摘自《松本行弘:编程语言的设计与实现》 1-1 自己创造编程语言的意义 通过实际创造一门新的编程语言,可以学到编程语言的设计思路和实现方法。随着开源的普及,创造新编程语言的门槛一下子...Ruby 是我出于兴...

  • ruby和python的比较

    下面是我在看两篇关于Python和Ruby对比的文章时,所作的纠正,原文都是广泛流行的,比较好找。 ------------------------------------------------------ 《ruby和python的比较》更正一点事情 1、...

  • 深度学习多线程部署—学习笔记

    Flask默认是单进程、单线程阻塞的任务模式,在项目上线的时候可以通过nginx+gunicorn的方式部署flask任务,但是在开发的过程中如果想通过延迟的方式测试高并发,需要在app.run()中通过threade...

  • 基于springboot大学生就业信息管理系统源码数据库文档.zip

    基于springboot大学生就业信息管理系统源码数据库文档.zip

  • 基于java的驾校收支管理可视化平台的开题报告.docx

    基于java的驾校收支管理可视化平台的开题报告

Global site tag (gtag.js) - Google Analytics