Spring Boot 定制與優(yōu)化內(nèi)置的Tomcat容器實(shí)例詳解
1、Spring Boot 定制與優(yōu)化內(nèi)置Tomcat容器。
> 內(nèi)置的容器有三個(gè)分別是Undertow、Jetty、Tomcat,Spring Boot 對(duì)這三個(gè)容器分別進(jìn)行了實(shí)現(xiàn),它們上層接口都是EmbeddedServletContainerFactory,該接口也是本文的主要核心.
對(duì)于內(nèi)置容器的定制與優(yōu)化主要有兩種方式,第一種方式是通過配置文件來配置,另外一種是通過碼代碼的方式.接下來主要對(duì)上述兩種方式進(jìn)行實(shí)現(xiàn)。
2、通過配置文件來定制與優(yōu)化Tomcat
> 配置的核心內(nèi)容參考o(jì)rg.springframework.boot.autoconfigure.web.ServerProperties這個(gè)服務(wù)屬性類,下面展示部分對(duì)tomcat的配置
server: port: 8081 # tomcat設(shè)置 tomcat: accesslog: # 開啟日志訪問 enabled: true # 日志保存路徑 directory: e:/tmp/logs
更多的配置內(nèi)容參考o(jì)rg.springframework.boot.autoconfigure.web.ServerProperties類內(nèi)置屬性。
3、通過碼代碼方式實(shí)現(xiàn)對(duì)內(nèi)置容器的配置與優(yōu)化
> 有兩種方式顯示用代碼進(jìn)行對(duì)內(nèi)置容器進(jìn)行優(yōu)化與定制,第一種實(shí)現(xiàn)內(nèi)置Servlet容器定制器(org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer),并將類交給Spring容器管理,另外一種是在Spring容器中配置EmbeddedServletContainerFactory接口實(shí)現(xiàn)類,這里我們主要針對(duì)內(nèi)置Tomcat,即TomcatEmbeddedServletContainerFactory類
3.1、第一種方式實(shí)現(xiàn)EmbeddedServletContainerCustomizer接口,并交給Spring容器管理
@Component public class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer { @Override public void customize(ConfigurableEmbeddedServletContainer container) { //org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory //說明默認(rèn)是的Tomcat容器 System.out.println(container.getClass()); TomcatEmbeddedServletContainerFactory factory = (TomcatEmbeddedServletContainerFactory) container; //設(shè)置端口 factory.setPort(8088); //設(shè)置Tomcat的根目錄 factory.setBaseDirectory(new File("d:/tmp/tomcat")); //設(shè)置訪問日志存放目錄 factory.addContextValves(getLogAccessLogValue()); //設(shè)置Tomcat線程數(shù)和連接數(shù) factory.addConnectorCustomizers(new MyTomcatConnectorCustomizer()); //初始化servletContext對(duì)象 factory.addInitializers((servletContext) -> { System.out.println(" = = = = 獲取服務(wù)器信息 = = " + servletContext.getServerInfo()); }); } private AccessLogValve getLogAccessLogValue() { AccessLogValve accessLogValve = new AccessLogValve(); accessLogValve.setDirectory("d:/tmp/tomcat/logs"); accessLogValve.setEnabled(true); accessLogValve.setPattern(Constants.AccessLog.COMMON_PATTERN); accessLogValve.setPrefix("springboot-access-log"); accessLogValve.setSuffix(".txt"); return accessLogValve; } } /** * 定制tomcat的連接數(shù)與線程數(shù) */ class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer { @Override public void customize(Connector connector) { //連接協(xié)議 HTTP/1.1 System.out.println(connector.getProtocol()); //連接協(xié)議處理器 org.apache.coyote.http11.Http11NioProtocol System.out.println(connector.getProtocolHandler().getClass()); //Http11NioProtocol Http11NioProtocol protocolHandler = (Http11NioProtocol) connector.getProtocolHandler(); // 設(shè)置最大連接數(shù) protocolHandler.setMaxConnections(2000); // 設(shè)置最大線程數(shù) protocolHandler.setMaxThreads(500); } }
3.1、在Spring容器中配置EmbeddedServletContainerFactory實(shí)現(xiàn)類
@SpringBootConfiguration public class WebServerConfiguration { @Bean public EmbeddedServletContainerFactory embeddedServletContainerFactory() { TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); //設(shè)置端口 factory.setPort(8089); //設(shè)置404錯(cuò)誤界面 factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html")); //設(shè)置在容器初始化的時(shí)候觸發(fā) factory.addInitializers((servletContext) -> { System.out.println(" = = = = 獲取服務(wù)器信息 = = " + servletContext.getServerInfo()); }); //設(shè)置最大連接數(shù)和最大線程數(shù) factory.addConnectorCustomizers((connector) -> { Http11NioProtocol protocolHandler = (Http11NioProtocol) connector.getProtocolHandler(); protocolHandler.setMaxConnections(2000); protocolHandler.setMaxThreads(500); }); //設(shè)置訪問日志記錄文件的目錄 factory.addContextValves(getLogAccessLogValue()); return factory; } private AccessLogValve getLogAccessLogValue() { AccessLogValve accessLogValve = new AccessLogValve(); accessLogValve.setDirectory("d:/tmp/logs"); accessLogValve.setEnabled(true); accessLogValve.setPattern(Constants.AccessLog.COMMON_PATTERN); accessLogValve.setPrefix("SpringBoot-Access-Log"); accessLogValve.setSuffix(".txt"); return accessLogValve; } }
4、總結(jié)
以上所述是小編給大家介紹的Spring Boot 定制與優(yōu)化內(nèi)置的Tomcat容器實(shí)例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- SpringBoot 項(xiàng)目如何在tomcat容器中運(yùn)行的實(shí)現(xiàn)方法
- 基于spring-boot和docker-java實(shí)現(xiàn)對(duì)docker容器的動(dòng)態(tài)管理和監(jiān)控功能[附完整源碼下載]
- SpringBoot應(yīng)用部署于外置Tomcat容器的方法
- 關(guān)于SpringBoot獲取IOC容器中注入的Bean(推薦)
- 詳解spring boot容器加載完后執(zhí)行特定操作
- spring boot實(shí)戰(zhàn)之內(nèi)嵌容器tomcat配置
- SpringBoot如何在普通類加載Spring容器
相關(guān)文章
SpringBoot項(xiàng)目不占用端口啟動(dòng)的方法
這篇文章主要介紹了SpringBoot項(xiàng)目不占用端口啟動(dòng)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08解決SpringBoot項(xiàng)目啟動(dòng)后網(wǎng)頁顯示Please sign in的問題
這篇文章主要介紹了解決SpringBoot項(xiàng)目啟動(dòng)后網(wǎng)頁顯示Please sign in的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Intellij IDEA 配置Subversion插件實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了Intellij IDEA 配置Subversion插件實(shí)現(xiàn)步驟詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05Java如何使用ReentrantLock實(shí)現(xiàn)長輪詢
這篇文章主要介紹了如何使用ReentrantLock實(shí)現(xiàn)長輪詢,對(duì)ReentrantLock感興趣的同學(xué),可以參考下2021-04-04BigDecimal divide除法除不盡報(bào)錯(cuò)的問題及解決
這篇文章主要介紹了BigDecimal divide除法除不盡報(bào)錯(cuò)的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06java 中動(dòng)態(tài)代理機(jī)制的實(shí)例講解
這篇文章主要介紹了java 中動(dòng)態(tài)代理機(jī)制的實(shí)例講解的相關(guān)資料,希望通過本文大家能夠理解掌握動(dòng)態(tài)代理機(jī)制,需要的朋友可以參考下2017-09-09OpenFeign實(shí)現(xiàn)遠(yuǎn)程調(diào)用
這篇文章主要為大家詳細(xì)介紹了OpenFeign實(shí)現(xiàn)遠(yuǎn)程調(diào)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08java 中Object與Objects的區(qū)別在哪里
這篇文章主要介紹了java 中Object與Objects的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Lucene實(shí)現(xiàn)多種高級(jí)搜索形式
這篇文章主要介紹了Lucene實(shí)現(xiàn)多種高級(jí)搜索形式的相關(guān)資料,需要的朋友可以參考下2017-04-04