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.1、在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理解。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
kubernetes集群中利用etcd和grpc实现golang服务间通信
kubernetes集群中利用etcd和grpc实现golang服务间通信 注:文中涉及工作环境相关的网址和IP已经被替换 1. 项目背景 服务运行于docker容器中 使用kubernetes管理容器 服务有多个节点作为一个集群 使用rest接口设置服务缓存中的信息 需要将信息同步到集群中其他节点 2. 项目方案 使用grpc做服务间通信 从etcd中读取服务所有状态为running的节点信息,包括:podIp、status、hostIp、startedAt(启动时间) 服务启动时选取运行时间最长的节点,调用grpc接口请求缓存的信息同步到本容器的服务中 使用rest接口设置缓存的时候,遍历所有节点(不包括自身),调用grpc接口将信息同步到其他节点 方案特点: - 不需要借助额外的配置管理工具(如:zookeeper) - 不需要自行管理节点的配置信息(因为kubernetes的etcd中已经有完整的节点信息) - grpc开发、传输效率高,扩展性好 - grpc使用http2.0方便后续提供rest接口 1. etcd简介 etcd 是用 golang 实现的一种 K-V 分布式...
- 下一篇
dubbo 超时设置和源码分析
本文 dubbo 2.6.2 在工作中碰到一个业务接口时间比较长,需要修改超时时间,不知道原理,在网上搜索,看到有人说如果你觉得自己了解了dubbo的超时机制,那么问问自己以下问题: 超时是针对消费端还是服务端? 超时在哪设置? 超时设置的优先级是什么? 超时的实现原理是什么? 超时解决的是什么问题 ? 如果连这些都回答不上了,那只能说明还没有完全掌握 dubbo的超时机制。 于是索性就自己本地搭了个环境,研究了一下源码。 先来说一说结论: 1、超时是针对消费端的,消费端会抛出TimeoutException 而服务器端仅仅是一个 warn日志 2、超时在消费端、服务器端设置,dubbo会合并这两个设置 3、consumer方法级别 > provider 方法级别 > consumer 接口级别 > provider 接口级别 > consumer 全局级别 > provider 全局级别。如果都没配置,那么就是dubbo默认的1秒 4、见下面分析 5、最主要是宝贵的线程,客户端的用户线程不能因为服务端超时而一直类似wait, 导致无法正常响应其他业务。 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- MySQL8.0.19开启GTID主从同步CentOS8
- Hadoop3单机部署,实现最简伪集群
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题