jvm虚拟机 基于栈_守护基于JVM的应用程序
jvm虛擬機(jī) 基于棧
部署體系結(jié)構(gòu)設(shè)計(jì)是任何定制服務(wù)器端應(yīng)用程序開發(fā)項(xiàng)目的重要組成部分。 由于其重要性,部署架構(gòu)設(shè)計(jì)應(yīng)盡早開始,并與其他開發(fā)活動(dòng)一起進(jìn)行。 部署體系結(jié)構(gòu)設(shè)計(jì)的復(fù)雜性取決于許多方面,包括所提供服務(wù)的可伸縮性和可用性目標(biāo),部署過程以及系統(tǒng)體系結(jié)構(gòu)的技術(shù)屬性。
可維護(hù)性和操作問題,例如部署安全性,監(jiān)視,備份/還原等,與部署體系結(jié)構(gòu)設(shè)計(jì)的更廣泛主題相關(guān)。 這些問題本質(zhì)上是跨領(lǐng)域的,可能需要從服務(wù)推出過程到實(shí)際系統(tǒng)管理細(xì)節(jié)的不同層次上加以解決。
在系統(tǒng)管理詳細(xì)信息級(jí)別,使用純基于JVM的應(yīng)用程序部署模型(在類似Unix的平臺(tái)上)時(shí),經(jīng)常會(huì)遇到以下挑戰(zhàn):
- 如何安全關(guān)閉應(yīng)用服務(wù)器或應(yīng)用程序? 通常,使用偵聽關(guān)閉請(qǐng)求的TCP偵聽器線程。 如果您在同一主機(jī)上部署了同一應(yīng)用服務(wù)器的許多實(shí)例,則有時(shí)很容易混淆這些實(shí)例并關(guān)閉錯(cuò)誤的實(shí)例。 另外,您還必須防止未經(jīng)授權(quán)訪問關(guān)機(jī)監(jiān)聽器。
- 創(chuàng)建與系統(tǒng)啟動(dòng)和關(guān)閉機(jī)制(例如Sys-V init,systemd,Upstart等)無(wú)縫集成的初始化腳本
- 如果應(yīng)用程序死了,如何自動(dòng)重啟?
- 日志文件管理。 應(yīng)用程序日志可以通過日志庫(kù)進(jìn)行管理(例如,旋轉(zhuǎn),壓縮,刪除)。 有時(shí)也可以使用日志庫(kù)來(lái)管理應(yīng)用服務(wù)器或平臺(tái)日志,但有時(shí)可能需要與OS級(jí)工具集成(例如logrotate)。
對(duì)于這些問題,有兩種解決方案可以使操作系統(tǒng)與應(yīng)用程序/應(yīng)用程序服務(wù)器之間的集成更加緊密。 一種廣泛使用的通用解決方案是Java Service Wrapper 。 Java Service Wrapper擅長(zhǎng)解決上述挑戰(zhàn),并且根據(jù)專有許可發(fā)布。 還提供了基于GPL v2的社區(qū)許可選項(xiàng)。
Apache commons守護(hù)程序是另一個(gè)選擇。 它的根源是Apache Tomcat,并且與應(yīng)用服務(wù)器很好地集成在一起,但它的通用性要強(qiáng)得多。除Java外,commons守護(hù)程序還可以與其他基于JVM的語(yǔ)言(例如Scala)一起使用。 顧名思義,commons守護(hù)程序是Apache許可的。
Commons守護(hù)程序包括以下功能:
- 如果JVM死亡,將自動(dòng)重啟
- 使用標(biāo)準(zhǔn)OS機(jī)制啟用JVM進(jìn)程的安全關(guān)閉(基于Tomcat TCP的關(guān)閉機(jī)制容易出錯(cuò)且不安全)
- 重定向STDERR / STDOUT并設(shè)置JVM進(jìn)程名稱
- 允許與OS初始化腳本機(jī)制集成(記錄JVM進(jìn)程pid)
- 將JVM進(jìn)程與父進(jìn)程和控制臺(tái)分離
- 以減少的OS特權(quán)運(yùn)行JVM和應(yīng)用程序
- 允許與OS工具(例如logrotate)協(xié)調(diào)日志文件管理(使用SIGUSR1信號(hào)重新打開日志文件)
部署Commons守護(hù)程序
從應(yīng)用程序開發(fā)人員的角度來(lái)看,commons守護(hù)程序由兩部分組成:用于啟動(dòng)應(yīng)用程序的jsvc二進(jìn)制文件和commons守護(hù)程序Java API。 在啟動(dòng)期間,jsvc二進(jìn)制文件通過應(yīng)用程序?qū)崿F(xiàn)的生命周期方法來(lái)引導(dǎo)應(yīng)用程序,并由commons守護(hù)程序Java API定義。 Jsvc創(chuàng)建一個(gè)控制過程,以在異常終止時(shí)監(jiān)視和重新啟動(dòng)應(yīng)用程序。 這是與應(yīng)用程序一起部署commons守護(hù)程序的概述:
實(shí)踐經(jīng)驗(yàn)
Tomcat發(fā)行版包括“ daemon.sh”,這是一個(gè)通用包裝外殼腳本,可用作創(chuàng)建特定于系統(tǒng)的初始化腳本變體的基礎(chǔ)。 我遇到的問題之一是包裝腳本的調(diào)用者無(wú)法覆蓋wait配置參數(shù)的默認(rèn)值。 在某些情況下,Tomcat隨機(jī)數(shù)生成器的初始化可能會(huì)超過最大等待時(shí)間,從而導(dǎo)致初始化腳本報(bào)告失敗,即使最終啟動(dòng)應(yīng)用程序服務(wù)器也是如此。 現(xiàn)在似乎已解決此問題。
另一個(gè)問題是包裝器腳本不允許傳遞帶有空格的JVM參數(shù)。 例如與JVM“ -XX:OnOutOfMemoryError”和co一起使用時(shí),這可能很方便。 參數(shù)。 使用包裝腳本是可選的,也可以輕松更改,但由于它包含一些有用的功能,因此我寧愿重用而不是復(fù)制它,因此我創(chuàng)建了一個(gè)功能請(qǐng)求并為此#55104提出了一個(gè)小補(bǔ)丁。
在找出正確的命令行參數(shù)以使jsvc引導(dǎo)您的應(yīng)用程序時(shí),“-debug”參數(shù)對(duì)于進(jìn)行故障排除非常有用。 另外,默認(rèn)情況下,jsvc將工作目錄更改為/,在這種情況下,絕對(duì)路徑通常應(yīng)與其他選項(xiàng)一起使用。 “ -cwd”選項(xiàng)可用于覆蓋默認(rèn)的工作目錄值。
守護(hù)碼頭
除Tomcat外,Jetty是我經(jīng)常使用的另一個(gè)servlet容器。 由于集成已經(jīng)存在,因此將common守護(hù)程序與Tomcat結(jié)合使用不會(huì)帶來(lái)任何挑戰(zhàn),因此我決定了解一下如何在不支持common守護(hù)程序的應(yīng)用服務(wù)器上正常工作。
為了在Jetty中實(shí)現(xiàn)必要的更改,我克隆了Jetty源代碼存儲(chǔ)庫(kù),在Jetty bootstrap類中添加了jsvc生命周期方法,并構(gòu)建了Jetty。 之后,我開始嘗試使用jsvc命令行參數(shù)來(lái)引導(dǎo)Jetty。 Jetty附帶了jetty.sh啟動(dòng)腳本,該腳本具有稱為“ check”的選項(xiàng),用于輸出與安裝相關(guān)的各種信息。 除其他外,它輸出將與JVM一起使用的命令行參數(shù)。 這為jsvc命令行提供了一個(gè)很好的起點(diǎn)。
這些是我最終得到的命令行:
export JH=$HOME/jetty-9.2.2-SNAPSHOT export JAVA_HOME=`/usr/libexec/java_home -v 1.8` jsvc -debug -pidfile $JH/jetty.pid -outfile $JH/std.out -errfile $JH/std.err -Djetty.logs=$JH/logs -Djetty.home=$JH -Djetty.base=$JH -Djava.io.tmpdir=/var/folders/g6/zmr61rsj11q5zjmgf96rhvy0sm047k/T/ -classpath $JH/commons-daemon-1.0.15.jar:$JH/start.jar org.eclipse.jetty.start.Main jetty.state=$JH/jetty.state jetty-logging.xml jetty-started.xml這可以用作適當(dāng)?shù)纳a(chǎn)級(jí)初始化腳本的起點(diǎn),以啟動(dòng)和關(guān)閉Jetty。
我在Jetty項(xiàng)目問題跟蹤器中將我的代碼更改作為問題#439672提交,并且剛剛得知更改已與上游代碼庫(kù)合并,因此您將來(lái)應(yīng)該可以使用Apache commons守護(hù)程序jsvc來(lái)守護(hù)Jetty。盒子。
翻譯自: https://www.javacodegeeks.com/2014/07/daemonizing-jvm-based-applications.html
jvm虛擬機(jī) 基于棧
總結(jié)
以上是生活随笔為你收集整理的jvm虚拟机 基于栈_守护基于JVM的应用程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平板电脑怎么打开网络不可用(平板无法显示
- 下一篇: JPA @Embeddable和@Emb