Capsule:開源的 JVM 應用部署工具

【編者按】本文作者 Ron Pressler 是 Parallel Universe 公司的創始人,擁有著豐富的高性能開發經驗。通過這篇文章,Ron 向大家詳細介紹了全新的開源 JVM 部署工具——Capsule, 本文系 OneAPM 工程師編譯整理。

現實世界中,應用程序部署過程可能沒有想象中的那么簡單。應用程序其實非常「敏感」,在部署過程中,它會發現自己身處一個陌生的環境中,并且在與不同硬件、不同基礎設施軟件,以及陌生的鄰居(應用程序)行交互。如果期望應用程序正常地運行,編碼和部署過程都是重中之重。兩者之間的平衡常常依賴于程序的編寫語言、程序構成的運行時和工具,因此,不同的技術棧可能需要不同的部署工具。

但 JVM 應用程序對環境的要求非常少——只需一個 JVM 和一個內核,然而意想不到是,目前為止尚不存在一個通用的 JVM 應用部工具/機制。FatJARs 并不總奏效,而且它們需要平臺特定的腳本。最近有人使用 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 官方博客

**

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容