细数跨语言通信的选择

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

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

一. 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

你可能感兴趣的:(socket,cli,SOAP,XML-RPC,message queue)