spring-boot定製和最佳化內嵌的Tomcat

deeply發表於2021-09-09

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容器中沒有TomcatEmbeddedServletContainerFactory這個bean時,才會把此bean載入進Spring容器中。顯然我們自己編寫了一個Tomcat的Configuration後,圖中的bean將不會被載入。由於篇幅有限,截圖的這個類的下面還有jetty、Undertow的程式碼,和Tomcat的實現是一樣的,這裡就不介紹了,讀者感興趣可以自己一探究竟。

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

好啦,本節內容就到這裡,感興趣的讀者可以持續關注我的springboot系列部落格~



作者:八目朱勇銘
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1978/viewspace-2820410/,如需轉載,請註明出處,否則將追究法律責任。

相關文章