文章目錄
目錄
本文主要是學習下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每一天
不定時推送相關文章,期待和大家一起成長!!
完