手记

spring-boot定制和优化内嵌的Tomcat

springboot为我们内嵌了三种容器供我们使用:Tomcat、Jetty和undertow,默认使用tomcat

springboot内嵌的三种容器

本文介绍两种方式来定制springboot内嵌的Tomcat

第一种方式

@SpringBootConfigurationpublic class WebServerConfiguration {    @Bean
    public EmbeddedServletContainerFactory embeddedServletContainerFactory() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();        
        //设置端口号
        factory.setPort(8888);        //factory这个对象中还有很多的Spring容器级别的参数可以设置,例如我们前几篇文章中讲到的Initializers、Listeners、Tomcat日志等

        //设置Tomcat连接池...
        //这是以java8的做法来实现的,事实上就是编写一个内部类,不熟悉Java8的读者可以借鉴下面的实现方式
        factory.addConnectorCustomizers((connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
            protocol.setMaxThreads(200);
            protocol.setMaxConnections(1000);            //protocol这个对象中还有很多tomcat的参数可以设置,读者可以自己了解了解。
        }));        /*factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
            @Override
            public void customize(Connector connector) {
                Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                protocol.setMaxThreads(200);
                protocol.setMaxConnections(1000);
            }
        });*/
        return factory;
    }
}

第二种方式

编写类,实现EmbeddedServletContainerCustomizer接口,重写抽象方法,并将这个类加入spring容器中管理。

@Componentpublic class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer {    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {        //和第一种方法一样,我们又拿到了这个factory对象,我们就可以接着搞事情了....
        TomcatEmbeddedServletContainerFactory factory = (TomcatEmbeddedServletContainerFactory) container;        //......
    }
}

其实,第一种方式来自于springboot源码的实现,我们可以打开EmbeddedServletContainerAutoConfiguration这个类阅读一下源码。

EmbeddedServletContainerAutoConfiguration.class

springboot源码的实现方式和我们的第一种实现方式一模一样,只不过源码作者仅仅是new TomcatEmbeddedServletContainerFactory()而已,并没有添加任何的配置参数。红框的部分我们在Spring-Boot autoconfigure之Condition这一小节讲过,当spring容器中没有TomcatEmbeddedServletContainerFactory这个bean时,才会把此bean加载进Spring容器中。显然我们自己编写了一个Tomcat的Configuration后,图中的bean将不会被加载。由于篇幅有限,截图的这个类的下面还有jetty、Undertow的代码,和Tomcat的实现是一样的,这里就不介绍了,读者感兴趣可以自己一探究竟。

另外,再介绍一下如何将springboot默认使用的tomcat容器换成jetty或其他容器,只需在pom.xml中排除掉spring-boot-starter-tomcat的引用,加上spring-boot-starter-jetty的引用就好了。

好啦,本节内容就到这里,感兴趣的读者可以持续关注我的springboot系列博客~



作者:八目朱勇铭
链接:https://www.jianshu.com/p/4ee2628b1cb5


0人推荐
随时随地看视频
慕课网APP