中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何遠程部署應用到Tomcat

發布時間:2021-11-18 17:07:03 來源:億速云 閱讀:138 作者:柒染 欄目:大數據

如何遠程部署應用到Tomcat,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

前幾天有人在群里提了個問題:

怎么樣通過程序向Tomcat內部署應用?

工作比較忙,也沒細問具體的使用場景,提供了一種使用JMX接口的思路。后來提問者說不太了解JMX,網上搜了一些看了看,比較蒙。

本次不打算詳細描述JMX怎么使用,而是梳理下可供Tomcat遠程部署應用的幾種方式,方便有類似需求的朋友。

說到應用部署,熟悉Tomcat的都知道,他默認包含了一個manager應用,功能不少,其中就包含應用部署,不論是目錄部署,還是文件部署。

一開始寫公眾號的時候介紹過一點manager應用:深入Tomcat的Manager

這里注意對于manager應用的使用,默認做了訪問限制,只能在本機訪問,所以如果你想遠程使用manager部署應用到目標服務器,需要在content.xml中做修改,可以參考前面的一篇舊文:為什么你的Manager登錄不成功?

配置之后就和本地使用manager一樣,部署功能直接使用即可,不再贅述。這里我們來說下使用接口的形式遠程部署。

在manager應用內,我們頁面上看到的,一般稱為HTML接口,還有一個text接口,可以根據在URL中指定的command和參數,執行相應的動作。

格式類似這樣:

http://{host}:{port}/manager/text/{command}?{parameters}
 


host和port換成你的目標主機和端口,command代表你執行的操作,parameter是命令對應需要的參數。

支持的命令很多,如下圖是managerServlet里部分代碼截圖

如何遠程部署應用到Tomcat


當然這里面沒截取我們要說的deploy命令,這個命令我們單獨說一下。對應我們前面說的要部署應用,在url類似這樣:

http://localhost:8080/manager/text/deploy?path=/hello&war=d:/abc.war

這里指定應用在磁盤上存放路徑,以及應用名稱,即可進行應用部署。

部署結果類似這樣:

OK - Deployed application at context path /hello

這里也支持應用的多版本部署,只需要在參數中增加version即可。

我們通過源碼來看下,這種部署形式背后是如何實現的。

如何遠程部署應用到Tomcat

我們來看紅框標注的三個地方,是整個部署邏輯的重點。

  1. 首先將應用添加到service內,代表已注冊的服務。后面再部署的時候都會先檢查,不在此列表內的才被允許。


  2. 將遠程的應用包拷貝到本地目錄內。


  3. 觸發部署的邏輯,真正進行部署。

我們主要注意一下,第一步和第三步,其實都是通過JMX接口來進行的。例如check方法的內容是這樣的:

如何遠程部署應用到Tomcat

這里的mBeanServer就是JMX里所有MBean對象注冊的服務點,連接到MBeanServer上之后,后面的邏輯和反射有些類似,指定ObjectName,再指定方法名和參數即可。

如何遠程部署應用到Tomcat

我們這里的ObjectName是"Catalina:host=locahost,type=Deployer"。

調用check之后,最終會調用到HostConfig類的check方法,從而觸發部署流程,進行應用的部署。完整的部署過程請參考前面的文章:

如何在Tomcat中部署應用的多個版本

WEB應用是怎么被部署的?

Tomcat集群應用部署功能實現分析

所以,如果你想自己造個輪子來實現遠程部署的時候,也可以參考這種使用JMX的方式。

另一種方式

之前介紹過IDE內Tomcat工作方式時描述過IDEA里在向Tomcat部署應用時是怎么樣通過JMX進行的(你一定不知道IDE里的Tomcat是怎么工作的!)。

在IDEA里,向tomcat部署一個應用,啟動時,其實并不會在本地的tomcat中找到該應用的目錄,或者實際運行的目錄下有該應用。仔細觀察發現,IDEA是通過Tomcat的MBean,動態的向tomcat增加了一個Context,即一個應用。這樣直接指定了應用的路徑,訪問路徑等

例如下面的調用鏈:

TCP Connection(2)-127.0.0.1@1379 daemon, prio=5, in group 'RMI Runtime', status: 'RUNNING'
at org.springframework.web.context.ContextLoaderListener.<init>(ContextLoaderListener.java:98)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1585)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:463)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:413)
at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1466)
at java.lang.Thread.run(Thread.java:745)

也就是根據實際路徑path,docBase這些構造一個StandardContext,并添加到Host中,對外提供服務。

以上,是幾種通過JMX可以動態遠程部署的方式,供參考。當然如果想用更直接一些的方式,在代碼里控制應用的copy,然后控制Tomcat進程自動重啟,也可以啦。

關于如何遠程部署應用到Tomcat問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

盐津县| 朝阳区| 高陵县| 克拉玛依市| 四川省| 西藏| 延津县| 永年县| 仁怀市| 余姚市| 延庆县| 临清市| 同仁县| 酒泉市| 密山市| 泰州市| 诏安县| 龙海市| 鹰潭市| 宜阳县| 邵武市| 双鸭山市| 凤庆县| 玛曲县| 阿克苏市| 五峰| 上蔡县| 鸡东县| 乌兰察布市| 宝清县| 岳普湖县| 九龙坡区| 凤台县| 南和县| 南澳县| 广宗县| 东阿县| 洱源县| 大洼县| 湖南省| 万源市|