细数跨语言通信的选择

前端之家收集整理的这篇文章主要介绍了细数跨语言通信的选择前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

对编程语言的选择的规则其实很简单,优先选用自己或者团队熟悉的语言,优先选择项目中用到开源产品稳定版本所用的语言。

为了提高开发效率,需要融合不同语言。回顾以前项目中用到的几种不同语言间通信的几种方式:

一. XML-RPC 可能是应用最广泛的方法

使用 HTTP 协议,通过向远程服务发送方法请求,获取处理结果。其中请求发送的内容为 XML 格式:

<?xml version="1.0"?>
<methodCall>
  <methodName>examples.getStateName</methodName>
  <params>
    <param>
        <value><i4>40</i4></value>
    </param>
  </params>
</methodCall>

和XML-RPC 类型的还有 JSON-RPC ,顾名思义通信内容使用 JSON 格式。

发送 XML-RPC 或者 JSON-RPC 请求可以简单的用 HTTP 发送拼接的请求内容,比如 PHP 中可以用 Curl 发送请求,接收处理结果。

二. SOAP也是使用 HTTP 协议进行通信

SOAP 请求的例子:

POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 299

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Header>
  </soap:Header>
  <soap:Body>
    <m:GetStockPrice xmlns:m="http://www.example.org/stock">
      <m:StockName>IBM</m:StockName>
    </m:GetStockPrice>
  </soap:Body>
</soap:Envelope>

SOAP 和 XML-RPC 的主要区别在于可以通过调用远程 WSDL 文件获取远程服务的方法。而且扩展了对 HTTP HEADER 的使用。使用 .NET 可以轻松的创建一个 SOAP 服务以供调用。同 XML-RPC 一样,在 PHP 中可以用 CURL 直接发送 HTTP 请求。

三. Socket

用 Socket 进行通信可能是最古老的方法,也是最高效的方式。

PHP 为例发送 Socket 请求:

$s = @fsockopen('127.0.0.1',1234);
fwrite($s,"addaiml\r\n");
$result= fgets($s,10);
fclose($s);

可以用几百行 JAVA 或者其他语言轻松创建一个简单的 Socket 服务来接收 Socket 请求。这里值得提出的是 memcache 的协议设计堪称典范,以前项目的的 Socket 协议设计都参考了 memcahe 的方式。

四. Message Queue

通过消息队列来进行通信,可以用现有的 message queue 中间件产品比如支持异步处理的 gearman,或者更为强大的 Rabbit-MQ,Zero-MQ。

也可以在数据库中自己建立消息表,构建简单的生产者-消费者模式,服务端定时查询数据库中的未处理消息,处理完后对消息进行标定,请求端在表中插入新消息,并且定期查询消息的状态。

五. CLI

这可能是比较土的调用其他服务的方式,虽然只支持同步的方式,但是也很有效,比如获取服务器的cpu MEMORY 等指标可以用这种方式。

PHP 为例,一切在命令行使用的命令都可以通过 exec() 函数调用,并且获取处理结果。扩展思维,一切能在命令行人工执行的命令,都可以通过此方式来执行。

PS:常见语言对于XML-RPC的支持

Python: http://docs.python.org/library/xmlrpclib.html

C++: http://libiqxmlrpc.sourceforge.net/

Erlang: http://erlang.stacken.kth.se/contrib/xmlrpc-1.13.tgz

JAVA: http://ws.apache.org/xmlrpc/

.NET: http://www.xml-rpc.net/

PHP: http://phpxmlrpc.sourceforge.net/

Ruby: http://www.ruby-doc.org/stdlib/libdoc/xmlrpc/rdoc/index.html

文章来源:http://blog.eood.cn/cross_language_communication

猜你在找的XML相关文章