美文网首页springbootconfigspringbootfeign
spring-boot定制和优化内嵌的Tomcat

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

作者: 八目朱勇铭 | 来源:发表于2017-10-01 01:15 被阅读604次

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

    springboot内嵌的三种容器

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

    第一种方式

    @SpringBootConfiguration
    public 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容器中管理。

    @Component
    public 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系列博客~

    相关文章

      网友评论

        本文标题:spring-boot定制和优化内嵌的Tomcat

        本文链接:https://www.haomeiwen.com/subject/baqoextx.html