欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Boot 定制与优化内置的Tomcat容器实例详解

程序员文章站 2023-12-04 11:46:22
1、spring boot 定制与优化内置tomcat容器。 > 内置的容器有三个分别是undertow、jetty、tomcat,spring boot 对这三个...

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容器实例详解,希望对大家有所帮助