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都能进行访问.当时我还以为他对代码进行处理了,后来发现不是,后 ...
随机推荐
- Spring Boot中的缓存支持(一)注解配置与EhCache使用
Spring Boot中的缓存支持(一)注解配置与EhCache使用 随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决 ...
- ZJOI2002昂贵的聘礼题解
http://codevs.cn/problem/1324/ 题目大意 一个部落,你能够和社会地位等级的极差不大于M的全部人交易.你能够拿金币直接从一个人手里买东西,也能够从别人那里买到那个人想要的东 ...
- wepy小程序实现选项卡
先上效果: 本文是基于前面几篇文章: 使用wepy开发微信小程序商城第一篇:项目初始化 使用wepy开发微信小程序商城第二篇:路由配置和页面结构 使用wepy开发微信小程序商城第三篇:购物车(布局篇) ...
- php ignore_user_abort()实现计划(定时执行)任务功能
? 1 2 3 4 5 6 7 8 9 10 11 12 <?php ignore_user_abort(TRUE); //关掉浏览器,PHP脚本也可以继续执行. set_ti ...
- bootstrap课程1 bootstrap为什么这么火
bootstrap课程1 bootstrap为什么这么火 一.总结 一句话总结:响应式,样式多,功能多. 1.bootstrap通过什么药实现响应式? 响应式web布局是让用户通过不同尺寸的浏览器都可 ...
- WPF遍历当前容器中某种控件的方法
原文:WPF遍历当前容器中某种控件的方法 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/79 ...
- 在此页上的 ActiveX 控件和本页上的其它部份的交互可能不安全
版权声明:转载时请以超链接形式标明文章原始出处和作者信息http://xqy266.blogbus.com/logs/66258230.html 在EOS6的项目中,如果采用VC++开发的Active ...
- CSS vertical-align属性的使用方法
这两天写个页面css的时候用到了vertical-align属性.使用过程中踩到了坑,所以总结例如以下: vertical-align的定义 W3C上对vertical-align的定义:vertic ...
- Node.js v10.1.0 Documentation
Modules Stable 在 Node.js 模块系统中,每个文件都会被当做一个独立的模块.假设有一个名为 foo.js: const circle = require('./circle.js' ...
- iOS开发之Quartz2D 五:UIKIT 绘图演练,画文字,画图片
#import "DrawView.h" @implementation DrawView -(void)awakeFromNib { // //画图片 // UIImage *i ...