Windows Azure服务总线的AMQP支持发布声明
[原文发表地址] Announcing the release of AMQP support with Windows Azure Service Bus
[原文发表时间] 2013-5-23 7:42 AM
在过去的五年中,微软和其他公司一起致力于开发高级消息队列协议(AMQP)标准。这20多家公司包括技术供应商,有红帽、威睿,及像摩根大通、瑞士信贷一样的企业。目标是建立一个开放的、线级的消息传送协议标准,使不同的供应商之间的互操作更加简单。回到2012年十月,OASIS标准组织宣布通过AMQP 1.0为OASIS标准,在同一天,我们发布了执行AMQP1.0的Windows Azure服务总线的预览。
今天,我很高兴地宣布AMQP 1.0支持在Windows Azure服务总线已经发布,并正式供应(GA)--它已经可以实际投入应用,为企业SLA支持。
可互操作的消息
这次发布意义重大。随着支持AMQP 1.0,你现在可以使用Windows Azure服务总线来创建这样的应用程序,它可以使用各种各样的消息库、使用不同的语言或者在不同的操作系统上运行—现在都可以使用高效的、二进制、线级协议来进行通信。
因为AMQP 1.0定义了一种可移植的数据表现形式,这意味着从.NET程序发送到服务总线的消息可以被Java程序或者Python/Ruby/PHP脚步读取而不丢失任何结构或消息内容。在Java中,标准的Java消息服务(JMS)API是支持的,因此可以直接把已存在的Java应用程序从任何其它的JMS提供端移植到服务总线。
最终的结果是产生了强力的中间件,可以用来创建分布式系统,将跨内部部署/云环境或者跨多个云提供商运行的应用程序连为一体。
演示如何使用AMQP来创建一个Pub/Sub解决方案
为了突出使用这个新的信息支持是多么的容易,我将演示如何创建一个简单的.NET控制台应用程序,它采用发布/订阅消息模式来发送消息到由Java,Python和PHP编写的接收端应用程序。Windows Azure服务总线现在提供了pub/sub消息传递所有必要的支持,以便于使用开放的AMQP协议和已经存在的消息传递框架。
.NET发送端应用程序将消息发送给服务总线“主题”--是持久的消息传递中介。不像队列,队列中的每一个消息由单个消费者应用程序处理,而主题提供一对多的窗体通信,采用发布/订阅模式。它允许注册多个订阅到主题—当一个消息发送到主题时,每个订阅可以独立处理该消息。
你可以把每个订阅想象为虚拟的持久队列,它接收发送给主题的消息副本。你可以选择为主题上的任何订阅注册过滤规则,允许主题订阅过滤/限制接收发送给主题的消息。使你能够跨越大数量的用户和应用程序选择性处理大数量的消息。
在这个方案中我们将让.NET控制台应用程序发送消息到“scottmessages”主题,然后为这三个监听应用程序设置各自的订阅分别由Java 、Python和PHP编写--来接收并处理消息。
步骤1 :创建一个服务总线主题和三个订阅
我们的第一步是使用Windows Azure门户来创建服务总线主题。
我们将在“scottgu-ns”命名空间中创建一个主题 “scottmessages”。Windows Azure管理门户使这很容易做--只要单击“新建”按钮和导航到应用程序服务(App Services)->服务总线(Service Bus)->主题(Topic)->快速创建选项(Quick Create option)(你也可以以编程的方式和命令行来创建):
一旦“scottmessages”主题创建好,我们点进去就看到一个熟悉的Windows Azure监测仪表盘视图:
然后我们将为主题创建三个订阅--一个对应一个我们的监听器。我们将这些命名为“java”、“python”、“php”来和每个应用程序所使用的语言对应(注意:我们可以按我们需要的任何命名--我使用这些名字只是想让它更清楚哪个对应哪个)。我们可以编程来实现,或者通过单击门户命令栏中的“创建订阅(Create Subscription)”按钮。这会弹出一个对话框让我们为我们想要创建的订阅命名:
第二个对话框屏幕允许我们自定义订阅属性像默认消息生存时间(在它被删除前停留在队列中的时间)、锁和会话设置,等等:
单击ok按钮将为我们的主题创建一个订阅。我们将重复这个步骤来再创建两个订阅,这样我们就有了我们想要的三个订阅了:
等我们做完了这个,当一条消息发送到“scottmessages”主题时它将持久的排队等候每个订阅。持久等候意味着当消息发送到后消费者应用程序不再需要积极地监听订阅。消息将自动排队等候订阅应用程序来处理当它们连接上后。这启用了一个非常强大的、松散耦合的应用架构,允许你可以跨越庞大数量用户和应用程序的选择性处理大量消息。
步骤2 : 编写 .NET发送应用程序
现在我们已经创建好了服务总线主题和订阅,我们将写一个简单的.NET应用程序来发送消息给主题。
在最近版本的服务总线.NET客户端库中AMQP是支持的,你可以通过NuGet获取到--https://nuget.org/packages/WindowsAzure.ServiceBus/.要求2.1.0版本或者更新的。只要健入“安装WindowsZaure.ServiceBus包”来下载和把它添加到你的.NET应用程序。
下面的代码是一个简单的.NET控制台应用程序提示用户在控制台应用程序输入消息内容,然后应用程序使用服务总线.NET API来发送每个用户输入的消息到我们上面创建的“scottmessages”服务总线主题:
上面的代码是使用NET的ConnectionManaer类从app.config文件中导入配置设置。我使用这种方法来获得我
们的服务总线主题的连接字符串(并避免在代码中的硬编码)。这是我用来指定字符串的App.cofig文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="Microsoft.ServiceBus.ConnectionString"
value="Endpoint=sb://scottgu-ns.servicebus.windows.net/;SharedSecretIssuer=owner;
SharedSecretValue=sSDdaewGUo3/wsaewtjhELlCi1y3SRwjFMX01tz2c/AXw=;TransportType=Amqp" />
</appSettings>
</configuration>
注意:你可以在Windows Azure门户中获取服务总线主题的连接字符串,通过选中主题( Topic )然后
单击在门户下方命令栏里的“访问密钥( Access Key )”按钮。需要注意的是配置.NET客户端库使用
AMQP ,我追加“ ;TransportType=Amqp ”到连接字符串中。
运行控制台应用程序
现在让我们一起运行.NET控制台应用程序。点击F5生成一个控制台应用程序,我们现在可以键入消息发送到主题。这儿是一些简单的输入:
上面输入的每一条消息被发送到服务总线主题--它将在我们创建的来处理消息的三个订阅中依次生成一个消息副本来持久排队。
步骤3 : 编写一个Java应用程序监听器
现在让我们一起来编写一个java应用程序,它将会连接到其中的一个订阅并且处理消息。
在Java中标准的消息API是JMS—Java消息服务。JMS不指定任何关于底层的传输,因此不同的JMS产品使用不同的协议来和它们各自的消息代理交流。我将使用Apache的一个标准JMS提供程序,它使用AMQP 1.0作为底层的协议。使用这个库,Windows Azure服务总线变成了一个开放的标准JMS提供程序!
你可以在https://people.apache.org/~rgodfrey/qpid-java-amqp-1-0-client-jms.html获取Apache AMQP提供程序。下列的四个分布存档的JAR文件需要添加到你的Java类路径(CLASSPATH),当生成和运行应用程序的时候会使用到:
- geronimo-jms_1.1_spec-1.0.jar
- qpid-amqp-1-0-client-[version].jar
- qpid-amqp-1-0-client-jms-[version].jar
- qpid-amqp-1-0-common-[version].jar
我们然后可以编写后面的Java代码,那将使用标准的 JMS通信API来连接到我们的服务总线订阅和处理队列中的消息:
请注意Apache JMS提供程序使用一个简单的基于JNDI提供程序的文件来配置JMS“管理的对象”,包括连接的细节和消息实体的物理命名的映射逻辑。这是我使用的servicebus.properties文件,它将连接字符串细节嵌入到Windows Azure服务总线主题:
connectionfactory.SBCF = amqps://owner:sSDdaYGUo3%2FwpewtjhELlCi1y4SSwjFGX01tz2c%2FAXw%3D@scottgu-ns.servicebus.windows.net
topic.EntityName = scottmessages
此属性文件定义了一个ConnectionFactory “SBCF”,它包含了从服务总线连接字符串的构成部分。格式如下所示:
amqps://[username]:[password]@[namespace].servicebus.windows.net
在上面的格式中,[username]对应发布者,[password]是一个发布者密钥的URL编码格式。你必须手动将发布者密钥的URL编码化。一个有用的URL编码工具在https://www.w3schools.com/tags/ref_urlencode.asp。
运行Java 应用程序
当我们运行这个应用程序,它将连接到我们的服务总线主题的“Java”订阅和产生下面的输出:
Receiving messages. Press enter to stop.
Message From Scott > Red Shirts are cool
Message From Scott > Cross-platform messaging is so simple with AMQP and Service Bus
Message From Scott > Windows Azure Rocks!
Shutting down.
请注意我们使用.NET发送到主题的消息如何被Java应用程序无缝的处理掉!
流行的Java框架像Spring和JEE使用JMS来集成不同的通信系统--你现在可以使用这些框架编写组件,由Windows服务总线来驱动通信系统,一样无缝的互操作和集成其它语言和框架。
步骤4 :创建一个Python应用程序监听器
现在让我们一起编写一个Python应用程序,它将连接到另一个订阅并且处理消息。我们将Python应用程序托管在Linux虚拟机上。
我们可以使用Windows Azure可以非常容易得创建Linux虚拟机。只要在门户选中新命令(New command),使用电脑(Computer)->虚拟机(Virtual Machine)->快速创建选项来创建一个CentOS虚拟机(Quick Create option to create a CentOS virtual machine):
一旦虚拟机预备我们可以SSH到它来配置和安装程序。
在我们的Linux虚拟机上安装Proton库
针对Python和PHP应用程序,我们将使用Apache的Proton客户端库,可以在https://qpid.apache.org/proton/download.html下载。Proton库提供一个AMQP 1.0组件库,我们将用它来和Windows Azure服务总线通信。Proton分布文档的README文件详细介绍了安装依赖项和生成Proton需要的步骤。这是我使用Linux虚拟机命令行的操作步骤的总结:
1)编辑yum配置文件(/etc/yum.conf)和注释掉排除核心头部更新((# exclude=kernel*)。这是安装gcc编译器必需要做的
2)安装各种必备包:
>> yum install gcc cmake libuuid-devel
>> yum install openssl-devel
>> yum install swig python-devel ruby-devel php-devel java-1.6.0-openjdk
>> yum install epydoc
3)下载Proton库
>> wget https://www.bizdirusa.com/mirrors/apache/qpid/proton/0.4/qpid-proton-0.4.tar.gz
4)从分布存档中提取Proton代码
>> tar -xvf qpid-proton-0.4.tar.gz
5)使用下面的步骤生成和安装代码,采取自README文件
在你找到README文件的路径下运行:
mkdir build
cd build
# Set the install prefix. You may need to adjust depending on your
# system.
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
# Omit the docs target if you do not wish to build or install
# documentation.
make all docs
# Note that this step will require root privileges.
sudo make install
做完这一切,Proton将会安装在机器上和准备好供您使用。这是我编写用来接收来自我们Windows Azure 服务总线主题“python”订阅消息的Python代码:
import sys
from proton import Messenger, Message
broker = "amqps://owner:sSDdaYHUo3/wpewtjhEDlCi1y6SRwjFMX01tz2c/AXw=@scottgu-ns.servicebus.windows.net"
entityName = "scottmessages/Subscriptions/python"
messenger = Messenger()
messenger.subscribe("%s/%s" % (broker, entityName))
messenger.start()
msg = Message()
while True:
messenger.recv(10)
while messenger.incoming:
try:
messenger.get(msg)
except Exception, e:
print e
else:
print "Message From Scott > %s" % msg.body
messenger.stop()
print "Done"
以上需要注意的几件事:
- 连接代理的字符串是这格式
amqps://[issuer-name]:[issuer-key]@[namespace].servicebus.windows.net
- 我们接收消息的实体名字(entityName)是这格式
[topic-name]/Subscriptions/[subscription-name]。
现在当我们运行上面的python脚本(从我们的Linux虚拟机)我们将使用AMQP连接到Windows Azure服务总线,可以看到从我们的.NET应用程序发布的消息:
其中一件真的非常酷的事情是上面的应用程序是使用Python在Linux虚拟机上运行,它利用开源的AMQP库,且只使用了开放的AMQP协议来和Windows Azure 服务总线消息系统通信。
步骤5 :创建一个PHP应用程序监听器
现在让我们一起完成编写PHP应用程序,连接到我们最后的主题订阅并且处理消息。我们将这个PHP应用程序托管在上面我们使用的同一台Linux虚拟机上,使用Python使用的同一个Proton库。这是在PHP中使用的代码:
这是当我们在Linux虚拟机上运行命令行时输出的内容:
总结
以上的例子演示了使用开放的AMQP协议连接到Windows Azure服务总线是如何的简单及现有的AMQP 1.0已为各个团体所支持。
新的AMQP支持在Windows Azure服务总线将使生成功能强大的分布式应用程序更加简单,实现跨多系统并互操作。和上面的一样一件很酷的值得注意的事是,因为它是在不同语言之间交换的,消息是如何保存的。此示例使用的是简单的文本字符串作为主体,但是同样也适用于更复杂的消息格式,包括列表和映射。AMQP 1.0可移植数据表现形式实现了这一点。
在这里有一些关于服务总线支持AMAP 1.0更多的信息连接:
- David Ingham关于服务总线的演讲和AMQP 1.0 在2012//build/ conference
如果你还没有一个Windows Azure账号,你可以免费尝试注册一个并今天就开始使用以上所讲的所有特性。
希望这对会你有所帮助,
Scott
除了博客,我也在使用推特快速更新和共享链接。关注我:twitter.com/scottgu