当前位置:   article > 正文

springboot原理实战(15)--springboot优化和定制tomcat

springboot原理实战(15)--springboot优化和定制tomcat

目录

本文主要是学习下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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

测试下:

@RestController
public class UserController {
    @GetMapping("/user/home")
    public String hello(){
        return "user homoe";
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

入口函数测试下:

@SpringBootApplication
public class Demo15Application {
    public static void main(String[] args) {
//        EmbeddedWebServerFactoryCustomizerAutoConfiguration
        SpringApplication.run(Demo15Application.class, args);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

启动控制台,显示端口已经改为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);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

入口函数

@SpringBootApplication
public class Demo15Application {


    public static void main(String[] args) {
//        EmbeddedWebServerFactoryCustomizerAutoConfiguration
        SpringApplication.run(Demo15Application.class, args);
    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行结果:
如下图:页面访问成功,说明端口设置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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

测试:

@SpringBootApplication
public class Demo15Application {


    public static void main(String[] args) {
//        EmbeddedWebServerFactoryCustomizerAutoConfiguration
        SpringApplication.run(Demo15Application.class, args);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

如下图.说明端口已经设置9999成功:

在这里插入图片描述
访问页面:
在这里插入图片描述
如下图,显示日志输出设置成功。
在这里插入图片描述

3.定制的原理:

其实tomcat自动注册的类是这个
EmbeddedWebServerFactoryCustomizerAutoConfiguration:

在这里插入图片描述这里定制tomcat,jetty,underlow等容器。
继续看:这个类
TomcatWebServerFactoryCustomizer
在这里插入图片描述
这个方法会把配置文件配置的信息注入到容器中,我们从新实现这个类,就可以定制我们的tomcat。


这篇文章主要了解了tomcatweb容器的定制的原理和实践。


个人微信公号:
搜索: 怒放de每一天
不定时推送相关文章,期待和大家一起成长!!
在这里插入图片描述


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/52535
推荐阅读
相关标签
  

闽ICP备14008679号