BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / www-technology / #12160同步于 2011/1/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖

REST? XMLRPC? ProtocolBuffer?

wks
2011/1/19镜像同步1 回复
用哪个好? (如果没有特别说明,程序实现使用java语言) 我的大概情景: 1. 我写了一个服务器程序,可以独立运行,想写个简单的网络接口,以便远程管理。 2. 网络局域网,网络很可靠,延迟也小。 3. 通信量不大,每次通信数据量也不大。不用太考虑通信效率,只要不是太过分就行。 4. 不想花费太多的代码放在服务器的网络接口上。最好把interface IMyObject {...}的.java文件拷贝到客户端的工程里,封装一下就能调用。 具体情景: 这里有3个服务器,可能会更多。 svr1: 网络蜘蛛,用于从网上到处下载网页。 svr2: 索引和搜索器。整理下载来的网页。 svr3: Web服务器,运行Tomcat,用户端。 蜘蛛需要开始、停止、设置参数、提交作业,用户通过web界面操作。(我知道heritrix有web界面,但是那东西对于我们的简单应用有点overkill了) web服务器没有搜索功能,需要发送请求给搜索服务器,返回搜索结果。 REST是Web Service常用的接口形式,基于HTTP。优点是可以利用现有的HTTP基础设施(比如代理服务器、缓存,还有各种编程语言的HTTP库)。缺点是服务器端开发稍微麻烦。对于我这种懒人不合适。 XML-RPC不错。Python标准库就有XML-RPC服务器。但是,一个好的实现不好找。Python的client/server实现都不支持HTTP/1.1的keepalive,就不用说了。Apache的WS-XMLRPC似乎假设你是在Servlet容器下使用。但是我的情景是:“一个别的服务器,里面嵌入一个web/xmlrpc/其他什么接口”,而不是“web容器里嵌入一个支持XMLRPC的服务”。 ProtocolBuffer是Google对于我的上述情形的解决方案。举的例子就是“搜索引擎,发送‘queryString, pageNumber, resultPerPage’,返回一个个结果”。二进制串行化协议,使用专用语言定义报文格式,可以生成C/Java/Python语言的报文读写代码。不过,说明书上很在意“sint32和int32”之间的性能差异(对于符号位的处理)。我看,人家毕竟是需要高性能服务的,这么在意这么一点点性能差异。我们既然都用了Java的,看样子根本没有“性能”可言了吧。 大家对这个问题怎么看? 下面是我的一个mockup (事实上已经实现了,只是有bug,不能作为最终方案)。 // In the indexer/searcher server class Searcher { ... } interface SearcherInterface { List<String> search(String query, int pageNum, int resultPerPage); } class SearcherInterfaceImpl implements SearcherInterface { private Searcher searcher; .... } class Main { public static void Main(String[] args) { Searcher searcher = new Searcher(); searcher.start(); SearcherInterface iface = new SearcherInterfaceImpl(searcher); RPCServer svr = my.library.RPCServer("locahost:9999"); // public void svr.addObject(Object obj, String name); svr.addObject(iface, "searcher"); // obj can be any object. svr.start() } } // On the WEB server <beans> <bean id="proxyFactory" class="my.library.ProxyFactory"> <property name="address" value="192.168.0.123:9999" /> </bean> ... </beans> class SearchServlet extends HTTPServlet { ProxyFactory proxyFactory; // should be injected. public void doGet(HttpServletRequest req, HttpServletResponse resp) { String query = req.getProperty("query"); // Create a proxy object. SearcherInterface s = proxyFactory.createProxy( SearcherInterface.class); // public <T> T createProxy(Class<T> cls); List<String> results = s.search(query); // Just call it as a local object. resp.getWriter().write(...); proxyFactory.closeProxy(s); } }
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
wks机器人#1 · 2011/1/28
都不必了。我重新发明轮子了。 msgpack,使用二进制格式(和json的表达能力相当),包含RPC协议及其ruby/python/java/haskell/c/c++实现。 Java实现也支持基于reflection的proxy。和我做的没有不同。 http://msgpack.org/