导语:如今我们构建了整个互联网后端架构,跨语言通信需求非常多,比如原有的系统是用Java开发的,但是在一些非常适合Node.js发挥场景的地方又要使用Node.js来开发,而两者之间的通信方法也有多种,目前跨语言最流行和轻量级的通信方式就是用HTTP的RESTful,也可以选择性能更好的Thrift。

关于HTTP协议通信的优点和缺点,本文不做阐述,本文主要介绍如何通过RabbitMQ这个媒介,让Node.js和Python建立起通信的桥梁。

我们还是从最简单的入手 以Node.js端作为生产者,通过RabbitMQ消息队列发送一个Hello World,然后以Python端作为消费者,打印这个Hello World字符串。 把Python作为跨语言通信实例的语言,有几方面考虑。

Python是各个Linux流行的发行版本自带的语言,CentOs或Ubuntu都会 z在系统中预装Python语言,大部分是2.6.x或2.7.x版本,所以在Linux上运行这个实例就非常简单,不需要安装其他语言环境。 Python语言以简洁闻名,就算你没有任何Python基础,凭借其他语言 z的开发经验,仍然能够很轻松地读懂Python,所以没有接触过Python也没关系,看着代码大致是能够看懂流程的。 RabbitMQ官方提供的示例,默认就是Python语言,所以拿Python作为 z实例更贴切不过。

我们先看生产者Node.js的代码,套用第一个例子,保存为send.js。

接下来看看消费者Python的代码,在运行Python之前,需要安装Python的RabbitMQ连接客户端pika。我们分别执行如下命令,安装Python的Pip(和Node.js中的Npm一样,是包管理软件),然后通过Pip安装pika。

现在贴上Python端的代码,保存为receive.py,然后把它运行起来。

(1)引入pika包,和Node.js的require功能相同。

(2)建立连接,然后返回连接对象。

(3)声明一个频道channel,和Node.js的用法相同。

(4)对这个频道声明队列,对名字和Node.js声明的相同,都是hello。

(5)定义消费的回调函数,和Node.js定义回调函数相似,只不过Python不支持像Node.js那样的匿名函数写法,需要定义一个变量。

(6)声明消费。

(7)开始执行消费,这里也是类似事件循环的机制,当有消息推送到达时,就会触发消费事件,执行callback函数了。

(8)因为第7步进入了事件循环,所以第8步的打印信息永远不会被输出。

运行脚本和Node.js也一样,直接输入如下命令。

启动Node.js,向Python发送消息。

这时Python端就会收到信息,然后打印这条消息的内容。

通过这个简单的实例,我们可以扩散出很多利用RabbitMQ跨语言通信的消息队列,比如带路由的、带消费者响应的队列,等等。总之,有了RabbitMQ,跨语言异步通信将不再是问题了。