Spring Boot 定制与优化内置的Tomcat容器实例详解
1、spring boot 定制与优化内置tomcat容器。
> 内置的容器有三个分别是undertow、jetty、tomcat,spring boot 对这三个容器分别进行了实现,它们上层接口都是embeddedservletcontainerfactory,该接口也是本文的主要核心.
对于内置容器的定制与优化主要有两种方式,第一种方式是通过配置文件来配置,另外一种是通过码代码的方式.接下来主要对上述两种方式进行实现。
2、通过配置文件来定制与优化tomcat
> 配置的核心内容参考org.springframework.boot.autoconfigure.web.serverproperties这个服务属性类,下面展示部分对tomcat的配置
server: port: 8081 # tomcat设置 tomcat: accesslog: # 开启日志访问 enabled: true # 日志保存路径 directory: e:/tmp/logs
更多的配置内容参考org.springframework.boot.autoconfigure.web.serverproperties类内置属性。
3、通过码代码方式实现对内置容器的配置与优化
> 有两种方式显示用代码进行对内置容器进行优化与定制,第一种实现内置servlet容器定制器(org.springframework.boot.context.embedded.embeddedservletcontainercustomizer),并将类交给spring容器管理,另外一种是在spring容器中配置embeddedservletcontainerfactory接口实现类,这里我们主要针对内置tomcat,即tomcatembeddedservletcontainerfactory类
3.1、第一种方式实现embeddedservletcontainercustomizer接口,并交给spring容器管理
@component public class myembeddedservletcontainercustomizer implements embeddedservletcontainercustomizer { @override public void customize(configurableembeddedservletcontainer container) { //org.springframework.boot.context.embedded.tomcat.tomcatembeddedservletcontainerfactory //说明默认是的tomcat容器 system.out.println(container.getclass()); tomcatembeddedservletcontainerfactory factory = (tomcatembeddedservletcontainerfactory) container; //设置端口 factory.setport(8088); //设置tomcat的根目录 factory.setbasedirectory(new file("d:/tmp/tomcat")); //设置访问日志存放目录 factory.addcontextvalves(getlogaccesslogvalue()); //设置tomcat线程数和连接数 factory.addconnectorcustomizers(new mytomcatconnectorcustomizer()); //初始化servletcontext对象 factory.addinitializers((servletcontext) -> { system.out.println(" = = = = 获取服务器信息 = = " + 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的连接数与线程数 */ class mytomcatconnectorcustomizer implements tomcatconnectorcustomizer { @override public void customize(connector connector) { //连接协议 http/1.1 system.out.println(connector.getprotocol()); //连接协议处理器 org.apache.coyote.http11.http11nioprotocol system.out.println(connector.getprotocolhandler().getclass()); //http11nioprotocol http11nioprotocol protocolhandler = (http11nioprotocol) connector.getprotocolhandler(); // 设置最大连接数 protocolhandler.setmaxconnections(2000); // 设置最大线程数 protocolhandler.setmaxthreads(500); } }
3.1、在spring容器中配置embeddedservletcontainerfactory实现类
@springbootconfiguration public class webserverconfiguration { @bean public embeddedservletcontainerfactory embeddedservletcontainerfactory() { tomcatembeddedservletcontainerfactory factory = new tomcatembeddedservletcontainerfactory(); //设置端口 factory.setport(8089); //设置404错误界面 factory.adderrorpages(new errorpage(httpstatus.not_found, "/404.html")); //设置在容器初始化的时候触发 factory.addinitializers((servletcontext) -> { system.out.println(" = = = = 获取服务器信息 = = " + servletcontext.getserverinfo()); }); //设置最大连接数和最大线程数 factory.addconnectorcustomizers((connector) -> { http11nioprotocol protocolhandler = (http11nioprotocol) connector.getprotocolhandler(); protocolhandler.setmaxconnections(2000); protocolhandler.setmaxthreads(500); }); //设置访问日志记录文件的目录 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、总结
以上所述是小编给大家介绍的spring boot 定制与优化内置的tomcat容器实例详解,希望对大家有所帮助
上一篇: Spring之ORM模块代码详解