【編者按】本文做者 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 依賴,就像全部的構建工具插件,不須要再安裝其餘新工具。網絡
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。
容器對沙箱應用來講是一個有效方式,能夠簡化部署和鞏固服務器,因此對任何的軟件堆棧而言,它們都很是有利於 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 了!
它們須要跟蹤以免衝突,甚至這樣還不夠,由於它們不支持本地庫。
它們可能須要不可移植的發佈腳本,以便於在操做系統 shell 命令下執行,並選擇正確的 JRE 版本、設置類路徑、代理和 JVM 參數。
全部平臺都支持 JVM,必要的腳本和本地構件可能也同樣須要。
可能須要更長的啓動時間,好比依賴項須要從新下載。
shield caplet 使用 LXC 將 capsule 放於容器內。
原文連接:https://dzone.com/articles/open-source-jvm-application-deployment-tool-capsul-1
OneAPM for Java 可以深刻到全部 Java 應用內部完成應用性能管理和監控,包括代碼級別性能問題的可見性、性能瓶頸的快速識別與追溯、真實用戶體驗監控、服務器監控和端到端的應用性能管理。想閱讀更多技術文章,請訪問 OneAPM 官方博客。