【Microsoft Azure学习之旅】Azure Java SDK - Service Bus的认证问题

  [2014年12月12日增加备注:12月10日,Microsoft Azure Java SDK team发布了v0.7.0版本,增加对Service Bus SAS的支持,已解决这个问题:-)]

  最近在研究Microsoft Azure,在分布式消息传递上,Amazon的AWS有SQS,而在Microsoft Azure上与之对应的是Service Bus Queue

  Service Bus队列(Queue)的作用是,在分布式应用程序的组件通信时,组件间不会直接相互通信,而是通过充当中介的队列交换消息。这样可以更好地向外扩展应用程序,并增强体系结构的恢复能力,因为消息会被可靠的保存在队列中,不会因一方崩溃而丢失消息。

  值得注意的是,Azure还有另外一种Queue,属于存储Storage部分,叫做Azure Queue,经过对比,由于Service Bus除Queue外还包括主题Topic\订阅Subscription功能,因此更能引起我的兴趣,满足需求,具体他们之间的区别可看微软文档:http://msdn.microsoft.com/library/azure/hh767287,非常详细。

  微软针对Azure提供了各种开源的SDK,包括.NET,Java,Nodejs以及其他。

 

  但是最近在写Service Bus Queue示例程序时,使用Java SDK遇到问题,Java SDK无法完成认证,也就无法操作Azure上的命名空间(Namespace)以及队列(队列属于命名空间,需要连接命名空间,完成认证,才能操作其中队列,主题等)。

 

一. 问题产生的原因

   微软前阵子改变了Service Bus命名空间的认证方式,之前是ACS,后来改成了SAS(共享访问认证),官方的解释是SAS提供了更好的性能(SAS只需提供连接字符串信息完成认证)以及其他优点,具体可参考微软文档http://blogs.msdn.com/b/cie/archive/2014/08/29/service-bus-namespace-creation-on-portal-no-longer-has-acs-connection-string.aspx。

   但是问题出现在,Azure Java SDK仍在使用ACS的认证方式,上一个版本的Release在2014年8月4日,当时可能微软Azure Portal还未改变认证方式。这就导致了问题的出现,使用Java SDK无法完成认证。

 

二. 解决方案

   经过在网上查找信息,在Github上查找相关问题,以及在MSDN上提问,目前的解决方案有以下4种,如果你仍想用Java编程的话。

   1. 等待微软官方的下一个Java SDK Release版本,最新的版本是2014年8月4日,v0.6.0。以下截图是微软Support的回复:

     【Microsoft Azure学习之旅】Azure Java SDK - Service Bus的认证问题

     具体下一版本Release的时间,我会在MSDN上提问以及私信上面这哥们。

   2. 自己重写Java SDK,因为它是开源的,本质是对Restful API的封装,但不清楚工作量,我没试过。

   3. 直接使用Restful API。

   4. Walkround方案,一种网上提出的可行方案:使用Powershell去创建Service Bus命名空间,仍会默认使用ACS。但是我今天试验了很多次,命令全部运行失败。不确定这种方法是否可行。参考文档:http://blogs.msdn.com/b/cie/archive/2014/08/29/service-bus-namespace-creation-on-portal-no-longer-has-acs-connection-string.aspx

 

三. 参考文档

   1. Azure Java SDK Github

     https://github.com/Azure/azure-sdk-for-java

   2. Service Bus namespace creation on portal no longer has ACS connection string

     http://blogs.msdn.com/b/cie/archive/2014/08/29/service-bus-namespace-creation-on-portal-no-longer-has-acs-connection-string.aspx

   3. 我在MSDN提出的问题及答复

     https://social.msdn.microsoft.com/Forums/azure/en-US/dbfdb53c-37f9-4884-8d60-4b77ad418b3a/servicebusconfigurationconfigurewithconnectionstring-cant-work-error-the-key?forum=servbus

 

四. 代码

 1 //get connection string from config file

 2 String connectionString = ConfigHandler.getConnectionString();

 3 System.out.println("Connection String: " + connectionString);

 4         

 5 //get config

 6 config = new Configuration();

 7 ServiceBusConfiguration.configureWithConnectionString(null, config, connectionString);

 8         

 9 //create service

10 service = ServiceBusService.create(config);

    运行结果:

1 Exception in thread "main" java.lang.RuntimeException: The key 'SharedAccessKeyName' is not valid for this connection string

 

  由于使用Azure Java SDK代码简单,这里就不贴全代码。具体使用方法可参照微软文档。

 

最后吐槽下,微软Azure Java SDK从2011年至今共推出19个Release版本,但是相比之下,.NET SDK推出了111个Release。What a sad story......

 

抛砖引玉。谢谢。欢迎一起讨论。

 

 

Best Regards      

Kevin Song

 

 

 

 

 

你可能感兴趣的:(Microsoft)