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都能进行访问.当时我还以为他对代码进行处理了,后来发现不是,后 ...
随机推荐
- ajax的get请求与编码
window.onload = function(){ document.getElementById('username').onblur = function(){ var name = docu ...
- 黑马day01 xml 的解析方式
XML编程:利用java程序去增删改查(CRUD)xml中的数据 解析思想: dom解析 sax解析 基于这两种解析思想市面上就有了非常多的解析api sun jaxp既有dom方式也有sax方式,而 ...
- Could not find action or result: There is no Action mapped for namespace [/] and action name [GetG
Could not find action or result: /car/GetGpsDataAction There is no Action mapped for namespace [/] ...
- Altium Designer如何设置pcb尺寸
- Redis实现Mybatis的二级缓存
一.Mybatis的缓存 通大多数ORM层框架一样,Mybatis自然也提供了对一级缓存和二级缓存的支持.一下是一级缓存和二级缓存的作用于和定义. 1.一级缓存是SqlSession级别的缓存.在操作 ...
- vue指令应用--实现输入框常见过滤功能
前端开发最常碰到的就是输入框,经常要做各种验证,本公司惯用的需求是直接屏蔽特定字符的输入,如禁止非数字输入,特殊符号输入,空格输入等,这些功能反复使用,做成指令的形式,直接调用,非常方便,上代码: 目 ...
- mysql的入门基础操作
1.数据库的简单介绍 1.1 什么是数据库,就是一个文件系统,使用标准sql对数据库进行操作 1.2 常见的数据库 oracle 是oracle公司的数据库,是一个收费的大型的数据库 DB2,是IB ...
- stm32优先级
- swift学习第十天:函数
函数的介绍 函数相当于OC中的方法 函数的格式如下 func 函数名(参数列表) -> 返回值类型 { 代码块 return 返回值 } func是关键字,多个参数列表之间可以用逗号(,)分隔, ...
- win32中SetCapture 和 ReleaseCapture的使用(查一下在VCL中的使用)
最近在用win32写<visual C++经典游戏程序设计>中的扫雷游戏,在写到鼠标点击雷区的时候用到了SetCapture,和ReleaseCapture这对系统函数. 那么为什么需要用 ...