spring boot中tomcat 的定制

1、Spring Boot 定制与优化内置Tomcat容器。

> 内置的容器有三个分别是Undertow、Jetty、Tomcat,Spring Boot 对这三个容器分别进行了实现,它们上层接口都是EmbeddedServletContainerFactory,该接口也是本文的主要核心.

对于内置容器的定制与优化主要有两种方式,第一种方式是通过配置文件来配置,另外一种是通过码代码的方式.接下来主要对上述两种方式进行实现。

2、通过配置文件来定制与优化Tomcat

> 配置的核心内容参考org.springframework.boot.autoconfigure.web.ServerProperties这个服务属性类,下面展示部分对tomcat的配置

 

 
  1. server:

  2. port: 8081

  3. # tomcat设置

  4. tomcat:

  5. accesslog:

  6. # 开启日志访问

  7. enabled: true

  8. # 日志保存路径

  9. 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容器管理

 
  1. @Component

  2. public class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer {

  3. @Override

  4. public void customize(ConfigurableEmbeddedServletContainer container) {

  5. //org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory

  6. //说明默认是的Tomcat容器

  7. System.out.println(container.getClass());

  8. TomcatEmbeddedServletContainerFactory factory = (TomcatEmbeddedServletContainerFactory) container;

  9. //设置端口

  10. factory.setPort(8088);

  11. //设置Tomcat的根目录

  12. factory.setBaseDirectory(new File("d:/tmp/tomcat"));

  13. //设置访问日志存放目录

  14. factory.addContextValves(getLogAccessLogValue());

  15. //设置Tomcat线程数和连接数

  16. factory.addConnectorCustomizers(new MyTomcatConnectorCustomizer());

  17. //初始化servletContext对象

  18. factory.addInitializers((servletContext) -> {

  19. System.out.println(" = = = = 获取服务器信息 = = " + servletContext.getServerInfo());

  20. });

  21.  
  22. }

  23. private AccessLogValve getLogAccessLogValue() {

  24. AccessLogValve accessLogValve = new AccessLogValve();

  25. accessLogValve.setDirectory("d:/tmp/tomcat/logs");

  26. accessLogValve.setEnabled(true);

  27. accessLogValve.setPattern(Constants.AccessLog.COMMON_PATTERN);

  28. accessLogValve.setPrefix("springboot-access-log");

  29. accessLogValve.setSuffix(".txt");

  30. return accessLogValve;

  31. }

  32. }

  33.  
  34. /**

  35. * 定制tomcat的连接数与线程数

  36. */

  37. class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer {

  38. @Override

  39. public void customize(Connector connector) {

  40. //连接协议 HTTP/1.1

  41. System.out.println(connector.getProtocol());

  42. //连接协议处理器 org.apache.coyote.http11.Http11NioProtocol

  43. System.out.println(connector.getProtocolHandler().getClass());

  44. //Http11NioProtocol

  45. Http11NioProtocol protocolHandler = (Http11NioProtocol) connector.getProtocolHandler();

  46. // 设置最大连接数

  47. protocolHandler.setMaxConnections(2000);

  48. // 设置最大线程数

  49. protocolHandler.setMaxThreads(500);

  50. }

  51. }


3.2、在Spring容器中配置EmbeddedServletContainerFactory实现类

 
  1. @SpringBootConfiguration

  2. public class WebServerConfiguration {

  3. @Bean

  4. public EmbeddedServletContainerFactory embeddedServletContainerFactory() {

  5. TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();

  6. //设置端口

  7. factory.setPort(8089);

  8. //设置404错误界面

  9. factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"));

  10. //设置在容器初始化的时候触发

  11. factory.addInitializers((servletContext) -> {

  12. System.out.println(" = = = = 获取服务器信息 = = " + servletContext.getServerInfo());

  13. });

  14. //设置最大连接数和最大线程数

  15. factory.addConnectorCustomizers((connector) -> {

  16. Http11NioProtocol protocolHandler = (Http11NioProtocol) connector.getProtocolHandler();

  17. protocolHandler.setMaxConnections(2000);

  18. protocolHandler.setMaxThreads(500);

  19. });

  20. //设置访问日志记录文件的目录

  21. factory.addContextValves(getLogAccessLogValue());

  22. return factory;

  23. }

  24.  
  25. private AccessLogValve getLogAccessLogValue() {

  26. AccessLogValve accessLogValve = new AccessLogValve();

  27. accessLogValve.setDirectory("d:/tmp/logs");

  28. accessLogValve.setEnabled(true);

  29. accessLogValve.setPattern(Constants.AccessLog.COMMON_PATTERN);

  30. accessLogValve.setPrefix("SpringBoot-Access-Log");

  31. accessLogValve.setSuffix(".txt");

  32. return accessLogValve;

  33. }

  34. }


4、总结

本文主要记录对内置容器优化和定制的方式,用于自己加深对SpringBoot理解。

文章来源:https://my.oschina.net/serve/blog/1581862

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值