-
一、配置方式:
-
二、代码方式定制tomcat容器的2种方式
-
1.实现WebServerFactoryCustomizer接口,并把实现类纳入到spring容器中管理
-
2. 配置类中装配一个WebServerFactoryCustomizer对象方式
-
3.定制的原理:
本文主要是学习下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每一天
后续可能不定时推送相关文章,期待和大家一起成长!!
大功告成!!
原文始发于微信公众号(怒放de每一天):springboot原理实战(15)–springboot优化和定制tomcat
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/106599.html