目录
本文主要是学习下springboot内置的tomcat的相关配置,通过配置文件或者代码方式来调优定制tomcat。概要如下:
一、配置方式:
我们可以在配置文件中配置tomcat的端口号,项目地址,是否打印日志,日志输出目录位置
server.port=8081 server.address=192.168.157.1 ## tomcat打印日志 server.tomcat.accesslog.enabled=true ## 日志输出目录 server.tomcat.accesslog.directory=e:/tmp/logs
测试下:
@RestController public class UserController { @GetMapping("/user/home") public String hello(){ return "user homoe"; } }
入口函数测试下:
@SpringBootApplication public class Demo15Application { public static void main(String[] args) { // EmbeddedWebServerFactoryCustomizerAutoConfiguration SpringApplication.run(Demo15Application.class, args); } }
启动控制台,显示端口已经改为8081
现在访问url:
显示配置的address已经生效.
日志也已经输出到了:
e:/tmp/logs。
更多的tomcat服务的参数在ServerProperties这个类中,需要可以查看参数:
二、代码方式定制tomcat容器的2种方式
1.实现WebServerFactoryCustomizer接口,并把实现类纳入到spring容器中管理
举例说明,用代码设置端口号,日志出书,自定义链接:
import org.apache.catalina.connector.Connector; import org.apache.catalina.valves.AccessLogValve; import org.apache.coyote.http11.Http11NioProtocol; import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.stereotype.Component; import java.io.File; @Component public class MyEmbeddedServletContainerCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> { @Override public void customize(TomcatServletWebServerFactory factory) { factory.setPort(9898); factory.setBaseDirectory(new File("e:/tmp/tomcat")); factory.addContextValves(getLogAccesslogVslue()); //添加一个自定义连接器 factory.addConnectorCustomizers(new MyTomcatConnectorCustomizer()); } //设置tomcat日志 private AccessLogValve getLogAccesslogVslue(){ AccessLogValve log = new AccessLogValve(); log.setEnabled(true); log.setDirectory("e:/tmp/logs"); // log.setPattern("common"); log.setPattern("combined"); log.setPrefix("springboot-access-log"); log.setSuffix(".txt"); return log; } } //设置tomcat连接数 class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer { @Override public void customize(Connector connector) { System.out.println(connector.getProtocolHandler().getClass()); Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); //设置最大连接数 protocol.setMaxConnections(2000); //设置最大的线程数 protocol.setMaxThreads(500); } }
入口函数
@SpringBootApplication public class Demo15Application { public static void main(String[] args) { // EmbeddedWebServerFactoryCustomizerAutoConfiguration SpringApplication.run(Demo15Application.class, args); } }
运行结果:
如下图:页面访问成功,说明端口设置9898成功:
如下图:日志输出显示,名字前缀和后缀都自定义成功。
如下图:tomcat的根目录设置成功。
2. 配置类中装配一个WebServerFactoryCustomizer对象方式
//tomcat容器的定制 @Configuration public class TomcatCustomizer { @Bean public ConfigurableServletWebServerFactory configurableServletWebServerFactory(){ TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.addInitializers((servletContext) -> { System.out.println("=========servletContext startup==============="); }); factory.setPort(9999); //设置异常页面 factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html")); factory.setBaseDirectory(new File("e:/tmp/tomcat2")); factory.addContextValves(getLogAccesslogVslue()); //添加一个自定义连接器 factory.addConnectorCustomizers(new MyTomcatConnectorCustomizer()); return factory; } //设置tomcat日志 private AccessLogValve getLogAccesslogVslue(){ AccessLogValve log = new AccessLogValve(); log.setEnabled(true); log.setDirectory("e:/tmp/tomcat2/logs"); // log.setPattern("common"); //设置日志格式 log.setPattern("combined"); log.setPrefix("springboot-access-log"); log.setSuffix(".txt"); return log; } } //设置tomcat连接数 class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer { @Override public void customize(Connector connector) { System.out.println(connector.getProtocolHandler().getClass()); Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); //设置最大连接数 protocol.setMaxConnections(2000); //设置最大的线程数 protocol.setMaxThreads(500); } }
测试:
@SpringBootApplication public class Demo15Application { public static void main(String[] args) { // EmbeddedWebServerFactoryCustomizerAutoConfiguration SpringApplication.run(Demo15Application.class, args); } }
如下图.说明端口已经设置9999成功:
访问页面:
如下图,显示日志输出设置成功。
3.定制的原理:
其实tomcat自动注册的类是这个
EmbeddedWebServerFactoryCustomizerAutoConfiguration:
这里定制tomcat,jetty,underlow等容器。
继续看:这个类
TomcatWebServerFactoryCustomizer
这个方法会把配置文件配置的信息注入到容器中,我们从新实现这个类,就可以定制我们的tomcat。
这篇文章主要了解了tomcatweb容器的定制的原理和实践。