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 rabbitmq-server-3.6.12-1.el6.noarch 及其安装所需要的软件打包都在这里面,主要报卡一下软件:socat-1.7.3.2.tar.gz、rabbitmq-server-3.6.12-1.el6.noarch.rpm、rabbitmq-release-signing-key.asc、otp_...
rabbitmq-server-3.10.5-1.el8.noarch.rpm
linux rabbitmq安装包 rabbitmq-server-generic-unix-3.6.1.tar 实测
这里提供了rabbitmq-server-3.7.3.exe百度网盘下载,官网下载实在是太慢了,亲测有效! rabbitmq-server-3.7.3.exe rabbitmq-server-3.7.3.exe rabbitmq-server-3.7.3.exe
rabbitmq-server-3.4.1-1.noarch.rpm rabbitmq-server-3.4.1-1.noarch.rpm
RabbitMQ源码 rabbitmq-server-generic-unix-3.8.8.tar.xz
下载好的包,因为下载太慢 rabbitmq-server-generic-unix-3.7.8.tar.xz
rabbitmq-server-3.8.8-1.el7.noarch
rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-...
rabbitmq安装包,linux离线安装。后面会有教程及配置。先在windows解压再使用。软件名称:rabbitmq-server-generic-unix-3.5.7.tar.gz
最新版linux rabbitmq-server-generic-unix-3.9.1.tar.xz最新版linux rabbitmq-server-generic-unix-3.9.1.tar.xz
rabbitmq-server-3.7.10-1.el7.noarch.rpm包 配合erlang在RHEL Linux 7.x, CentOS 7.x, Fedora 19+ (supports systemd)等系统运行
rabbitmq-server-generic-unix-3.7.18.tar.xz版本服务器安装 有需要的可以去官网查看一下rabbitmq版本对erlang版本的一个支持情况,官网地址:http://www.rabbitmq.com/which-erlang.html
最新版linux rabbitmq-server-generic-unix-3.9.0.tar.xz最新版linux rabbitmq-server-generic-unix-3.9.0.tar.xz
使用命令安装:yum -y install rabbitmq-server-3.6.6-1.el6.noarch.rpm 启动rabbitmq服务: 前台运行:rabbitmq-server start (用户关闭连接后,自动结束进程) 后台运行:rabbitmq-server -detached
rabbitmq-server-3.8.3.exe和erlang22.2.exe 2020年3月最新版本, 64位
rabbitmq-server-3.9.7-1.el7.noarch.rpm
最新版linux rabbitmq-server-generic-unix-3.8.7.tar.xz
rabbitmq离线安装 - 语言库 erlang-21.2.6-1.el7.x86_64.rpm - 依赖 socat-1.7.3.2-2.el7.x86_64.rpm - rabbitmq 服务器 rabbitmq-server-3.7.13-1.el7.noarch.rpm
JAVA开发工具 rabbitmq-server-3.7.5.tar.xz,RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件