專注於Java領域優質技術號,歡迎關注
原創: 侯樹成 Tomcat那些事兒

啟動 Tomcat完畢 ,有些時候總會打開瀏覽器 http://localhost:8080/
去驗證你的Tomcat是否啟動成功,看到ROOT應用里那個黃黃的三條腿的貓,你就放心了:服務啟動沒問題。如果請求不成功,那一定是哪里出了問題,啟動異常才導致這個默認自帶的app沒有啟動成功。從而進一步看log分析。
除了ROOT應用外,Tomcat還默認提供了 Manager這個應用。
在功能上 Manager 可以
1. 部署
管理已部署的應用(啟、停應用,重部署)
部署war
通過context.xml形式部署
設置Session過期
2. 診斷內存泄露等
3. 顯示 JVM 內存信息
4. Connector 線程的狀態
還有什么呢?
我們看到, Tomcat 的這個Manager提供的,是比較常用,但很有限的幾個基礎功能。
使用過 比如 Weblogic, WebSphere, 開源的 GlassFish 等J2EE 應用服務器的朋友會發現,與Tomcat 的Manager 相比, 他們都提供了一個功能更完備的所謂的「管理控制台」。
這個管理控制台,可以做的事情,比上面 Manager 提供的就豐富多了。比如最常用的一個: 8080 這個端口不夠用,我們想再加一個端口響應其他的請求,或者在配置ajp請求處理時,我們想加一個 Connector ,這個時候在 J2EE的管理控制台里,直接操作添加即可,一步步來。
甚至應用部署的時候,可以選擇JSP的預編譯(JSP預編譯,加速你的應用),創建數據源等等。
在 Tomcat 里對於創建 Connector 這個操作,你需要怎么做?
打開server.xml, 把 8080這個配置拷一份,改改端口,改改BIO/NIO的處理,重啟Tomcat。(敲黑板,這里是考點哦),而管理控制台一類的處理時不需要重啟實例的。實質上Connector 做為一個組件與 Container 是不互相影響的,其實 Tomcat 也能做到不需要重啟,只是這個創建 Connector 的過程,需要我們以編程的方式,來對配置文件的內容進行Marshaller/Unmarshaller。直接操作Container的內容,也可以通過JMX 來實現。
你說你部署了一個應用,該應用里配置了哪些Servlet、哪些Listener? Web.xml里有沒有init-param,去哪能看看么?
不好意思,需要自己打開應用配置來看。
管理控制台的思路,一般會將當前應用具體的配置信息列出來,方便管理。
當然,區別還有很多...
其實,在Tomcat 6之前,也是有這樣一款名為「Tomcat Admin」的應用,功能可以媲美應用服務器的管理控制台,不過后來不再提供了。可惜呀。
當然說了這么多,我們並不是開始嫌棄 Tomcat了。畢竟做為一個純的Web Container,而且是非商業產品,也算不錯了。
為了能使用一個較好用,功能也較全面的 Tomcat 管理工具,官方不提供我們只能把目光投向巨大的第三方開源之海,埋頭苦找么?
官方的wiki里也我們指了條路:
PSI Probe is advanced manager and monitor web application for Apache Tomcat.
這是一款 Tomcat 管理和監控工具,前身是 Lambda Probe。由於 Lambda Probe 2006不再更新,所以 PSI Probe 算是對其的一個 Fork 版本並一直更新至今。
使用也很方便,在github(https://github.com/psi-probe/psi-probe) 下載對應的war文件,部署即可。
訪問的時候,和 Manager 一樣,也是需要使用配置在 tomcat-users.xml 中的用戶來訪問。
登錄后是這個樣子:

通過上面一長串的tab,就能感受到功能上要比 Manager應用要強大吧。甚至部分功能能追平「管理控制台」的體驗了。
來看應用部署這一塊

除了部署這個功能外,還包含一般J2EE的應用服務器包含的功能「JSP預編譯」來加速應用的響應。還有清空work的選項。
直接頁面看日志

對於日志文件,可以實時修改不同的日志級別,來打印日志。

可以將當前配置的 Connector列出來,各個 Connector 收到的請求等

更多的功能,下載下來探索吧! Have fun!
PSI背后是如何實現的功能呢?
我們之前的文章寫過,在 Tomcat 內存在一種「特權應用」是可以直接訪問Tomcat的一些內部組件的,PSI就是把自己設置成一個特權應用,同時對於Tomcat內的操作, PSI是通過 Wrapper的形式,對不同版本的Tomcat 創建了一個Adapter

這里的 Wrapper,就是我們熟悉的Tomcat組件的那個Wrapper,PSI繼承了 Spring 的DispatherServlet,通過Servlet這個Wrapper之后,再拿到其上層組件 Context、Host、Engine。
/** * Main dispatcher servlet. Spring default dispatcher servlet had to be superseded to handle * "privileged" application context features. The actual requirement is to capture passed Wrapper * instance into ContainerWrapperBean. Wrapper instance is our gateway to Tomcat. */@WebServlet public class ProbeServlet extends DispatcherServlet implements ContainerServlet {
在Spring 的Initializer里將Servlet注冊上去
// Set probe servletServletRegistration.Dynamic probe = servletContext.addServlet( "probe", ProbeServlet. class);
所以拿到了這些組件,在操作應用的部署,獲取Connector等內容時,其實就和 Tomcat 自己一樣了。
所以如果要開發管理工具,這也是一種實現思路。
一種通過JMX 的MBean。
一種是通過PSI這種思路。