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容器的定制的原理和实践。


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
3月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
618 3
|
1月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
Spring Boot 3.x 微服务架构实战指南
|
2月前
|
消息中间件 Ubuntu Java
SpringBoot整合MQTT实战:基于EMQX实现双向设备通信
本教程指导在Ubuntu上部署EMQX 5.9.0并集成Spring Boot实现MQTT双向通信,涵盖服务器搭建、客户端配置及生产实践,助您快速构建企业级物联网消息系统。
940 1
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
481 5
|
7月前
|
前端开发 Java UED
从基础到进阶:Spring Boot + Thymeleaf 整合开发中的常见坑与界面优化
本文深入探讨了 **Spring Boot + Thymeleaf** 开发中常见的参数绑定问题与界面优化技巧。从基础的 Spring MVC 请求参数绑定机制出发,分析了 `MissingServletRequestParameterException` 的成因及解决方法,例如确保前后端参数名、类型一致,正确设置请求方式(GET/POST)。同时,通过实际案例展示了如何优化支付页面的视觉效果,借助简单的 CSS 样式提升用户体验。最后,提供了官方文档等学习资源,帮助开发者更高效地掌握相关技能。无论是初学者还是进阶用户,都能从中受益,轻松应对项目开发中的挑战。
352 0
|
7月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
221 0
|
8月前
|
缓存 NoSQL Java
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
713 79
|
6月前
|
监控 Java 调度
SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战
本文对比分析了SpringBoot中的`@Scheduled`与Quartz定时任务框架。`@Scheduled`轻量易用,适合单机简单场景,但存在多实例重复执行、无持久化等缺陷;Quartz功能强大,支持分布式调度、任务持久化、动态调整和失败重试,适用于复杂企业级需求。文章通过特性对比、代码示例及常见问题解答,帮助开发者理解两者差异,合理选择方案。记住口诀:单机简单用注解,多节点上Quartz;若是任务要可靠,持久化配置不能少。
598 4
|
12月前
|
监控 Java 应用服务中间件
Spring Boot整合Tomcat底层源码分析
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置和起步依赖等特性,大大简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是其与Tomcat的整合。
311 1
|
7月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
691 5