Windows Azure的服务总线允许在Web服务内部与外部之间做成一个公共的连接点,在无需更改企业防火墙或者其他安全配置的情况下连接内部和外部的服务

而使用Azure云服务的时候由于缩放的原因通过IP来制定连接也是不科学的,而中继服务则可以充当很好的公共连接点(当然一般建议使用更加科学的队列)

 

在Azure的服务总线中有一个叫中继服务的东西,是驻留在云端的一个帮助进行辅助连接工作的服务,把客户端的调用请求通过Azure的中继服务然后转发给服务端。

对于无论客户端还是服务端,中继服务其实更像就是一个地址,用来表示一个服务,然后大家都连接上同一个地址的话那么就可以交流沟通。

 

image

一般企业应用都会有防火墙,而企业对外提供服务的时候通常会受到防火墙的限制而不得不对防火墙做额外配置。

 

有了服务总线,则可以无需额外配置防火墙就能正常发布企业应用了。

任何模式下的中继服务,在其他模式无法使用的时候最终都会尝试使用80跟443端口进行连接,而一般的企业防火墙是不会封住这2个端口的(企业总要上网吧)

 

创建中继服务很简单,基本等效于创建服务总线,因为中继服务不能单独创建只能以编程的方式创建

创建服务总线可以在Azure门户那

image

点击 添加 然后输入命名空间,命名空间可用(没被注册那个名字)然后选择地区和订阅,在确定即创建了服务总线

创建之后

image

点击下方的 连接信息

然后找到默认颁发者和默认密钥

这个是日后连接到该服务总线的凭据,需记录下保存好。。。

 

 

下面粗略的演示下如何使用服务总线

 

以下以基于WCF为例演示如何使用服务总线进行编程

服务总线可以在Microsoft.ServiceBus.dll的程序集里找到,绝大部分的类型存在于 Microsoft.ServiceBus命名空间下。

(可在VS的引用Nuget包那找到最新版)

image

之后了解下WCF在中继服务那不是用正统的诸如wshttpbinding或者nettcpbinding一类的,而是使用了中继服务特制版的绑定。

但是中继服务很好的兼容了WCF原有的编程架构,其特制的绑定类型基本就是原本的类型后面加个relay

比如 NetTcpRelayBinding,WS2007HttpRelayBinding 等,同时也有几个中继服务特有的绑定比如 NetOnewayRelayBinding和NetEventRelayBinding等

 

使用中继服务的编程基本跟普通的WCF编程模型大部分是一样的

但也有几点不同,连接服务总线的时候先要使用前文所说的颁发者和颁发者密钥作为连接服务总线的信息(总要知道你连接的是哪一条服务总线把?)

//定义了一个TransportClientEndpointBehavior类型的RelayCredentials属性
string ownner = "ServiceBus.Issuer";
string token = "ServiceBus.IssuerToken";
//ServiceBus的令牌优先检查Azure的配置文件,如果没有读取本地的App.config(用于本地调试)
try
{
    this.issuer = RoleEnvironment.GetConfigurationSettingValue(ownner);
    this.issuertoken = RoleEnvironment.GetConfigurationSettingValue(token);
}
catch
{
    this.issuer = ConfigurationManager.AppSettings[ownner];
    this.issuertoken = ConfigurationManager.AppSettings[token];
}
RelayCredentials = new TransportClientEndpointBehavior(); //配置服务总线共享密钥
RelayCredentials.TokenProvider = TokenProvider.CreateSharedSecretTokenProvider(issuer, issuertoken);

 

由于很多使用中继服务是放在云服务上用的,所以个人一般用法是先在Role的配置文件里(cscfg)读取,如果不是云服务环境则会引发异常然后在catch里读取本地配置文件(app.config或者web.config)

读取成功了就把值通过TokenProvider.CreateSharedSecretTokenProvider(issuer, issuertoken)赋给RelayCredentials.TokenProvider

注意,这里的RelayCredentials是一个EndpointBehavior

 

有了这个之后就可以大部分的跟正常WCF一样进行编程了

 //生成ServiceHost
//ServiceInstanc是假定的服务实例
ServiceHost sh = new ServiceHost(typeof(ServiceInstance));
//服务总线的URI
//注意,除了http和https之外的所有其他协议都用sb类型
//比如net.tcp之类的都必须使用sb开头的
//三个参数分别是 协议 命名空间 服务名
//命名空间需跟申请服务总线的那个命名空间一致
Uri address = ServiceBusEnvironment.CreateServiceUri("sb", servicenNamespace, serviceName); 
//终结点添加到ServiceHost
//使用NettcpRelayBinding
//ServiceContract是假定的服务契约
sh.AddServiceEndpoint(typeof(ServiceContract), new NettcpRelayBinding(), address);
//所有终结点添加服务总线令牌
foreach (var endpoint in sh.Description.Endpoints) 
{
    endpoint.EndpointBehaviors.Add(RelayCredentials); //上部分中获得的服务令牌的那个Endpoint
} //在此用foreach有点儿画蛇添足,但假如终结点多的话可以通过这种方式来添加
sh.Open();//启动服务

 

 

一旦服务总线启动成功并且连接上了中继服务,那么就可以在Azure的门户里查看到相关的信息

image

此处没有任何连接信息,如果连接上了的话这里就会有对应的信息