本节书摘来自异步社区《微软云计算Windows Azure开发与部署权威指南》一书中的第6章,第6.5节,作者: 尹成 , 郝庭毅 , 张俊强 , 孙奉刚 , 寇睿明 更多章节内容可以访问云栖社区“异步社区”公众号查看。
6.5 AppFabric服务总线基础概念
在大型分布式应用程序中最常见的需求之一就是连通性,而应用程序的整合通常也是IT领域中花费最高、最麻烦的。目前大多数组织机构都采用企业服务总线(ESB)这一解决方案。
作为Windows Azure平台的一部分,服务总线让ESB模式在整个Internet领域中成为现实。服务总线提供了很多可以在典型的ESB解决方案中看到的体系结构特点,包括身份认证和访问控制、命名、服务注册、公共消息池等。对于AppFabric服务总线,这些组件必须设计为能够在云端操作,面向的是整个Internet领域,并且要有高度的可扩展性和联合性。
服务总线可以把本地的ESB产品和运行在云端的服务整合,使用大量第三方提供的服务,比如微软或者其他提供商,以及运行在企业防火墙之外的各种桌面级、RIA(Rich Internet Application)和Web应用程序。
1.中继连接
现今,大量诸如即时消息、在线多人游戏、使用比如BitTorrent协议的对等文件共享应用程序等占据了网络传输中很大的比重。这些应用程序都是通过写低层的网络逻辑来实现穿过防火墙和NAT(Network Address Transfer)设备以创建对等连接的。它们通常都通过一个中继服务来提供连接逻辑,如图6-43所示。
![fcfd31419f54c393f6a3ed7152decc9ae4df9e9b](https://i-blog.csdnimg.cn/blog_migrate/aaa4db8576308237cdd5a42b5eecbc1c.png)
它的工作方式是:本地化服务通过出站端口连接中继服务并创建一个双向套接字绑定到特定的集结点地址来通信。客户端通过向中介服务发送消息实现与本地化的服务端通信。中继服务通过早已准备好的双向套接字连接将消息转发给本地化的服务端。客户端不需要和服务端建立连接,也不必知道服务端在哪,而服务端也不需要在防火墙上打开入站端口。
使用服务总线中继,可以充分利用单向消息、请求—响应、发布—订阅(多播)甚至异步和缓冲消息的优点。
2.直接互连性
除了中继通信,服务总线还提供了在客户端和服务端建立直接连接的能力以提高效能和吞吐量。客户端和服务端仍然先通过公共集结点地址与中继通信,然后中继会帮助它们直接互连以避免未来的中继转发。
中继基于客户端和服务端的探询信息,使用公共端口预测算法来实现二者的直接互连。中继服务查看探询信息,然后尽力预测接下来哪些端口会在两个NAT设备上打开。之后,中继向客户端和服务端提供信息,它们就可以尝试建立连接了。如果中继服务预测准确,连接将会建立成功;否则,中继会继续预测直到决定放弃直接互连,继续使用中继连接,如图6-44所示。
3.中继地址
理解如何为服务总线端点(endpoint)构造集结点地址对于使用服务总线非常重要。当公开一个基于TCP的端点时,地址构造如下。
sb://{namespace}.servicebus.windows.net/{name1}/{name2}/...
当要使用一个基于HTTP的地址时,只需要将“sb”协议替换为“http”或者“https”。
http://{namespace}.servicebus.windows.net/{name1}/{name2}/...
要注意地址必须以命名空间开始,以区别于服务总线上其他用户使用的端点。地址中包含的命名空间域名之后的部分可以随便起名字。
4.服务注册中心
服务总线提供服务注册中心来发布服务和为某个解决方案寻找服务端点。服务总线自动将公开端点发布在服务注册中心里,这样其他人通过浏览该服务命名空间的基地址来发现该服务,在这个命名空间基地址可以检索到包含该端点信息的订阅。
为了确保一个端点会出现在服务注册中心,必须配置该端点以被广泛发现。只需将端点与ServiceRegistrySettings行为关联起来,并将DiscoveryModel设置为DiscoveryType.Public。
5.与WCF整合
在.NET平台上使用服务总线的主要编程模型是WCF(Windows Communication Foundation)。在相应的SDK中带有一套可以自动将WCF服务端和客户端与中继服务整合的WCF中继绑定操作集。大多数情况下,只需要将当前使用的WCF绑定替换为服务总线绑定即可。
表6-2中列出了所有的服务总线绑定和对应的标准WCF绑定。像BasicHttpBinding、WebHttpBinding、WS2007HttpBinding和NetTcpBinding这些最常用的绑定都对应一个名字非常相似的服务总线绑定(仅仅在Binding前添加了Relay)。只有很少的中继绑定如NetOneWayRelayBinding和NetEventRelayBinding在WCF中没有相应的绑定。
![e2a6920f3457d70a96b6c2d5935c95d078b9d391](https://i-blog.csdnimg.cn/blog_migrate/0c700ff7c7d81dc375d85e28589ff7a6.png)