成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

[[257217]]

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

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

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

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

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

我們前面說(shuō),嵌入式容器,也還是容器,所以我們只要「拿到」這個(gè)容器,就可以對(duì)其進(jìn)行操作了。

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

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

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

這個(gè) Factory,也是做為一個(gè) Bean 參與到Spring Boot 的啟動(dòng)流程中。我們需要做的,就是在啟動(dòng)的時(shí)候,定義這樣一個(gè)Bean,并「重寫」Factory 中可以拿到 Tomcat 實(shí)例的方法,拿到前面創(chuàng)建出來(lái)的 Tomcat 實(shí)例,即可完成應(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)然,還有其它的方法也可以實(shí)現(xiàn)類似的目的。

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

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

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

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

責(zé)任編輯:趙寧寧 來(lái)源: 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

人工智能機(jī)器人

2009-05-14 09:28:16

嵌入式面試求職

2009-12-09 10:12:28

嵌入式Linux
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产精品网址 | 亚洲欧美精品在线 | 久久成人免费 | 久久精品国产免费看久久精品 | 国产精品久久久久久久久久久免费看 | www.久久 | 亚洲一区在线日韩在线深爱 | 91成人在线 | 殴美黄色录像 | 国产传媒在线观看 | 一区二区三区在线播放视频 | 西西裸体做爰视频 | 久久综合伊人 | 日韩成人一区 | 欧美国产一区二区 | 久久久青草婷婷精品综合日韩 | 成人精品毛片国产亚洲av十九禁 | 视频一区二区在线观看 | 国产精品麻| 免费一二区 | 欧美一级免费 | 国产精品国产精品国产专区不片 | 亚洲精品久久久久久一区二区 | 日韩精品免费视频 | 中文字幕久久久 | 国产精品成av人在线视午夜片 | 欧美在线视频一区二区 | 精品美女在线观看视频在线观看 | 性一爱一乱一交一视频 | 精品久久久久久红码专区 | 免费看91| 精品在线看 | 黄网免费 | 欧美日韩国产欧美 | 亚洲中午字幕 | 亚洲精品乱码久久久久久蜜桃91 | av激情在线 | 在线国产一区二区 | 日韩欧美一区二区三区在线播放 | 久久国产视频网 | 国产小网站 |