Spring Boot 定制与优化内置的Tomcat容器
1、Spring
Boot定制与优化内置Tomcat容器。
> 内置的容器有三个分别是Undertow、Jetty、Tomcat,Spring Boot 对这三个容器分别进行了实现,它们上层接口都是EmbeddedServletContainerFactory,该接口也是本文的主要核心.
对于内置容器的定制与优化主要有两种方式,第一种方式是通过配置文件来配置,另外一种是通过码代码的方式.接下来主要对上述两种方式进行实现。
2、通过配置文件来定制与优化Tomcat
> 配置的核心内容参考org.springframework.boot.autoconfigure.web.ServerProperties这个服务属性类,下面展示部分对tomcat的配置
-
server:
-
port: 8081
-
# tomcat设置
-
tomcat:
-
accesslog:
-
# 开启日志访问
-
enabled: true
-
# 日志保存路径
-
directory: e:/tmp/logs
更多的配置内容参考org.springframework.boot.autoconfigure.web.ServerProperties类内置属性。
3、通过码代码方式实现对内置容器的配置与优化
> 有两种方式显示用代码进行对内置容器进行优化与定制,第一种实现内置Servlet容器定制器(org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer),并将类交给Spring容器管理,另外一种是在Spring容器中配置EmbeddedServletContainerFactory接口实现类,这里我们主要针对内置Tomcat,即TomcatEmbeddedServletContainerFactory类
3.1、第一种方式实现EmbeddedServletContainerCustomizer接口,并交给Spring容器管理
-
@Component
-
public class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer {
-
@Override
-
public void customize(ConfigurableEmbeddedServletContainer container) {
-
//org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
-
//说明默认是的Tomcat容器
-
System.out.println(container.getClass());
-
TomcatEmbeddedServletContainerFactory factory = (TomcatEmbeddedServletContainerFactory) container;
-
//设置端口
-
factory.setPort(8088);
-
//设置Tomcat的根目录
-
factory.setBaseDirectory(new File("d:/tmp/tomcat"));
-
//设置访问日志存放目录
-
factory.addContextValves(getLogAccessLogValue());
-
//设置Tomcat线程数和连接数
-
factory.addConnectorCustomizers(new MyTomcatConnectorCustomizer());
-
//初始化servletContext对象
-
factory.addInitializers((servletContext) -> {
-
System.out.println(" = = = = 获取服务器信息 = = " + servletContext.getServerInfo());
-
});
-
-
}
-
private AccessLogValve getLogAccessLogValue() {
-
AccessLogValve accessLogValve = new AccessLogValve();
-
accessLogValve.setDirectory("d:/tmp/tomcat/logs");
-
accessLogValve.setEnabled(true);
-
accessLogValve.setPattern(Constants.AccessLog.COMMON_PATTERN);
-
accessLogValve.setPrefix("springboot-access-log");
-
accessLogValve.setSuffix(".txt");
-
return accessLogValve;
-
}
-
}
-
-
/**
-
* 定制tomcat的连接数与线程数
-
*/
-
class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer {
-
@Override
-
public void customize(Connector connector) {
-
//连接协议 HTTP/1.1
-
System.out.println(connector.getProtocol());
-
//连接协议处理器 org.apache.coyote.http11.Http11NioProtocol
-
System.out.println(connector.getProtocolHandler().getClass());
-
//Http11NioProtocol
-
Http11NioProtocol protocolHandler = (Http11NioProtocol) connector.getProtocolHandler();
-
// 设置最大连接数
-
protocolHandler.setMaxConnections(2000);
-
// 设置最大线程数
-
protocolHandler.setMaxThreads(500);
-
}
-
}
3.2、在Spring容器中配置EmbeddedServletContainerFactory实现类
-
@SpringBootConfiguration
-
public class WebServerConfiguration {
-
@Bean
-
public EmbeddedServletContainerFactory embeddedServletContainerFactory() {
-
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
-
//设置端口
-
factory.setPort(8089);
-
//设置404错误界面
-
factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"));
-
//设置在容器初始化的时候触发
-
factory.addInitializers((servletContext) -> {
-
System.out.println(" = = = = 获取服务器信息 = = " + servletContext.getServerInfo());
-
});
-
//设置最大连接数和最大线程数
-
factory.addConnectorCustomizers((connector) -> {
-
Http11NioProtocol protocolHandler = (Http11NioProtocol) connector.getProtocolHandler();
-
protocolHandler.setMaxConnections(2000);
-
protocolHandler.setMaxThreads(500);
-
});
-
//设置访问日志记录文件的目录
-
factory.addContextValves(getLogAccessLogValue());
-
return factory;
-
}
-
-
private AccessLogValve getLogAccessLogValue() {
-
AccessLogValve accessLogValve = new AccessLogValve();
-
accessLogValve.setDirectory("d:/tmp/logs");
-
accessLogValve.setEnabled(true);
-
accessLogValve.setPattern(Constants.AccessLog.COMMON_PATTERN);
-
accessLogValve.setPrefix("SpringBoot-Access-Log");
-
accessLogValve.setSuffix(".txt");
-
return accessLogValve;
-
}
-
}
4、总结
本文主要记录对内置容器优化和定制的方式,用于自己加深对SpringBoot理解。
文章来源:https://my.oschina.net/serve/blog/1581862
Spring Boot 定制与优化内置的Tomcat容器的更多相关文章
- 015-Spring Boot 定制和优化内嵌的Tomcat
一.内嵌web容器 参看http://www.cnblogs.com/bjlhx/p/8372584.html 查看源码可知提供以下三种: 二.定制优化tomcat 2.1.配置文件配置 通过appl ...
- 从零开始的Spring Boot(6、Thymeleaf内置对象及表达式大全)
1.1 基础对象 #ctx:上下文对象 ${#ctx.locale} ${#ctx.variableNames} ${#ctx.request} ${#ctx.response} ${#ctx.ses ...
- Spring 事件(1)- 内置事件
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...
- 精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 我的Spring Boot学习记录(二):Tomcat Server以及Spring MVC的上下文问题
Spring Boot版本: 2.0.0.RELEASE 这里需要引入依赖 spring-boot-starter-web 这里有可能有个人的误解,请抱着怀疑态度看. 建议: 感觉自己也会被绕晕,所以 ...
- SpringBoot怎么自动部署到内置的Tomcat的?
先看看SpringBoot的主配置类的main方法: main方法运行了一个run()方法,进去run方法看一下: /** * 静态帮助程序,可用于从中运行{@link SpringApplicati ...
- ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)
在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...
- spring boot定制Jackson ObjectMapper,为什么不生效
先说结论: 项目中定制了spring 的redisTemplate,而这个template没有使用我自定义的Jackson ObjectMapper.所以不生效. 下面是详细过程: 起因是spring ...
- Spring Boot 定制URL匹配规则的方法
事情的起源:有人问我,说编写了一个/hello访问路径,但是吧,不管是输入/hello还是/hello.html,还是/hello.xxx都能进行访问.当时我还以为他对代码进行处理了,后来发现不是,后 ...
随机推荐
- 观察者模式 VS 责任链模式
为什么要把观察者模式和责任链模式放在一起对比呢?这两个模式没有太多的相似性呀,真没有嘛?有相似性,我们在观察者模式中也提到了触发链(也叫做观察者链)的问题,一个具体的角色既可以是观察者,也可以是被观察 ...
- Altium Designer中的粉红色网格和绿色框框
- CentOS7安装docker 18.06
原文:CentOS7安装docker 18.06 一.CentOS Docker 安装 参考docker 官方网站:https://docs.docker.com/install/linux/dock ...
- Java 学习(18):Java 序列化& 网络编程& 发送邮件
--Java 序列化 -- 网络编程 -- 发送邮件 Java 序列化 Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据.有关对象的类型的信 ...
- [React Intl] Render Content with Markup Using react-intl FormattedHTMLMessage
In this lesson, we’ll use the react-intl FormattedHTMLMessage component to display text with dynamic ...
- POJ 1275 Cashier Employment 挺难的差分约束题
http://poj.org/problem?id=1275 题目大意: 一商店二十四小时营业,但每个时间段需求的雇员数不同(已知,设为R[i]),现有n个人申请这份工作,其可以从固定时间t连续工作八 ...
- 3、应用层常用lib函数使用说明
1.mmap函数 void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset); start:映射区的开始地 ...
- Understanding Cubert Concepts(一)Partitioned Blocks
Understanding Cubert Concepts(一)Partitioned Blocks Cubert Concepts 对于Cubert,我们要理解其核心的一些概念,比方BLOCK.这些 ...
- 《Unix编程艺术》读书笔记(1)
<Unix编程艺术>读书笔记(1) 这两天開始阅读该书,以下是自己的体会,以及原文的摘录,尽管有些东西还无法全然吃透. 写优雅的代码来提高软件系统的透明性:(P134) Elegance ...
- 【计算机】基本概念的理解 —— 沙盒(sandbox)、交互式计算/编程/应用
web scraper:网络铲: scraper:n. 刮刀:铲土机:守财奴: 1. 交互式计算/编程/应用(interactive computing/application/programming ...