• 【Microsoft Azure学习之旅】Azure Java SDK


      [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的回复:

         

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

     

  • 相关阅读:
    HTML和CSS
    springcloud中配置多数据源
    洛谷 P3800 Power收集(单调队列优化dp)
    洛谷 P2569 [SCOI2010]股票交易(单调队列优化dp)
    洛谷 P3957 [NOIP2017 普及组] 跳房子(二分,单调队列优化dp)
    洛谷 P1419 寻找段落(01分数规划,实数二分,单调队列)
    Prometheus(普罗米修斯)和grafana监控的安装和使用
    AMC如何管理NPL
    linux 正则表达式与字符处理
    react-router-dom switch & match
  • 原文地址:https://www.cnblogs.com/KevinSong/p/4146811.html
Copyright © 2020-2023  润新知