读书人

Spring HttpInvoke兑现以及效率提升

发布时间: 2012-10-13 11:38:17 作者: rapoo

Spring HttpInvoke实现,以及效率提升!
最近接手服务器总被人质疑效率问题,说到底是质疑Spring HttpInvoke的效率问题。好在经过同事们的努力,找到了问题的根源,最终解决了这个问题。
我也顺道整理一下Spring HttpInvoke——那曾经最为熟悉的东西。
Spring HttpInvoke,一种较为常用的、基于Spring架构的服务器之间的远程调用实现,可以说是轻量级的RMI。
最初,我们使用Spring HttpInvoke同步配置数据,刷新多个服务器上的缓存,当然如果用分布式缓存是不是更好
使用Spring HttpInvoke,你可以调用远程接口,进行数据交互、业务逻辑操作等等。
废话不说了,上代码!
用户操作接口:


只把用户信息打出来即可说明调用效果!
看applicationContext.xml

我们要把userService暴露出去,这样外部就可以通过http接口调用这个接口的实现了。
说说HttpInvokerServiceExporter,这个类用来在服务器端包装需要暴露的接口。
熟悉service,定义具体的实现类!

熟悉serviceInterface指向需要暴露的接口,注意使用value标注接口名称!

最后再看servlet.xml配置

直接将请求指向刚才配置的userService
现在我们之间访问一下http://localhost:8080/spring/service/

这就说明,服务器端配置已经成功了!如果在日志中频繁得到这种异常,那很可能服务器被恶意访问了!
再看客户端实现:

我们做了什么?Nothing!就跟调用一般Spring容器中的实现一样!
再看applicationContext.xml:

这里我们可以通过Spring容器调用userService,而实际上,他是一个HttpInvokerProxyFactoryBean,在这个配置里,定义了访问地址serviceUrl,和访问接口serviceInterface。
执行测试!

如果我们这样写,其实默认调用了SimpleHttpInvokerRequestExecutor做实现,这个实现恐怕只能作为演示来用!
这也是效率问题所在!!!
为提高效率,应该通过Commons-HttpClient!
我们需要做什么?导入这个jar,改改xml就行!

通过HttpClient,我们可以配置超时时间timeout和连接超时connectionTimeout两个属性,这样,服务器执行操作时,如果超时就可以强行释放连接,这样可怜的tomcat不会因为HttpInvoke连接不释放而被累死!
回头看了一眼我N多年前的代码,万岁,我当时确实是这么实现的!好在没有犯低级错误!!!
执行操作!

这时,转为org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor实现了!
不过同事认为,这个效率还是不够高!!!
再改,改什么?还是xml!

改用MultiThreadedHttpConnectionManager,多线程!!!
测试就不说了,实践证明:
默认实现,服务器平均10s左右才能响应一个请求。
多线程实现,服务器平均20ms左右响应一个请求。
这简直不是一个数量级!!!

注意:在HttpClient的3.1版本中,已不支持如下配置,相应的方法已经废弃!


如果仔细看看文档,


默认啥情况?
赶紧记下来,供大家参考!
详情见附件!
许久没写博客了,今天终于舒展了一把!
4 楼 newwpp 2010-12-23 受用 正好用到 5 楼 qkjava 2011-01-05 这个为工程与项目间的关系,既代码的模块化提供了一个很好的解决方案。
如果我们把代码归为工程,而市场认为是个项目的话。
市场所推的一个项目由若干个 工程模块来组成。
它比webservice更好的解决模块化问题。
6 楼 wu_yong988 2011-03-30 不错,楼主,学习啦 7 楼 icur 2011-04-27 楼主写的不错哦

读书人网 >软件架构设计

热点推荐