springboot原理实战(15)--springboot优化和定制tomcat

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: springboot原理实战(15)--springboot优化和定制tomcat

目录


本文主要是学习下springboot内置的tomcat的相关配置,通过配置文件或者代码方式来调优定制tomcat。概要如下:

1dc618a0ed9580ce8bfa6facb208c08f.png


一、配置方式:


我们可以在配置文件中配置tomcat的端口号,项目地址,是否打印日志,日志输出目录位置


server.port=8081
server.address=192.168.157.1
## tomcat打印日志
server.tomcat.accesslog.enabled=true
## 日志输出目录
server.tomcat.accesslog.directory=e:/tmp/logs


测试下:


@RestController
public class UserController {
    @GetMapping("/user/home")
    public String hello(){
        return "user homoe";
    }
}


入口函数测试下:


@SpringBootApplication
public class Demo15Application {
    public static void main(String[] args) {
//        EmbeddedWebServerFactoryCustomizerAutoConfiguration
        SpringApplication.run(Demo15Application.class, args);
    }
}


启动控制台,显示端口已经改为8081


5d4c6812c8535adbb050f4ddf2e1bce8.png

现在访问url:

46a9d80a6e05e4e3b19d57a0ee70bcdf.png

显示配置的address已经生效.


66ba272a0bfc97be54a5fa679e3d5482.png

日志也已经输出到了:

e:/tmp/logs。


更多的tomcat服务的参数在ServerProperties这个类中,需要可以查看参数:


1dc618a0ed9580ce8bfa6facb208c08f.png


二、代码方式定制tomcat容器的2种方式


1.实现WebServerFactoryCustomizer接口,并把实现类纳入到spring容器中管理


举例说明,用代码设置端口号,日志出书,自定义链接:


import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;
import java.io.File;
@Component
public class MyEmbeddedServletContainerCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        factory.setPort(9898);
        factory.setBaseDirectory(new File("e:/tmp/tomcat"));
        factory.addContextValves(getLogAccesslogVslue());
        //添加一个自定义连接器
        factory.addConnectorCustomizers(new MyTomcatConnectorCustomizer());
    }
    //设置tomcat日志
    private AccessLogValve getLogAccesslogVslue(){
        AccessLogValve log = new AccessLogValve();
        log.setEnabled(true);
        log.setDirectory("e:/tmp/logs");
//        log.setPattern("common");
        log.setPattern("combined");
        log.setPrefix("springboot-access-log");
        log.setSuffix(".txt");
        return log;
    }
}
//设置tomcat连接数
class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer {
    @Override
    public void customize(Connector connector) {
        System.out.println(connector.getProtocolHandler().getClass());
        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
        //设置最大连接数
        protocol.setMaxConnections(2000);
        //设置最大的线程数
        protocol.setMaxThreads(500);
    }
}


入口函数


@SpringBootApplication
public class Demo15Application {
    public static void main(String[] args) {
//        EmbeddedWebServerFactoryCustomizerAutoConfiguration
        SpringApplication.run(Demo15Application.class, args);
    }
}


运行结果:


如下图:页面访问成功,说明端口设置9898成功:

5d4c6812c8535adbb050f4ddf2e1bce8.png

如下图:日志输出显示,名字前缀和后缀都自定义成功。


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


如下图:tomcat的根目录设置成功。


66ba272a0bfc97be54a5fa679e3d5482.png


2. 配置类中装配一个WebServerFactoryCustomizer对象方式


//tomcat容器的定制
@Configuration
public class TomcatCustomizer {
    @Bean
    public ConfigurableServletWebServerFactory configurableServletWebServerFactory(){
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addInitializers((servletContext) -> {
            System.out.println("=========servletContext startup===============");
        });
        factory.setPort(9999);
        //设置异常页面
        factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"));
        factory.setBaseDirectory(new File("e:/tmp/tomcat2"));
        factory.addContextValves(getLogAccesslogVslue());
        //添加一个自定义连接器
        factory.addConnectorCustomizers(new MyTomcatConnectorCustomizer());
        return factory;
    }
    //设置tomcat日志
    private AccessLogValve getLogAccesslogVslue(){
        AccessLogValve log = new AccessLogValve();
        log.setEnabled(true);
        log.setDirectory("e:/tmp/tomcat2/logs");
//        log.setPattern("common");
        //设置日志格式
        log.setPattern("combined");
        log.setPrefix("springboot-access-log");
        log.setSuffix(".txt");
        return log;
    }
}
//设置tomcat连接数
class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer {
    @Override
    public void customize(Connector connector) {
        System.out.println(connector.getProtocolHandler().getClass());
        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
        //设置最大连接数
        protocol.setMaxConnections(2000);
        //设置最大的线程数
        protocol.setMaxThreads(500);
    }
}


测试:


@SpringBootApplication
public class Demo15Application {
    public static void main(String[] args) {
//        EmbeddedWebServerFactoryCustomizerAutoConfiguration
        SpringApplication.run(Demo15Application.class, args);
    }
}


如下图.说明端口已经设置9999成功:


1dc618a0ed9580ce8bfa6facb208c08f.png


访问页面:


5d4c6812c8535adbb050f4ddf2e1bce8.png

如下图,显示日志输出设置成功。


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


3.定制的原理:


其实tomcat自动注册的类是这个

EmbeddedWebServerFactoryCustomizerAutoConfiguration:

1dc618a0ed9580ce8bfa6facb208c08f.png

这里定制tomcat,jetty,underlow等容器。

继续看:这个类

TomcatWebServerFactoryCustomizer

5d4c6812c8535adbb050f4ddf2e1bce8.png

这个方法会把配置文件配置的信息注入到容器中,我们从新实现这个类,就可以定制我们的tomcat。


这篇文章主要了解了tomcatweb容器的定制的原理和实践。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
XML 前端开发 Java
SpringMVC入门到实战------2、SpringMVC创建实例Hello SpringMVC(maven+tomcat)
这篇文章是SpringMVC框架的入门教程,详细指导了如何在IDEA中使用Maven和Tomcat创建SpringMVC工程,包括添加依赖、配置web.xml、编写控制器、创建配置文件、配置Tomcat服务器以及进行基本的测试,展示了一个简单的Hello SpringMVC示例。
SpringMVC入门到实战------2、SpringMVC创建实例Hello SpringMVC(maven+tomcat)
|
26天前
|
监控 Java 应用服务中间件
部署tomcat部署实战案例
本文是关于Tomcat部署实战案例的教程,包括通过yum和二进制方式部署Tomcat的详细步骤,以及如何监控Tomcat服务。
172 84
部署tomcat部署实战案例
|
4天前
|
Java 应用服务中间件 API
Vertx高并发理论原理以及对比SpringBoot
Vertx 是一个基于 Netty 的响应式工具包,不同于传统框架如 Spring,它的侵入性较小,甚至可在 Spring Boot 中使用。响应式编程(Reactive Programming)基于事件模式,通过事件流触发任务执行,其核心在于事件流 Stream。相比多线程异步,响应式编程能以更少线程完成更多任务,减少内存消耗与上下文切换开销,提高 CPU 利用率。Vertx 适用于高并发系统,如 IM 系统、高性能中间件及需要较少服务器支持大规模 WEB 应用的场景。随着 JDK 21 引入协程,未来 Tomcat 也将优化支持更高并发,降低响应式框架的必要性。
Vertx高并发理论原理以及对比SpringBoot
|
16天前
|
存储 数据采集 Java
Spring Boot 3 实现GZIP压缩优化:显著减少接口流量消耗!
在Web开发过程中,随着应用规模的扩大和用户量的增长,接口流量的消耗成为了一个不容忽视的问题。为了提升应用的性能和用户体验,减少带宽占用,数据压缩成为了一个重要的优化手段。在Spring Boot 3中,通过集成GZIP压缩技术,我们可以显著减少接口流量的消耗,从而优化应用的性能。本文将详细介绍如何在Spring Boot 3中实现GZIP压缩优化。
55 6
|
15天前
|
Java 开发者 数据格式
【Java笔记+踩坑】SpringBoot基础4——原理篇
bean的8种加载方式,自动配置原理、自定义starter开发、SpringBoot程序启动流程解析
【Java笔记+踩坑】SpringBoot基础4——原理篇
|
1月前
|
NoSQL Java Redis
Redis6入门到实战------ 八、Redis与Spring Boot整合
这篇文章详细介绍了如何在Spring Boot项目中整合Redis,包括在`pom.xml`中添加依赖、配置`application.properties`文件、创建配置类以及编写测试类来验证Redis的连接和基本操作。
Redis6入门到实战------ 八、Redis与Spring Boot整合
|
1月前
|
缓存 Java 应用服务中间件
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
这篇文章详细介绍了在SpringMVC中创建JSP页面的全过程,包括项目的创建、配置、Tomcat的设置,以及如何实现页面跳转和配置模板解析器,最后还对比了JSP和HTML模板解析的差异。
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
|
30天前
|
Java API UED
【实战秘籍】Spring Boot开发者的福音:掌握网络防抖动,告别无效请求,提升用户体验!
【8月更文挑战第29天】网络防抖动技术能有效处理频繁触发的事件或请求,避免资源浪费,提升系统响应速度与用户体验。本文介绍如何在Spring Boot中实现防抖动,并提供代码示例。通过使用ScheduledExecutorService,可轻松实现延迟执行功能,确保仅在用户停止输入后才触发操作,大幅减少服务器负载。此外,还可利用`@Async`注解简化异步处理逻辑。防抖动是优化应用性能的关键策略,有助于打造高效稳定的软件系统。
38 2
|
1月前
|
缓存 前端开发 Java
"揭秘!SpringBoot携手Nginx,性能飙升秘籍大公开:轻松掌握配置优化,让你的应用快如闪电!"
【8月更文挑战第11天】随着微服务架构的发展,SpringBoot成为构建RESTful API的首选,Nginx则作为高性能的反向代理服务器提升应用性能。本文将探讨两者如何协同工作,包括Nginx的负载均衡策略、静态资源缓存及数据压缩配置;同时讨论SpringBoot的线程池优化、缓存策略及性能监控。通过这些方法,帮助开发者显著提高系统的整体性能和可用性。
65 1
|
30天前
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
62 0