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

測試下:

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

入口函數測試下:

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

啓動控制檯,顯示端口已經改爲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);
    }
}

入口函數

@SpringBootApplication
public class Demo15Application {


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

}

運行結果:
如下圖:頁面訪問成功,說明端口設置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);
    }
}

測試:

@SpringBootApplication
public class Demo15Application {


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

}

如下圖.說明端口已經設置9999成功:

在這裏插入圖片描述
訪問頁面:
在這裏插入圖片描述
如下圖,顯示日誌輸出設置成功。
在這裏插入圖片描述

3.定製的原理:

其實tomcat自動註冊的類是這個
EmbeddedWebServerFactoryCustomizerAutoConfiguration:

在這裏插入圖片描述這裏定製tomcat,jetty,underlow等容器。
繼續看:這個類
TomcatWebServerFactoryCustomizer
在這裏插入圖片描述
這個方法會把配置文件配置的信息注入到容器中,我們從新實現這個類,就可以定製我們的tomcat。


這篇文章主要了解了tomcatweb容器的定製的原理和實踐。


個人微信公號:
搜索: 怒放de每一天
不定時推送相關文章,期待和大家一起成長!!
在這裏插入圖片描述


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章