`

.Net下RabbitMQ的使用(9) -- 在WCF下使用RabbitMQ

 
阅读更多

RabbitMQ .net客户端通过自定义的Binding和Transport Binding Element扩展了WCF,使之能够在AMQP协议上使用。在WCF中,Binding作为一系列Binding Elements的栈,控制了消息传输的大部分方面如安全,消息格式,事务等等。而Binding中的Transport Binding Element传输绑定元素,则指定了服务端和客户端之间的通信协议。RabbitMQ .net客户端提供的Binding使我们可以在AMQP协议上面使用WCF方便的实现One-Way, Two-Way(Request/Reply),Duplex(Asynchronous Callback)这样的常见通信方式,并且提供可靠的,事务性的传输。我们可以通过代码和传统WCF配置文件的方式进行开发。

 

WCF的ABC

Address

使用RabbitMQ Binding 的地址一定要使用如下格式:serviceAddress = “soap.amqp:///” serviceName,例如:soap.amqp:///myService。它使用类型是direct的exchange。其他类型的exchange似乎不被支持。

需要注意的是,用IIS来作为Host是不被推荐的,应该使用System.ServiceModel.ServiceHost来Host,RabbitMQ的服务端。地址的配置可以通过代码也同样可以通过config文件来配置。

 

Binding

RabbitMQ使用的Binding不是在.net客户端RabbitMQ.Client中提供,而是在RabbitMQ.ServiceModel.dll这个新的dll中提供。可以再官方网站或者Nuget中获取到。所以在引用RabbitMQ.Client.dll的同时还要引用RabbitMQ.ServiceModel.dll。在配置文件中定义时,必须要配置Binding的extension。

我们在配置文件中如下配置:

<bindings>
      <rabbitMQBinding>
        <binding name="rabbitMQConfig"
         protocolversion="AMQP_0_9_1"
                 hostname="localhost"
                 port="5672" />
      </rabbitMQBinding>
    </bindings>
    <extensions>
      <bindingExtensions>
        <add
          name="rabbitMQBinding"
          type="RabbitMQ.ServiceModel.RabbitMQBindingSection, RabbitMQ.ServiceModel, Version=1.0.110.0, Culture=neutral, PublicKeyToken=null"/>
      </bindingExtensions>
    </extensions>

 

关于RabbitMQ.ServiceModel.dll中Binding的相关详细信息,默认使用和可以使用的绑定元素可以参考官方提供的文档。

 

Contract

Contract的定义是和原来的WCF定义是一样的,没有什么区别,加上ServiceContractAttribute和OperationContractAttribute属性就可以:

[ServiceContract]
public interface ICalculator
{
    [OperationContract]
    int Add(int x, int y);
    [OperationContract]
    int Subtract(int x, int y);
}

如果要在具体服务的实现上使用Behavior也可原来一样:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public sealed class Calculator : ICalculator
{
    public int Add(int x, int y)
    {
        return x + y;
    }
    public int Subtract(int x, int y)
    {
        return x - y;
    }
}

 

服务

服务的定义也和常用的WCF定义一样,配置文件定义和代码定义。Host应该使用System.ServiceModel.ServiceHost。ServiceHost必须定义一个基地址或者是完整的Endpoint地址,该地址是用soap.amqp格式的。Endpoint必须添加使用RabbitMQBinding。

service = new ServiceHost(
    typeof(Calculator),
    new Uri("soap.amqp:///"));
service.AddServiceEndpoint(
typeof(ICalculator),
new RabbitMQBinding(
"localhost",
5672,
"guest",
"guest",
"/",
8192,
Protocols.AMQP_0_9_1),
"Calculator");

 

服务端完整的配置文件定义如下:

<system.serviceModel>
    <services>
      <service name="ESBTest.WcfRabbitMQ.ConsoleServerPerformance.RabbitMQServer">
        <host>
          <baseAddresses>
            <add baseAddress="soap.amqp:///"   />
          </baseAddresses>
        </host>
        <endpoint
          address="ESBTest.WcfRabbitMQ.ConsoleServerPerformance"
          binding="rabbitMQBinding"
          bindingConfiguration="rabbitMQConfig"
          contract="ESBTest.Contracts.IRequest"/>
      </service>
    </services>
 
    <bindings>
      <rabbitMQBinding>
        <binding name="rabbitMQConfig"
                 hostname="localhost"
                 port="5672"
                 protocolversion="AMQP_0_9_1"
                 oneWay="false"/>
      </rabbitMQBinding>
    </bindings>
 
    <extensions>
      <bindingExtensions>
        <add
          name="rabbitMQBinding"
          type="RabbitMQ.ServiceModel.RabbitMQBindingSection, RabbitMQ.ServiceModel, Version=1.0.110.0, Culture=neutral, PublicKeyToken=null"/>
      </bindingExtensions>
    </extensions>
  </system.serviceModel>

 

开多个服务端,同样可以实现负载均衡。

 

客户端

客户端的定义也和常用的WCF定义一样,官方推荐通过继承自ClientBase<T>或DuplexClientBase<T>来实现。如果是Duplex的客户端,InstanceContext必须要指定的。

完整的客户端配置文件定义如下:

<system.serviceModel>
    <client>
      <endpoint address="soap.amqp:///ESBTest.WcfRabbitMQ.ConsoleServerPerformance"
                binding="rabbitMQBinding"
                bindingConfiguration="rabbitMQConfig"
                contract="ESBTest.Contracts.IRequest"
                name="client" />
    </client>
    <bindings>
      <rabbitMQBinding>
        <binding name="rabbitMQConfig"
         protocolversion="AMQP_0_9_1"
                 hostname="localhost"
                 port="5672" />
      </rabbitMQBinding>
    </bindings>
    <extensions>
      <bindingExtensions>
        <add
          name="rabbitMQBinding"
          type="RabbitMQ.ServiceModel.RabbitMQBindingSection, RabbitMQ.ServiceModel, Version=1.0.110.0, Culture=neutral, PublicKeyToken=null"/>
      </bindingExtensions>
    </extensions>
  </system.serviceModel>

 

我们可以看到,提供的WCF Binding只是一些简单通用的功能,RabbitMQ的一些其他比较好的功能并没有提供。所以使用WCF或者直接使用客户端要视业务和系统环境而定,如果只是使用一些简单的功能或整个系统都是基于WCF的,那么使用WCF来做RabbitMQ,会给你提供一个快速的,一致性的开发模型。但如果使用的场景比较复杂,性能要求比较高的话还是使用.net客户端的API比较理想。直接使用客户端API和WCF来比较,就速度而言,WCF花的是时间大概是直接使用API的7倍左右,慢得多。这点相信大家也是可以预见的。

分享到:
评论

相关推荐

    rabbitmq-dotnet-client-3.6.4-dotnet-4.6.1.rar

    RabbitMQ-dotnet-client-3.6.4-dotnet-4.6.1.rar是一个包含RabbitMQ .NET客户端库的压缩包,适用于.NET Framework 4.6.1环境。这个压缩包提供了一个演示如何在WCF(Windows Communication Foundation)服务中使用...

    WCF RabbitMQ-rabbitmq

    WCF/RabbitMQ/ rabbitmq rabbitmq rabbitmq rabbitmq rabbitmq

    The RabbitMQ .NET client user guid

    The RabbitMQ .NET client is an implementation of an AMQP client library for C# (and, implicitly, other .NET languages), and a binding exposing AMQP services via Microsoft’s Windows Communication ...

    WCF/RabbitMQ绑定/负载均衡

    这个示例对于理解如何在WCF中使用RabbitMQ进行服务间通信,以及如何实现负载均衡,具有很好的实践价值。 总结来说,"WCF/RabbitMQ绑定/负载均衡"是一个关于如何利用WCF和RabbitMQ实现高效、可靠、可扩展服务通信的...

    基于C#的WCF与RabbitMQ绑定负载均衡设计源码

    本项目是基于C#开发的WCF与RabbitMQ绑定负载均衡系统,包含33个文件,其中包括20个C#源代码文件、5个CSPROJ项目文件、2个配置文件、1个gitattributes文件、1个gitignore文件、1个LICENSE文件、1个Markdown文档文件、...

    试用企业级总线消息传递

    NServiceBus是一个强大的开源消息传递框架,它专为.NET平台设计,支持C#编程语言,并在.NET 4及更高版本中运行。NServiceBus简化了分布式系统中的通信,使得多个服务之间可以通过异步消息进行交互。 【描述】:使用...

    .net 电子商务平台系统源码

    .NET框架包含了C#、VB.NET等多种编程语言,以及ASP.NET、WCF、WF等丰富的开发组件,为构建电子商务平台提供了坚实的基础。 在.NET电子商务平台系统源码中,通常会包含以下几个关键模块: 1. 用户管理:用户注册、...

    .net 面试问题整理.zip

    18. **分布式系统**:了解CAP定理、事件驱动架构、消息队列(如RabbitMQ、ServiceBus)在.NET中的应用。 19. **安全性**:理解ASP.NET的身份验证和授权机制,以及如何使用HTTPS、OAuth、JWT等实现安全的Web应用。 ...

    NET工程师面试参考题

    - 使用消息队列服务器(如RabbitMQ、Apache Kafka等)作为中介。 - 可以实现异步通信,提高系统的解耦性和灵活性。 4. **WCF (Windows Communication Foundation)**: - 是Microsoft提供的一个统一的编程模型,...

    燕青webservice笔记

    微软的.NET框架提供了创建和消费Web Service的工具,如ASMX(ASP.NET Web Services)和WCF(Windows Communication Foundation)。这些技术支持SOAP协议,并提供了丰富的开发和调试功能。 8. RESTful Web Service...

    memotron---distribute.rar_.net编程_C/C++_

    在.NET中,分布式数据存储可能涉及WCF(Windows Communication Foundation)服务、Azure Service Bus或者使用NoSQL数据库(如MongoDB、CouchDB)来实现跨网络的数据交换和存储。C/C++则可能利用TCP/IP套接字编程、...

    C#分布式开发源码实例

    在C#中进行分布式开发,我们可以利用.NET框架提供的丰富的类库和工具,如WCF(Windows Communication Foundation)服务、Remoting、ASP.NET Web API等,实现跨进程甚至跨网络的通信。 本源码实例主要针对C#初学者,...

    消息队列.rar

    在.NET环境中,我们可以利用各种MQ实现,如RabbitMQ、Apache ActiveMQ、Azure Service Bus或者微软自己的Windows Communication Foundation (WCF) 的消息队列服务。本示例中的".net使用MQ消息队列源码"是为初学者...

    分布式开发基础教程1

    9. **消息队列**:RabbitMQ、Azure Service Bus或NServiceBus等消息队列系统可以实现异步处理和解耦,提高系统的可扩展性和稳定性。 10. **持久化存储**:分布式系统通常涉及多个节点间的协作,因此需要可靠的...

    winform与webform通信

    在VB.NET环境下,开发者经常需要在WinForm应用(本地客户端)和WebForm应用(服务器端)之间交换数据,例如在桌面端填写表单并提交到Web服务,或者从Web服务获取数据并在桌面界面上展示。以下是对这个主题的详细解释...

    采集网站新闻信息

    下面我们将深入探讨.NET 2008在C/S架构下的应用以及新闻采集的相关技术。 首先,.NET 2008是微软推出的一款开发平台,它提供了强大的开发工具,如Visual Studio 2008,支持C#、VB.NET等多种编程语言。利用.NET ...

    NET开发电信短信网关(1)

    在.NET中,我们可以使用WCF(Windows Communication Foundation)框架,结合WSDL来创建服务端,定义一个接收状态报告的方法,然后在客户端调用这个服务,实现状态的实时跟踪。 接着,订购关系接口主要用于管理用户...

    NET企业级应用架构设计(2nd)

    在.NET框架下,C#语言是主要的编程工具,它的特性如面向对象编程、泛型、异步处理、Lambda表达式等在企业级应用中有着广泛的应用。此外,.NET Framework提供的类库如System.Collections、System.Threading、System...

    高级java笔试题-My_Note:我的笔记

    高级java笔试题 If you ...sql在各数据库语法略有不同,以下主要以sql server数据库为主进行说明 SQL基础 sql server sql 数据库 关系型数据库 历史数据处理 & 集群 & 分布式 SQL Server Oracle Mys

Global site tag (gtag.js) - Google Analytics