浅谈Spring Boot Web 应用性能优化
默认情况下,SpringBootWeb应用会装配一些功能组件Bean。
在大多数Web应用场景下,可以选择性地关闭一下自动装配的Spring组件Bean,以达到提升性能的目的。
配置项优化
SpringBootWeb应用加速完整配置项
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请求,通过ServletFilterorg.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
可关闭ServletWeb组件
org.springframework.web.filter.HttpPutFormContentFilter
引入版本
org.springframework.web.filter.HttpPutFormContentFilter由SpringFramework3.1版本引入,分发在org.springframework:spring-web中。
使用场景
通常Web场景中,浏览器通过HTTPGET或者POST请求提交Form数据,而非浏览器客户端(如应用程序)可能通过HTTPPUT请求来实现。
当HTTP请求头Content-Type为application/x-www-form-urlencoded时,Form数据被encoded。而Servlet规范中,ServletRequest.getParameter*()方法仅对HTTPPOST方法支持请求参数的获取,如:
publicintetfacceServletRequest{ ...... publicStringgetParameter(Stringname); publicEnumerationgetParameterNames(); publicString[]getParameterValues(Stringname); publicMap getParameterMap(); ...... }
故以上方法无法支持HTTPPUT或HTTPPATCH请求方法(请求头Content-Type为application/x-www-form-urlencoded)。
org.springframework.web.filter.HttpPutFormContentFilter正是这种场景的解决方案。
SpringBoot默认场景下,将org.springframework.web.filter.HttpPutFormContentFilter被org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration自动装配,以下为SpringBoot1.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}) publicclassWebMvcAutoConfiguration{ ...... @Bean @ConditionalOnMissingBean(HttpPutFormContentFilter.class) @ConditionalOnProperty(prefix="spring.mvc.formcontent.putfilter",name="enabled",matchIfMissing=true) publicOrderedHttpPutFormContentFilterhttpPutFormContentFilter(){ returnnewOrderedHttpPutFormContentFilter(); } ...... }
综上所述,org.springframework.web.filter.HttpPutFormContentFilter在绝大多数Web使用场景下为非必须组件。
配置项
如果应用依赖SpringBoot版本为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由SpringFramework3.0版本引入,分发在org.springframework:spring-web中。
使用场景
当Web服务端同一资源(URL)提供了多请求方法的实现,例如URI:/update提供了HTTPPOST以及HTTPPUT实现),通常Web场景中,浏览器仅支持HTTPGET或者POST请求方法,这样的话,浏览器无法发起HTTPPUT请求。
为了浏览器可以消费HTTPPUT资源,需要在服务端将HTTPPOST转化成HTTPPUT请求,为了解决这类问题,Spring引入org.springframework.web.filter.HiddenHttpMethodFilterWeb组件。
当浏览器发起HTTPPOST请求时,可通过增加请求参数(默认参数名称:"_method")的方式,进行HTTP请求方法切换,
org.springframework.web.filter.HiddenHttpMethodFilter获取参数"_method"值后,将参数值作为HttpServletRequest#getMethod()的返回值,给后续Servlet实现使用。
出于通用性的考虑,org.springframework.web.filter.HiddenHttpMethodFilter通过调用#setMethodParam(String)方法,来修改转换请求方法的参数名称。
SpringBoot默认场景下,将org.springframework.web.filter.HttpPutFormContentFilter被org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration自动装配,以下为SpringBoot1.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}) publicclassWebMvcAutoConfiguration{ ...... @Bean @ConditionalOnMissingBean(HiddenHttpMethodFilter.class) publicOrderedHiddenHttpMethodFilterhiddenHttpMethodFilter(){ returnnewOrderedHiddenHttpMethodFilter(); } ...... }
综上所述,org.springframework.web.filter.HiddenHttpMethodFilter也是特殊场景下所需,故可以关闭之。
配置项
按目前最新的SpringBoot1.5.2.RELEASE版本中实现,也没有提供类似spring.mvc.formcontent.putfilter.enabled这样的配置项关闭,无法关闭。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。