默认状况下,Spring Boot Web 应用会装配一些功能组件 Bean。java
在大多数 Web 应用场景下,能够选择性地关闭一下自动装配的Spring 组件 Bean,以达到提高性能的目的。nginx
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
org.springframework.boot.actuate.autoconfigure.TraceWebFilterAutoConfiguration
顾名思义,该自动装配用跟踪 Web 请求,经过Servlet Filter org.springframework.boot.actuate.trace.WebRequestTraceFilter
记录请求的信息(如:请求方法、请求头以及请求路径等),其计算的过程存在必定的开销,使用场景罕见,故可选择关闭。web
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
spring.autoconfigure.exclude = org.springframework.boot.actuate.autoconfigure.TraceRepositoryAutoConfiguration
org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration
该组件将自动装配org.springframework.boot.actuate.autoconfigure.MetricsFilter
,该 Filtersegmentfault
主要记录Web 请求结果指标(如:相应状态码、请求方法执行时间等),该信息必定程度上与反向代理服务器(nginx)功能重叠,故可选择关闭。浏览器
spring.autoconfigure.exclude = org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration
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-Type
为 application/x-www-form-urlencoded
时
,Form 数据被 encoded。而 Servlet 规范中, ServletRequest.getParameter*()
方法仅对 HTTP POST
方法支持请求参数的获取,如:websocket
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
)。mvc
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 应用性能优化内容,请参考《Java 微服务实战系列课堂》,其中将有系统和深刻的讨论。