cxf怎样提⾼webservice性能,及访问速度调优
性能:
1、 启⽤FastInfoset(快速信息集)
webservice的性能实在是不敢恭维。曾经因为webservice吞吐量上不去,对webservice进⾏了⼀些性能⽅⾯的优化,采⽤了FastInfoset,效果很明显,极端条件下的⼤数据量传输,性能提⾼60%,他可以减少传输成本,序列化成本和xml解析成本。
Cxf提供了FastInfoset协商机制,实现类见f.feature.FastInfosetFeature,在bus中启⽤如下配置:
<cxf:features><cxf:fastinfoset force="false"/></cxf:features>
Force=false表⽰服务端和客户端第⼀次通信时会协商(通过检查标准的HTTP头的Accept字段,值为MIME类型的application/fastinfoset)是否启⽤FastInfoset⽀持,如果客户端不⽀持,则不启⽤快速信息集。
需要在pom中添加依赖:
<dependency>
<groupId>l.fastinfoset</groupId>调用webservice服务
<artifactId>FastInfoset</artifactId>
<version>1.2.9</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
client和service端都要配置
2、 启⽤gzip压缩⽀持
客户端和服务器端是否使⽤Gzip压缩,也是基于http协议协商的(检查请求header 中是否有Accept-encoding:gzip)。但是这⾥需要仔细权衡下。对于⼩数据量,启⽤gzip压缩⽀持是吃⼒不讨好的⾏为,数据量很⼩的时候,gzip压缩结果不明显,还浪费cpu。我们需要权衡数据⼤⼩,按照经验设置thresh
old为10*1024byte。
在bus中启⽤如下配置:
<bean class="ip.GZIPFeature ">
<property name="threshold"><value>10240</value></property>
</bean>
官⽅⽂档指定是是配置f.ip.GZIPFeature,但是这个类会不到,可能是官⽅⽂档年久失修,造成⼀些混乱。官⽅⽂档中也没提⽰指定threshold,请参考GZIPFeature源代码。
3、 使⽤slf4j代替cxf默认⽇志组件
CXF 默认使⽤java.util.logging作为⽇志打印组件,其性能我就不过多评价,也不太便于我们做统⼀⽇志管理。⽬前系统使⽤的slf4j作为⽇志打印组件,替换如下:
在classpath中加⼊META-INF/cxf/f.Logger⽂件,⽂件内容为
fmon.logging.Slf4jLogger
4、 测试中启⽤⽇志
bus中加⼊<cxf:logging/>,请在测试环境中启⽤有助于debug
补充:
1、如何⾃定义返回码:
请求在service中处理遇到异常后,会调⽤请求链中所有的handleFault⽅法,参考
PhaseInterceptorChain#unwind,然后判断请求是否单向请求,如果不是,则构建异常请求链,并构建异常message对象,调⽤异常请求链中的handleMessage ⽅法(参考:AbstractFaultChainInitiatorObserver)
JAXWSMethodInvoker转发soap请求到指定对象的⽅法,如果在请求处理失败,调⽤updateHeader⽅法,把请求时的soap header放⼊返回header中。但是不同通过继承JAXWSMethodInvoker来实现清除异常时soap header也返回给客户端的问题,因为JAXWSMethodInvoker没有采⽤注⼊的机制(JaxWsServerFactoryBean#createInvoker)也没有chain.异常时,会由这些处理返回请求:
setup [ServerPolicyOutFaultInterceptor]
prepare-send [MessageSenderInterceptor, Soap11FaultOutInterceptor]
pre-stream [LoggingOutInterceptor, StaxOutInterceptor]
pre-protocol [WebFaultOutInterceptor]
write [SoapOutInterceptor]
初始化类OutFaultChainInitiatorObserver
我们可以在异常链中加⼊清理soap header的SoapHeaderOutFilterInterceptor,清理掉在系统异常时soapheader中有信息的问题。
返回错误状态码,在执⾏Soap11FaultOutInterceptor中被写死。
message.put(f.message.Message.RESPONSE_CODE, new Integer(500));
为了使返回数据中有错误码,需要在Soap11FaultOutInterceptor后⾯加⼊
<import resource="classpath:META-INF/l" />并且在依赖中加⼊:
<dependency>
<groupId>f</groupId>
<artifactId>cxf-rt-javascript</artifactId>
<version>2.4.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论