返回信息流用哪个好?
(如果没有特别说明,程序实现使用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);
}
}
这是一条镜像帖。来源:北邮人论坛 / www-technology / #12160同步于 2011/1/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖
REST? XMLRPC? ProtocolBuffer?
wks
2011/1/19镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
都不必了。我重新发明轮子了。
msgpack,使用二进制格式(和json的表达能力相当),包含RPC协议及其ruby/python/java/haskell/c/c++实现。
Java实现也支持基于reflection的proxy。和我做的没有不同。
http://msgpack.org/