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都能进行访问.当时我还以为他对代码进行处理了,后来发现不是,后 ...
随机推荐
- 洛谷 P1206 [USACO1.2]回文平方数 Palindromic Squares
P1206 [USACO1.2]回文平方数 Palindromic Squares 题目描述 回文数是指从左向右念和从右向左念都一样的数.如12321就是一个典型的回文数. 给定一个进制B(2< ...
- Loadrunner--负载生成器
对场景进行设计后,接着需要对负载生成器进行管理和设置.Load Generator是运行脚本的负载引擎,在默认情况下使用本地的负载生成器来运行脚本,但是模拟用户行为也需要消耗一定的系统资源,所以在一台 ...
- docker安装及问题处理
1.在Ubuntu的命令行中输入 sudo apt-get install docker.io 2.如果切换到了root用户下 apt-get install docker.io 3.对于新安装的Ub ...
- 9.3 Binder系统_驱动情景分析_服务获取过程
4. 服务获取过程 test_client客户端: (1)在用户态先构造name=“hello”的数据(服务的名字是hello),调用ioctl发送数据给service_manager(handle= ...
- IOS基础:深入理解Objective-c中@class 和#import的区别
在面向对象objective-C语言中,当一个类使用到另一个类时,并且在类的头文件中需要创建被引用的指针时,可以#import方式引入,通过@class引入: 这两种的方式的区别在于: 1.运用#im ...
- [Angular2 Form] Create custom form component using Control Value Accessor
//switch-control component import { Component } from '@angular/core'; import { ControlValueAccessor, ...
- chain rule 到 Markov chain
1. 联合概率(joint distribution)的链式法则 基于链式法则的 explicit formula: p(x1:n)===p(x)p(x1)∏i=2np(xi|x1,-,xi−1)∏i ...
- matplotlib学习之函数积分图
# coding:utf-8 import numpy as np from matplotlib import pyplot as plt from matplotlib.patches impor ...
- oracle 重置序列从指定数字开始的方法详解
原文 oracle 重置序列从指定数字开始的方法详解 重置oracle序列从指定数字开始 declare n ); v_startnum ):;--从多少开始 v_step ):;--步进 tsql ...
- [Recompose] Add Lifecycle Hooks to a Functional Stateless Component using Recompose
Learn how to use the 'lifecycle' higher-order component to conveniently use hooks without using a cl ...