偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何給Spring Boot 的嵌入式 Tomcat 部署多個應(yīng)用?

開發(fā) 開發(fā)工具
嵌入式容器,也保留了獨立部署容器的管理和使用習(xí)慣,在啟動創(chuàng)建的過程中,可以獲取其容器實例進行操作。也可以通過對外暴露的 MBean Server 進行操作。

Spring Boot 的應(yīng)用,大都有這樣的特別,你在添加了依賴之后,即使是 Web 應(yīng)用,最終也可以通過 JAR 的形式運行,具體依賴的容器環(huán)境,則通過嵌入式的形式隱式的使用。

而像這些環(huán)境,Spring 的配置等,更多的隱藏在 Spring Boot 的內(nèi)部,開發(fā)者可以更多的專注于「業(yè)務(wù)邏輯」的開發(fā)。

[[257217]]

「解放了雙手」的時候,話說回來,某些時候,也是有一些弊端的。比如像之前通過 WAR 文件的形式獨立部署時,可以在容器內(nèi)再額外部署一些「監(jiān)控」應(yīng)用,來觀察容器的情況,應(yīng)用的請求情況等,這些內(nèi)容在嵌入式的時候,就有些辦不從心了。

那對于 習(xí)慣了 Spring Boot 的 JAR 文件便捷運行的用戶,有沒有辦法,能在保留 JAR 使用習(xí)慣的前提下,又能部署其他應(yīng)用,來滿足獨立容器部署的形式和使用習(xí)慣呢?

答案是有的。魚和熊掌,也可得兼。 后面我們會以嵌入式的 Tomcat 為例,來說明具體的實現(xiàn)方式。

首先,我們需要認識這一點,對于嵌入式的容器,他本質(zhì)上依然還是容器,保留了容器的絕大數(shù)內(nèi)容。所以,一些獨立部署時的風(fēng)格,接口也依然可以使用。

不熟悉 Spring Boot 內(nèi) Tomcat 工作原理的讀者,可以參考這幾篇舊文:

我們前面說,嵌入式容器,也還是容器,所以我們只要「拿到」這個容器,就可以對其進行操作了。

舊文里我們提過, Spring Boot 內(nèi)的嵌入式 Tomcat,是自己 new 了一個Tomcat 實例出來,再把應(yīng)用做為 Context 部署進去。我們要想部署其他的應(yīng)用,也照著「葫蘆」拿到 這個實例,部署應(yīng)用。

Spring Boot 內(nèi),由于要支持各種 Servlet 容器,所以統(tǒng)一進行了抽象了創(chuàng)建容器的Factory,在 Spring Boot 1.x 和 2.x分別由

EmbeddedServletContainerFactory 和 ServletWebServerFactory 這兩個接口表示。 而對應(yīng)的工廠里創(chuàng)建出來的容器對象,在 1.x 和 2.x 中,分別由TomcatEmbeddedServletContainer 和 TomcatWebServer 這兩個類來表示。

這個 Factory,也是做為一個 Bean 參與到Spring Boot 的啟動流程中。我們需要做的,就是在啟動的時候,定義這樣一個Bean,并「重寫」Factory 中可以拿到 Tomcat 實例的方法,拿到前面創(chuàng)建出來的 Tomcat 實例,即可完成應(yīng)用的部署。

1.x 的方式如下:

  1. @Bean 
  2.     public EmbeddedServletContainerFactory servletContainerFactory() { 
  3.         return new TomcatEmbeddedServletContainerFactory() { 
  4.    protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer( 
  5.                     Tomcat tomcat) { 
  6.                 new File(tomcat.getServer().getCatalinaBase(), "webapps").mkdirs(); 
  7.                 try { 
  8.                     Context context = tomcat.addWebapp("/test", "/home/test/sample.war"); // 這里是要部署的應(yīng)用名稱和路徑 
  9.                     context.setParentClassLoader(getClass().getClassLoader()); 
  10.                 } catch (Exception ex) { 
  11.                     throw new IllegalStateException("Failed to add webapp", ex); 
  12.                 } 
  13.                 return super.getTomcatEmbeddedServletContainer(tomcat); 
  14.             } 
  15.         }; 
  16.     } 

2.x

  1. @Bean 
  2.     public ServletWebServerFactory servletContainerFactory() { 
  3.         return new TomcatServletWebServerFactory() { 
  4.             protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) { 
  5.                 new File(tomcat.getServer().getCatalinaBase(), "hello").mkdirs(); 
  6.                 try { 
  7.                     Context context = 
  8.                             tomcat.addWebapp("/foo", "/home/test/sample.war"); 
  9.                     context.setParentClassLoader(getClass().getClassLoader()); 
  10.                 } catch (Exception ex) { 
  11.                     throw new IllegalStateException("Failed to add webapp", ex); 
  12.                 } 
  13.                 return super.getTomcatWebServer(tomcat); 
  14.             }; 
  15.         }; 
  16.     } 

當(dāng)然,還有其它的方法也可以實現(xiàn)類似的目的。

比如,幾年前的一篇舊文,在分析 IDE里 Tomcat 的工作原理的時候,分析過 IDEA 里, Tomcat 是怎樣部署應(yīng)用的。那個實現(xiàn)思路,是通過 Tomcat 注冊的 MBean,其中包含對于應(yīng)用管理的MBean,對于嵌入式的 Tomcat,也依然放開了 MBean Server, 連接到上面就可以部署應(yīng)用了。需要注意的一點,是嵌入式的 Tomcat,Host 的ObjectName,和獨立運行的并不一樣,需要注意,否則會導(dǎo)致部署失敗。

總結(jié)一下,嵌入式容器,也保留了獨立部署容器的管理和使用習(xí)慣,在啟動創(chuàng)建的過程中,可以獲取其容器實例進行操作。也可以通過對外暴露的 MBean Server 進行操作。

【本文為51CTO專欄作者“侯樹成”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號『Tomcat那些事兒』獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2024-08-29 08:43:56

2025-04-02 09:31:33

2018-05-02 16:34:56

EAF嵌入式框架

2012-07-30 14:13:11

Linux 2.6內(nèi)核嵌入式

2009-04-11 15:22:24

Linux 2.6內(nèi)核應(yīng)用

2009-12-17 18:38:56

Fedora 7嵌入式

2009-04-11 15:12:24

2011-01-14 13:13:23

嵌入式Linux開發(fā)

2009-05-28 13:39:13

Windows CE

2023-04-27 07:06:18

2020-04-22 11:51:41

物聯(lián)網(wǎng)嵌入式編程IOT

2022-01-04 22:19:38

Linux開發(fā)嵌入式

2009-12-24 17:21:38

嵌入式Linux

2022-12-14 08:06:08

2022-01-03 23:33:40

Linux組件系統(tǒng)

2023-01-04 09:37:16

2010-06-09 19:56:04

2022-03-25 20:00:40

人工智能機器人

2009-05-14 09:28:16

嵌入式面試求職

2009-12-09 10:12:28

嵌入式Linux
點贊
收藏

51CTO技術(shù)棧公眾號