Spring Boot Web 应用性能优化

默认情况下,Spring Boot Web 应用会装配一些功能组件 Bean。

在大多数 Web 应用场景下,可以选择性地关闭一下自动装配的Spring 组件 Bean,以达到提升性能的目的。

配置项优化

Spring Boot Web 应用加速 完整配置项

management.add-application-context-header = false
spring.mvc.formcontent.putfilter.enabled = false

spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.TraceRepositoryAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.TraceWebFilterAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration

配置项汇总

spring.autoconfigure.exclude = org.springframework.boot.actuate.autoconfigure.TraceRepositoryAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.TraceWebFilterAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration

关闭 Web 请求跟踪 自动装配

org.springframework.boot.actuate.autoconfigure.TraceWebFilterAutoConfiguration

顾名思义,该自动装配用跟踪 Web 请求,通过Servlet Filter org.springframework.boot.actuate.trace.WebRequestTraceFilter 记录请求的信息(如:请求方法、请求头以及请求路径等),其计算的过程存在一定的开销,使用场景罕见,故可选择关闭。

  • 配置项
spring.autoconfigure.exclude = org.springframework.boot.actuate.autoconfigure.TraceWebFilterAutoConfiguration

org.springframework.boot.actuate.autoconfigure.TraceRepositoryAutoConfiguration

org.springframework.boot.actuate.autoconfigure.TraceWebFilterAutoConfiguration关闭后,其请求信息存储介质org.springframework.boot.actuate.trace.TraceRepository没有存在的必要,故可选择关闭。

  • 配置项
spring.autoconfigure.exclude = org.springframework.boot.actuate.autoconfigure.TraceRepositoryAutoConfiguration

关闭 Web 请求结果指标 自动装配

org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration

该组件将自动装配org.springframework.boot.actuate.autoconfigure.MetricsFilter,该 Filter

主要记录Web 请求结果指标(如:相应状态码、请求方法执行时间等),该信息一定程度上与反向代理服务器(nginx)功能重叠,故可选择关闭。

  • 配置项
spring.autoconfigure.exclude = org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration

可关闭 Servlet Web 组件

org.springframework.web.filter.HttpPutFormContentFilter

  • 引入版本

org.springframework.web.filter.HttpPutFormContentFilter 由 Spring
Framework 3.1 版本引入,分发在 org.springframework:spring-web 中。

  • 使用场景

通常 Web 场景中,浏览器通过 HTTP GET 或者 POST 请求 提交 Form 数据,而非浏览
器客户端(如应用程序)可能通过 HTTP PUT 请求来实现。

当 HTTP 请求头Content-Typeapplication/x-www-form-urlencoded
,Form 数据被 encoded。而 Servlet 规范中, ServletRequest.getParameter*()
方法仅对 HTTP POST 方法支持请求参数的获取,如:

public intetfacce ServletRequest {

    ......

    public String getParameter(String name);

    public Enumeration<String> getParameterNames();

    public String[] getParameterValues(String name);

    public Map<String, String[]> getParameterMap();

    ......

}

故 以上方法无法支持 HTTP PUT 或 HTTP PATCH 请求方法(请求头Content-Type
application/x-www-form-urlencoded)。

org.springframework.web.filter.HttpPutFormContentFilter 正是这种场景的解
决方案。

Spring Boot 默认场景下,将
org.springframework.web.filter.HttpPutFormContentFilter
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 自动
装配,以下为 Spring Boot 1.4.1.RELEASE 以及更好版本定义(可能存在一定的差异):

@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class,
        WebMvcConfigurerAdapter.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
        ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

    ......

    @Bean
    @ConditionalOnMissingBean(HttpPutFormContentFilter.class)
    @ConditionalOnProperty(prefix = "spring.mvc.formcontent.putfilter", name = "enabled", matchIfMissing = true)
    public OrderedHttpPutFormContentFilter httpPutFormContentFilter() {
        return new OrderedHttpPutFormContentFilter();
    }

    ......

}

综上所述,org.springframework.web.filter.HttpPutFormContentFilter 在绝大
多数 Web 使用场景下为非必须组件。

  • 配置项

如果应用依赖 Spring Boot 版本 为 1.4.1.RELEASE 以及更高的版本,可通过如下配置,
进行将 org.springframework.web.filter.HttpPutFormContentFilter 关闭:

spring.mvc.formcontent.putfilter.enabled = false

org.springframework.web.filter.HiddenHttpMethodFilter

  • 引入版本

org.springframework.web.filter.HiddenHttpMethodFilter 由 Spring
Framework 3.0 版本引入,分发在 org.springframework:spring-web 中。

  • 使用场景

当 Web 服务端同一资源(URL)提供了多请求方法的实现,例如 URI :/update 提供了
HTTP POST 以及 HTTP PUT 实现),通常 Web 场景中,浏览器仅支持 HTTP GET
或者 POST 请求方法,这样的话,浏览器无法发起 HTTP PUT 请求。

为了浏览器可以消费 HTTP PUT 资源, 需要在服务端将 HTTP POST 转化成
HTTP PUT 请求,为了解决这类问题,Spring 引入
org.springframework.web.filter.HiddenHttpMethodFilter Web 组件。

当浏览器 发起 HTTP POST 请求时,可通过增加请求参数(默认参数名称:”_method”)
的方式,进行HTTP 请求方法切换,
org.springframework.web.filter.HiddenHttpMethodFilter 获取参数”_method”
值后,将参数值作为 HttpServletRequest#getMethod()的返回值,给后续 Servlet
实现使用。

出于通用性的考虑,org.springframework.web.filter.HiddenHttpMethodFilter
通过调用 #setMethodParam(String) 方法,来修改转换请求方法的参数名称。

Spring Boot 默认场景下,将
org.springframework.web.filter.HttpPutFormContentFilter
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 自动
装配,以下为 Spring Boot 1.4.1.RELEASE 以及更好版本定义(可能存在一定的差异):

@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class,
        WebMvcConfigurerAdapter.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
        ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

    ......

    @Bean
    @ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
    public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
        return new OrderedHiddenHttpMethodFilter();
    }

    ......

}

综上所述,org.springframework.web.filter.HiddenHttpMethodFilter 也是特殊
场景下所需,故可以关闭之。

  • 配置项

按目前最新的 Spring Boot 1.5.2.RELEASE 版本中实现,也没有提供类似
spring.mvc.formcontent.putfilter.enabled 这样的配置项关闭,无法关闭。

了解更多?

更多关于 Spring Boot Web 应用性能优化内容,请参考《Spring Boot 2.0深度实践之核心技术篇》的“第5章 Web MVC 视图应用”,其中将有系统和深入的讨论。

点赞