SpringBoot(六)之內嵌容器

SpringBoot(六)之內嵌容器

文章目錄

    • SpringBoot(六)之內嵌容器
      • 內嵌容器的特點
      • 如何替換默認容器
        • 1.pom形式
        • 2.主動配置
      • 如何通過配置切換serlvet容器

Spring Boot 提供了一種便捷的方式來創建獨立運行的 Spring 應用程序,內嵌容器(如 Tomcat、Jetty 或 Undertow)是其核心特性之一。這使得開發者不需要將應用程序部署到外部的應用服務器上,而是通過內嵌容器直接運行應用。這種方式簡化了部署流程,并且提高了開發和測試的效率。

內嵌容器的特點

  1. 獨立性:應用程序包含了所有必要的依賴和服務器配置,能夠獨立運行,而不依賴外部的應用服務器。
  2. 簡化部署:通過 Maven 或 Gradle 構建后,可以生成一個可執行的 JAR 文件,直接通過命令行運行。
  3. 一致性:開發、測試和生產環境中的運行環境一致,減少了環境差異帶來的問題。

如何替換默認容器

1.pom形式

如何引入underTow作為內嵌servlet容器

  • 在spring-boot-starter-web中排除掉tomcat的jar包
  • 引入undertow的依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><!-- 使用 Undertow 替換掉 Tomcat --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

觀察console

2024-05-17 16:38:26.099  INFO 1108 --- [           main] io.undertow                              : starting server: Undertow - 2.2.16.Final
2024-05-17 16:38:26.102  INFO 1108 --- [           main] org.xnio                                 : XNIO version 3.8.6.Final
2024-05-17 16:38:26.105  INFO 1108 --- [           main] org.xnio.nio                             : XNIO NIO Implementation Version 3.8.6.Final
2024-05-17 16:38:26.125  INFO 1108 --- [           main] org.jboss.threads                        : JBoss Threads version 3.1.0.Final
2024-05-17 16:38:26.162  INFO 1108 --- [           main] o.s.b.w.e.undertow.UndertowWebServer     : Undertow started on port(s) 8080 (http)
2024-05-17 16:38:26.168  INFO 1108 --- [           main] c.a.s.SpringBootAnnotationApplication    : Started SpringBootAnnotationApplication in 1.179 seconds (JVM running for 1.914)

通過日志觀察,默認內嵌容器已經替換成underTow,同理jetty一樣

2.主動配置

由于SpringBoot在獲取servlet容器是通過ServletWebServerFactory類型來獲取。ServletWebServerFactory一共有三個實現類,分別為JettyServletWebServerFactory,UndertowServletWebServerFactory,TomcatServletWebServerFactory。分別對應jetty,underTow,tomcat。

SpringBoot在AbstractApplicationContext.refresh()方法的onRefresh(),通過 ServletWebServerApplicationContext重寫該方法創建webServer();

protected void onRefresh() {super.onRefresh();try {this.createWebServer();} catch (Throwable var2) {throw new ApplicationContextException("Unable to start web server", var2);}
}

在createWebServer()中有個獲取WebServerFactory方法獲取對應的實現類的方法getWebServerFactory();

protected ServletWebServerFactory getWebServerFactory() {String[] beanNames = this.getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);if (beanNames.length == 0) {throw new ApplicationContextException("Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.");} else if (beanNames.length > 1) {throw new ApplicationContextException("Unable to start ServletWebServerApplicationContext due to multiple ServletWebServerFactory beans : " + StringUtils.arrayToCommaDelimitedString(beanNames));} else {return (ServletWebServerFactory)this.getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);}}

getWebServerFactory(),通過在Spring容器中獲取ServletWebServerFactory類型的bean,如果獲取不到和獲取多個都會拋出異常

所以我們可以通過手動配置ServletWebServerFactory對應的實現類,以此來切換不同的容器。

  • 將tomcat,jetty,undertow的starter都引入到項目中
  • 新建配置ServletServerConfig
@Configuration
public class ServletServerConfig {@Beanpublic ServletWebServerFactory underTowServletWebServerFactory(){UndertowServletWebServerFactory undertowServletWebServerFactory = new UndertowServletWebServerFactory();undertowServletWebServerFactory.setPort(8087);return undertowServletWebServerFactory;}//@Beanpublic ServletWebServerFactory tomcatServletWebServerFactory(){TomcatServletWebServerFactory tomcatServletWebServerFactory = new TomcatServletWebServerFactory();tomcatServletWebServerFactory.setPort(8081);return tomcatServletWebServerFactory;}//@Beanpublic ServletWebServerFactory jettyServletWebServerFactory(){JettyServletWebServerFactory jettyServletWebServerFactory = new JettyServletWebServerFactory();jettyServletWebServerFactory.setPort(8086);return jettyServletWebServerFactory;}
}

需要用哪個容器,就把其他兩個容器注釋掉。(不能創建多個ServletWebServerFactory,在getWebServerFactory()中會拋異常

如何通過配置切換serlvet容器

在主動配置的基礎上,可以通過對config進行改造

  1. 在application.yaml中配置servlet.server屬性 ,具體1,2,3代表tomcat還是jetty由自己定義
  2. 利用SpringBoot注解@ConditionalOnProperty注解可以切換servlet容器
servlet:server: 2
@Configuration
public class ServletServerConfig {@Bean@ConditionalOnProperty(name = "servlet.server",havingValue = "1")public ServletWebServerFactory underTowServletWebServerFactory(){UndertowServletWebServerFactory undertowServletWebServerFactory = new UndertowServletWebServerFactory();undertowServletWebServerFactory.setPort(8087);return undertowServletWebServerFactory;}@Bean@ConditionalOnProperty(name = "servlet.server",havingValue = "2")public ServletWebServerFactory tomcatServletWebServerFactory(){TomcatServletWebServerFactory tomcatServletWebServerFactory = new TomcatServletWebServerFactory();tomcatServletWebServerFactory.setPort(8081);return tomcatServletWebServerFactory;}@Bean@ConditionalOnProperty(name = "servlet.server",havingValue = "3")public ServletWebServerFactory jettyServletWebServerFactory(){JettyServletWebServerFactory jettyServletWebServerFactory = new JettyServletWebServerFactory();jettyServletWebServerFactory.setPort(8086);return jettyServletWebServerFactory;}
}

ServletServerConfig中,1表示underTow,2表示tomdat,3,表示jetty。而application.yml中配置的2,則啟動項目,觀察console

2024-05-17 17:14:19.142  INFO 7500 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2024-05-17 17:14:19.148  INFO 7500 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]

將配置更改為3,再次啟動,觀察console

2024-05-17 17:15:01.473  INFO 5260 --- [           main] o.e.jetty.server.AbstractConnector       : Started ServerConnector@13579834{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2024-05-17 17:15:01.473  INFO 5260 --- [           main] o.s.b.web.embedded.jetty.JettyWebServer  : Jetty started on port(s) 8080 (http/1.1) with context path '/'

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14707.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14707.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14707.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機畢業設計hadoop+spark微博輿情大數據分析 微博爬蟲可視化 微博數據分析 微博采集分析平臺 機器學習(大屏+LSTM情感分析+爬蟲)

電商數據建模 一、分析背景與目的 1.1 背景介紹 電商平臺數據分析是最為典型的一個數據分析賽道&#xff0c;且電商數據分析有著比較成熟的數據分析模型&#xff0c;比如&#xff1a;人貨場模型。此文中我將通過分析國內最大的電商平臺——淘寶的用戶行為&#xff0c;來鞏固數…

算法打卡 Day13(棧與隊列)-滑動窗口最大值 + 前 K 個高頻元素 + 總結

文章目錄 Leetcode 239-滑動窗口最大值題目描述解題思路 Leetcode 347-前 K 個高頻元素題目描述解題思路 棧與隊列總結 Leetcode 239-滑動窗口最大值 題目描述 https://leetcode.cn/problems/sliding-window-maximum/description/ 解題思路 在本題中我們使用自定義的單調隊列…

C語言指針指針和數組筆試題(必看)

前言&#xff1a; 前面介紹了指針的大體內容&#xff0c;如果接下來能夠把這些代碼的含義搞得清清楚楚&#xff0c;那么你就是代碼king&#xff01; 一維數組&#xff1a; int a[] {1,2,3,4}; printf("%d\n",sizeof(a)); printf("%d\n",sizeof(a0)); pr…

element-ui輸入框和多行文字輸入框字體不一樣解決

element-ui的type"textarea"的字體樣式與其他樣式不同 <el-input type"textarea"></el-input> <el-input ></el-input>設置&#xff1a; .el-textarea__inner::placeholder {font-family: "Helvetica Neue", Helvetic…

linux排查思路

1.賬號安全 who 查看當前登錄用戶&#xff08;tty本地登錄pts遠程登錄&#xff09; w 查看系統信息&#xff0c;想知道某一時刻用戶的行為 uptime 查看登錄多久、多少用戶&#xff0c;負載 1.查看用戶信息文件/etc/passwd root:x:0:0:root:/root:/bin:/b…

刪除MySQL中所有表的外鍵

方法一&#xff1a; 原理 查詢schema中所有外鍵名稱然后拼接生成刪除語句 第一步&#xff1a; SELECT CONCAT(ALTER TABLE ,TABLE_SCHEMA,.,TABLE_NAME, DROP FOREIGN KEY ,CONSTRAINT_NAME, ;) FROM information_schema.TABLE_CONSTRAINTS c WHERE c.TABLE_SCHEMA數據庫名…

Vue 跨域代理設置

Vue CLI允許你通過項目根目錄下的vue.config.js文件來定制devServer的配置。以下是一些常見的配置示例&#xff1a; module.exports {devServer: {// 跨域代理配置&#xff0c;解決開發環境API跨域問題proxy: {//匹配以api路徑請求的URL&#xff0c;轉發請求的服務器地址/api…

課時135:awk實踐_邏輯控制_綜合實踐

1.3.8 綜合實踐 學習目標 這一節&#xff0c;我們從 網絡實踐、文件實踐、小結 三個方面來學習 網絡實踐 簡介 所謂的網絡實踐&#xff0c;主要是借助于awk的數組功能&#xff0c;進行站點的信息統計操作。準備網絡環境 安裝軟件 yum install nignx -y重啟nginx [rootloca…

Linux修煉之路之自動化構建工具,進度條,gdb調試器

目錄 一&#xff1a;自動化構建工具make/makefile 生成內容&#xff1a; 清理內容&#xff1a; 對于多過程的&#xff1a; 對于多次make&#xff1a; 特殊符號&#xff1a; 二&#xff1a;小程序之進度條 三&#xff1a;git的簡單介紹 四&#xff1a;Linux調試器gdb 接…

fpga 提高有什么進階書推薦?

到FPGA中后期的時候就要開始接觸&#xff0c;如&#xff1a;高速接口、光纖數字信號處理等項目實踐了&#xff0c;那么我們可以讀一些書進行提升&#xff0c;大家可以收藏下。 高速接口項目《嵌入式高速串行總線技術:基于FPGA實現與應用》作者&#xff1a;張鋒 FPGA提升書籍推…

Go團隊:Go是什么

2024年的Google I/O大會[1]如期而至。 這屆大會的核心主旨毫無疑問是堅定不移的以AI為中心&#xff1a;Google先是發布了上下文長度將達到驚人的200萬token的Gemini 1.5 Pro[2]&#xff0c;然后面對OpenAI GPT-4o的挑釁&#xff0c;谷歌在大會上直接甩出大殺器Project Astra[3]…

第七節 ConfigurationClassParser 源碼分析

tips&#xff1a; ConfigurationClassParser 是 Springframework 中的重要類。 本章主要是源碼理解&#xff0c;有難度和深度&#xff0c;也枯燥乏味&#xff0c;可以根據實際情況選擇閱讀。 位置&#xff1a;org.springframework.context.annotation.ConfigurationClassPars…

[LLM-Agents]淺析Agent工具使用框架:MM-ReAct

上文LLM-Agents]詳解Agent中工具使用Workflow提到MM-ReAct框架&#xff0c;通過結合ChatGPT 與視覺專家模型來解決復雜的視覺理解任務的框架。通過設計文本提示&#xff08;prompt design&#xff09;&#xff0c;使得語言模型能夠接受、關聯和處理多模態信息&#xff0c;如圖像…

winform在一個類中調用窗體的控件和方法的兩個方式

第一: 在類中創建窗體對象的方式&#xff0c;通過對象調用控件或方法 eg: Form1 form1 new Form1(); form1.Button; //調用控件 form1.Method(); //調用方法 要注意&#xff0c;對應控件的Modifiers屬性要設置成public . 第二: 在窗體Form類下定義靜態變量(例如:form1)&…

Multi-Attention Transformer for Naturalistic Driving Action Recognition

標題&#xff1a;用于自然駕駛行為識別的多注意力Transformer 源文鏈接&#xff1a;https://openaccess.thecvf.com/content/CVPR2023W/AICity/papers/Dong_Multi-Attention_Transformer_for_Naturalistic_Driving_Action_Recognition_CVPRW_2023_paper.pdfhttps://openaccess…

linux創建私有docker倉庫以及推拉

創建私有倉庫&#xff1a; 1.下載 registry鏡像。 2.執行 registry 鏡像&#xff08;#為注釋內容&#xff0c;\為換行&#xff09;&#xff1a; docker run -d \# --restartalways每次都是開機自動啟動--restartalways \# --name registry 表示容器名--name registry \# 表示…

java讀取shp文件,獲取點位

Testvoid contextLoads() {System.out.println(System.currentTimeMillis());//1716516228057 1716516228798String zipFilePath "C:\\code\\risk\\risk_management_backend\\edatope-app\\src\\main\\resources\\新中心范圍SHP導入模板.zip";String destDir &quo…

【Muduo】TcpServer類

TcpServer統領之前所有的類&#xff0c;是用戶直接使用的類。它通過ThreadPool管理所有的loopthread&#xff0c;保存所有的TcpConnection&#xff0c;保存用戶提供的各種回調函數并向TcpConnection的Channel中注冊回調。它負責監聽指定的端口&#xff0c;并接受來自客戶端的連…

ZeRO-3、模型并行、流水線并行適用情況

ZeRO-3 適用場景&#xff1a;參數量大但計算量相對均衡的情況。 主要特點&#xff1a; 參數分片&#xff1a;將模型參數、優化器狀態和梯度在多個 GPU 上進行分片。顯存優化&#xff1a;顯著減少每個 GPU 上的顯存占用&#xff0c;使得可以在較小的 GPU 上訓練更大的模型。 …