在 2008 年 4 月的“服务站”部分中,我向您介绍了如何创建简单的路由器,以在调用客 户端与目标服务之间实现消息的透明流动。在此过程中,我回顾了重要的 Windows Communication Foundation (WCF) 寻址和消息筛选语义,您可以了解到如何设计路由器约定使其处理非类型化消息,以 及如何配置绑定和行为才能允许消息在不经路由器处理的情况下进行传递。在本期中,我将继续讨论该话 题,介绍对路由器采用更实用的方案时涉及的更多实现细节。
传递路由器方案
在第 1 部分中我已经提到,将传递路由器插入到客户端和服务之间时,客户 端的关系是与目标服务而不是路由器的关系。尽管必须要使用路由器可以理解的传输协议和消息编码器发 送消息,但消息的全部内容(包括安全性标头和可靠的会话等内容)并不是由路由器处理的。可能会应用 传递路由器的几种情况有负载平衡、基于内容的路由或消息传输。
服务器资源的负载平衡和工作分配非常适合网络负载平衡 (NLB) 设备,但更适合硬件负载平衡设备。 而且,在下列情况下,WCF 路由器对负载平衡会非常有用:承载服务的环境不具备这些昂贵的设备;安装 服务的物理基础结构不受您直接控制;需要基于特定于域的逻辑进行路由;应用程序只调用容易配置的轻 型路由解决方案。此类 WCF 路由器可用于向分散在同一台计算机内的多个进程中的服务或跨计算机分布 的服务分发消息。
不管分布模型如何,负载平衡路由器必定要用到几个核心功能。服务必须以某 种方式注册到路由器,这样才能将其包含在负载分配中。路由器必须能够确定服务类型和关联的端点,以 便正确转发消息。路由器必须具有分配负载的算法,如典型的循环方法或以某种形式或基于优先级进行路 由。
有时,在服务间分发消息是基于消息内容,而不是基于负载平衡。基于内容的路由器通常会 检查消息标头或消息正文来获取路由信息。例如,具有有效许可证密钥的客户端发出的消息可能以高优先 级转发到包含处理能力较高的服务器计算机的大型池,而具有试用许可证的客户端发出的消息将转发到包 含功能较弱的服务器的小型池。在这种情况下,路由器不仅要了解消息的转发目标,而且必须能够检查每 条消息(消息的标头或正文内容),然后再确定消息的转发目标。以下部分将讨论支持这些情况的相关路 由功能。
通过 Action 标头转发
在路由器上接收的消息具有两个寻址标头,这两个寻址标 头在将消息转发到正确的服务时会很有用:
To 标头指示端点的名称。如果此标头与目标服务匹配 而不与路由器匹配,则指示消息目标地址的服务端点的 URL。