【Microsoft Azure學習之旅】Azure Java SDK - Service Bus的認證問題

  [2014年12月12日增長備註:12月10日,Microsoft Azure Java SDK team發佈了v0.7.0版本,增長對Service Bus SAS的支持,已解決這個問題:-)]java

  最近在研究Microsoft Azure,在分佈式消息傳遞上,Amazon的AWS有SQS,而在Microsoft Azure上與之對應的是Service Bus Queuegit

  Service Bus隊列(Queue)的做用是,在分佈式應用程序的組件通訊時,組件間不會直接相互通訊,而是經過充當中介的隊列交換消息。這樣能夠更好地向外擴展應用程序,並加強體系結構的恢復能力,由於消息會被可靠的保存在隊列中,不會因一方崩潰而丟失消息。github

  值得注意的是,Azure還有另一種Queue,屬於存儲Storage部分,叫作Azure Queue,通過對比,因爲Service Bus除Queue外還包括主題Topic\訂閱Subscription功能,所以更能引發個人興趣,知足需求,具體他們之間的區別可看微軟文檔:http://msdn.microsoft.com/library/azure/hh767287,很是詳細。shell

  微軟針對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。this

   可是問題出如今,Azure Java SDK仍在使用ACS的認證方式,上一個版本的Release在2014年8月4日,當時可能微軟Azure Portal還未改變認證方式。這就致使了問題的出現,使用Java SDK沒法完成認證。spa

 

二. 解決方案code

   通過在網上查找信息,在Github上查找相關問題,以及在MSDN上提問,目前的解決方案有如下4種,若是你仍想用Java編程的話。

   1. 等待微軟官方的下一個Java SDK Release版本,最新的版本是2014年8月4日,v0.6.0。如下截圖是微軟Support的回覆:

     

     具體下一版本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

相關文章
相關標籤/搜索