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日志并进行多维度分析。
相关文章
|
29天前
|
监控 Java 应用服务中间件
Spring Boot整合Tomcat底层源码分析
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置和起步依赖等特性,大大简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是其与Tomcat的整合。
51 1
|
29天前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
29 0
|
1月前
|
Java Spring
SpringBoot自动装配的原理
在Spring Boot项目中,启动引导类通常使用`@SpringBootApplication`注解。该注解集成了`@SpringBootConfiguration`、`@ComponentScan`和`@EnableAutoConfiguration`三个注解,分别用于标记配置类、开启组件扫描和启用自动配置。
56 17
|
22天前
|
Java 容器
springboot自动配置原理
启动类@SpringbootApplication注解下,有三个关键注解 (1)@springbootConfiguration:表示启动类是一个自动配置类 (2)@CompontScan:扫描启动类所在包外的组件到容器中 (3)@EnableConfigutarion:最关键的一个注解,他拥有两个子注解,其中@AutoConfigurationpackageu会将启动类所在包下的所有组件到容器中,@Import会导入一个自动配置文件选择器,他会去加载META_INF目录下的spring.factories文件,这个文件中存放很大自动配置类的全类名,这些类会根据元注解的装配条件生效,生效
|
1月前
|
缓存 监控 Java
|
2月前
|
自然语言处理 Java API
Spring Boot 接入大模型实战:通义千问赋能智能应用快速构建
【10月更文挑战第23天】在人工智能(AI)技术飞速发展的今天,大模型如通义千问(阿里云推出的生成式对话引擎)等已成为推动智能应用创新的重要力量。然而,对于许多开发者而言,如何高效、便捷地接入这些大模型并构建出功能丰富的智能应用仍是一个挑战。
206 6
|
2月前
|
Java Spring 容器
springboot @RequiredArgsConstructor @Lazy解决循环依赖的原理
【10月更文挑战第15天】在Spring Boot应用中,循环依赖是一个常见问题,当两个或多个Bean相互依赖时,会导致Spring容器陷入死循环。本文通过比较@RequiredArgsConstructor和@Lazy注解,探讨它们解决循环依赖的原理和优缺点。@RequiredArgsConstructor通过构造函数注入依赖,使代码更简洁;@Lazy则通过延迟Bean的初始化,打破创建顺序依赖。两者各有优势,需根据具体场景选择合适的方法。
96 4
|
3月前
|
Java 应用服务中间件 API
Vertx高并发理论原理以及对比SpringBoot
Vertx 是一个基于 Netty 的响应式工具包,不同于传统框架如 Spring,它的侵入性较小,甚至可在 Spring Boot 中使用。响应式编程(Reactive Programming)基于事件模式,通过事件流触发任务执行,其核心在于事件流 Stream。相比多线程异步,响应式编程能以更少线程完成更多任务,减少内存消耗与上下文切换开销,提高 CPU 利用率。Vertx 适用于高并发系统,如 IM 系统、高性能中间件及需要较少服务器支持大规模 WEB 应用的场景。随着 JDK 21 引入协程,未来 Tomcat 也将优化支持更高并发,降低响应式框架的必要性。
Vertx高并发理论原理以及对比SpringBoot
|
2月前
|
前端开发 Java 应用服务中间件
21张图解析Tomcat运行原理与架构全貌
【10月更文挑战第2天】本文通过21张图详细解析了Tomcat的运行原理与架构。Tomcat作为Java Web开发中最流行的Web服务器之一,其架构设计精妙。文章首先介绍了Tomcat的基本组件:Connector(连接器)负责网络通信,Container(容器)处理业务逻辑。连接器内部包括EndPoint、Processor和Adapter等组件,分别处理通信、协议解析和请求封装。容器采用多级结构(Engine、Host、Context、Wrapper),并通过Mapper组件进行请求路由。文章还探讨了Tomcat的生命周期管理、启动与停止机制,并通过源码分析展示了请求处理流程。
|
2月前
|
负载均衡 应用服务中间件 Apache
Tomcat负载均衡原理详解及配置Apache2.2.22+Tomcat7
Tomcat负载均衡原理详解及配置Apache2.2.22+Tomcat7
48 3