Windows Azure Platform有Windows Azure、SQL Azure、Azure AppFabric三部分。
使用AppFabric,可以轻松将内部部署应用程序与云连接。通过在内部部署的IT应用程序和基于云的服务之间启用安全连接和消息传送,AppFabric提供标识管理和防火墙友好的消息传送,从而保护您的资产。
这节我们体验Azure AppFabric,必备软件:
- Microsoft Visual Studio 2010
- Windows Azure AppFabric SDK
- Windows Azure Platform账户
这次体验有下面几个步骤,分别是:
创建AppFabric项目
AppFabirc由Service Bus和Access Control Service组成,为了使用这些功能和特性,我们必须创建一个Service Project。
首先我们使用账号登录Azure AppFabric门户,网址为http://appfabric.azure.com,你可以看到下面页面,当前没有创建任何服务空间,我们需要添加一个服务空间。服务空间为暴露于Service
Bus的应用程序定义了应用程序边界,以及用来为应用程序构建Service Bus端点。我们点击“Add Service Namespace”:
进入创建服务空间页面,输入服务空间名称、选择区域,选择服务总线连接包,可选0、5、25、100、500连接数。然后点击“Create”按钮:
激活服务时请耐心等待,可能需要数分钟时间。一旦命名空间被激活,便出现在可用服务空间列表上。
我们可以在可用服务空间列表上点击刚刚创建的服务空间,显示服务空间信息页面:在服务命名空间信息页面,我们需要记录下Default Issuer Name和Default Issuer Key。接下来会使用到它们。
体验AppFabric Service Bus
这个示例演示了Client向Service发送消息,Service以相同的消息进行回应。展示了Service Bus如何在不同网络环境中的不同程序进行通信。
原理
我们首先了解这个程序的运作原理:
步骤1,2,4,5是利用AppFabric中的Access Control服务用来确保安全性。
步骤3是服务器程序与云端建立连接的过程。步骤6,7,8,9是客户端调用服务的过程。
Service Bus通过为服务提供了一套通用的命名规范简化了许多通信难题,在独立于网络拓扑和配置的节点之间提供直接或间接的通信。Service Bus允许WCF应用程序监听公共网络地址,即使其位于NAT或网络防火墙后方。该功能使得应用程序的通信可以无关于其网络结构。使用Service Bus便无需编写与维护复杂的逻辑和代码来跨越不同的网络通信。
代码
我们创建一个WCF服务和一个客户端,两者通过云端的Service Bus交互。解决方案项目结构如下:
注意,都需要引用System.ServiceModel.dll和Microsoft.ServiceBus.dll程序集。前者为WCF的核心程序集之一。后者在%ProgramFiles%\Windows Azure AppFabric SDK\V1.0\Assemblies\NET4.0中。
服务器端:
//WCF的服务契约 [ServiceContract] public interface IAppFabricServiceBusContract { //定义了Hello操作契约,指明该方法为服务契约的一部分 [OperationContract] string Hello(string text); } //实现WCF的服务契约 [ServiceBehavior] public class AppFabricServiceBusService : IAppFabricServiceBusContract { public string Hello(string text) { Console.WriteLine("客户端请求: {0}", text); return text; } }
配置WCF服务
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="HelloAppFabricServiceBus.Service.AppFabricServiceBusService"> <endpoint binding="netTcpRelayBinding" contract="HelloAppFabricServiceBus.Service.IAppFabricServiceBusContract" /> </service> </services> </system.serviceModel> </configuration>
主方法
//通过AppFabric Service Bus来托管服务 static void Main() { //基于服务命名空间来创建服务URI var address = ServiceBusEnvironment.CreateServiceUri("sb", "[Service Namespace]", "AppFabricServiceBusService"); //为端点(endpoint)创建凭据对象(credential object) var sharedSecretServiceBusCredential = new TransportClientEndpointBehavior { CredentialType = TransportClientCredentialType.SharedSecret }; sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = "[Issuer Name]"; sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = "[Issuer Key]"; //创建会读取配置文件的服务宿主(service host) var host = new ServiceHost(typeof(AppFabricServiceBusService), address); //为端点创建ServiceRegistrySettings行为 var serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public); //为配置文件中所有端点加入Service Bus凭据 foreach (var endpoint in host.Description.Endpoints) { endpoint.Behaviors.Add(serviceRegistrySettings); endpoint.Behaviors.Add(sharedSecretServiceBusCredential); } //打开服务 host.Open(); Console.WriteLine("服务地址: " + address); Console.WriteLine("按[Enter]键关闭宿主服务"); Console.ReadLine(); //关闭服务 host.Close(); }
客户端:
//WCF的服务契约 [ServiceContract] public interface IAppFabricServiceBusContract { [OperationContract] string Hello(string text); }
配置
<?xml version="1.0"?> <configuration> <system.serviceModel> <client> <endpoint name="RelayEndpoint" contract="HelloAppFabricServiceBus.Client.IAppFabricServiceBusContract" binding="netTcpRelayBinding"/> </client> </system.serviceModel> </configuration>
主方法
//使用通过AppFabric Service Bus托管的WCF服务 static void Main() { //基于服务命名空间来创建服务URI var serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", "[Service Namespace]", "AppFabricServiceBusService"); //为端点(endpoint)创建凭据对象(credential object) var sharedSecretServiceBusCredential = new TransportClientEndpointBehavior { CredentialType = TransportClientCredentialType.SharedSecret }; sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = "[Issuer Name]"; sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = "[Issuer Key]"; //创建读取配置文件的信道工厂(channel factory) var channelFactory = new ChannelFactory<IAppFabricServiceBusContract>("RelayEndpoint", new EndpointAddress(serviceUri)); //应用Service Bus凭证 channelFactory.Endpoint.Behaviors.Add(sharedSecretServiceBusCredential); //创建并打开客户端信道 var channel = channelFactory.CreateChannel(); ((ICommunicationObject)channel).Open(); Console.WriteLine("输入文字(或者按[Enter]键关闭连接):"); var input = Console.ReadLine(); while (input != String.Empty) { try { Console.WriteLine("服务器返回: {0}", channel.Hello(input)); } catch (Exception e) { Console.WriteLine("错误: " + e.Message); } input = Console.ReadLine(); } ((ICommunicationObject)channel).Close(); channelFactory.Close(); }
测试
注意你需要将Service Namespace,Issuer Name和Issuer Key替换你的,这些都是基于Azure付费账户。
先启动Service,在启动两个Client,测试,我们可以看到它们之间的交互了。
好了,Windows Azure Platform的三部分我们稍微体验了一番,以后有机会在说说更深入的内容。
版权声明:本文为博主http://www.zuiniusn.com 原创文章,未经博主允许不得转载。