EasyNetQ使用(二)【连接RabbitMQ,SSL连接,Logging】
如果你连接过关系数据库,例如SQL Server
。你会发现EasyNetQ
处理connections
有点奇怪。和关系数据库通讯一直都是通过client
开始的。Client
打开一个连接, 发出一个SQL
命令,如有必要时,处理结果,然后关闭连接。一般建议是你维持一个打开的连接,时间要尽可能短,通过API
断开连接池。
诸如与RabbitMQ
这样的消息代理会话,是有些不同的,因为连接倾向于在应用的整个生命周期内保持连接状态。通常你打开一个连接,创建一个订阅,然后打开连接后,等待消息到来。EasyNetQ
不能保证代理在所有的时间都是可用的。相反它使用了延迟连接的方法,在后台线程轮询终结点,直到连接成功。假如服务器出于任何原因连接断开了(可能是网络故障,或许是RabbitMQ Server
自身的原因断开了),EasyNetQ
将恢复轮询终结点直到重新连接成功。
标准的做法是在你应用的生命周期内只创建一个IBus
实例.当你的应用关闭后Dispose
掉它。
延迟连接到RabbitMQ
服务器是通过IBus
接口表示的。大部分EasyNetQ
操作都是IBus
上的方法。创建一个IBus
实例如下:
var bus = RabbitHutch.CreateBus("host=myServer;virtualHost=myVirtualHost;username=mike;password=topsecret")
- 1
这个连接字符串是由键值对组成,格式如下 key=value
, 通过分号;分隔。只有一个必选的字段是host
.可能的连接字符串值是:
host
(例如host=localhost
或host=192.168.2.56
或host=myhost.mydomain.com
)这个字段是必选的。如要具体指定你要连接服务器端口,你用标准格式host:port
(例如:host=myhost.com:5673
)。假如你省略了端口号,AMQP默认端口是5672.连接到RabbitMQ集群,需要指定每一个集群节点用逗号分隔(例如:host:myhost1.com,myhost2.com,myhost3.com
).更多详情请参考Cluster Support
virtualhost
(例如:virtualHost=myVirturalHost)默认虚拟主机是’/’
username
(例如:username=mike
)默认是’guest’(对于非’localhost’主机你需要使用其他用户名)
password
(例如:password=mysecret)默认为’guest’
requestedHearbeat
(例如:requestHearbeat=10
)默认为10秒钟。没有心跳设置为0
prefetchcount
(例如:prefetchcount=1
) 默认为50.这个值是在EasyNetQ
发送ack
之前发送给RabbitMQ
的消息数。不限制设置为0(不推荐). 为了在消费者之间保持公平和平衡设置为1.
publisherConfirms
(例如:publisherconfirms=true
)默认是false
。 如何开启Publisher Confirms
?
persistentMessages
(例如:persistentMessages=false
)默认为true。这个决定了在发送消息时采用什么样的delivery_mode
。false=1,true=2
. 设置为true
,RabbitMQ
将会把消息持久化到磁盘,并且在服务器重启后仍会存在。设置为false
可以提高性能收益。
product
(例如:product=我的现实中重要的服务)在EasyNetQ 0.27.3中被引进。默认值是Bus的实例名。
此处输入的值将显示在RabbitMQ的后台管理界面中。
platform
(例如:platform=my.fully.qualified.domain.name
)在EasyNetQ 0.27.3
中被引进。默认值是运行着客户端处理Bus
的实例的机器的主机名。此处输入的值将会线上在RabbitMQ
管理端界面中。
timeout
(例如:timeout=60
)模式值为10秒。在EasyNet 0.17
中被引进。可解析类型为System.UInt16
从0到65535范围内的值。不限制超时时间设置为0.当超时事时抛出System.TimeoutException
.
关闭连接,只要简单的dispose
,如下:
bus.Dispose();
这样就关闭了EasyNetQ
使用过的连接、管道、消费者和所有其他资源。
EasyNetQ
可以通过SSL进行连接。这篇指南的作者Gordon Coulter最初为回应一个提问写的。
首先,你必须仔细依据https://www.rabbitmq.com/ssl.html文章中的步骤。我花费了很多时间尝试让openssl
这部分能运作起来,然后为了让他按我的需要去运作而不仅仅只是一个demo
,我又花费了很多时间。
第一次通过SSL
让EasyNetQ
运作时,在他们为了测试而做的可以运行的页面上的那点DotNet
代码给我提供了很大帮助。我有一个简单的控制台程序,包涵了Rabbit
和EasyNetQ
代码,会在下面展示。此外使用了Rabbit logs
。
当你连接上后,管理界面的connection
页面会显示一个小的SSL
协议标签。你也在Overview
选项卡的端口监听表里看到443端口。
代码如下:
var connection = new ConnectionConfiguration();
connection.Port = 443;
connection.UserName = "user";
connection.Password = "pass";
connection.Product = "SSLTest";
var host1 = new HostConfiguration();
host1.Host = "rmq1.contoso.com";
host1.Port = 443;
host1.Ssl.Enabled = true;
host1.Ssl.ServerName = "rmq1.contoso.com";
host1.Ssl.CertPath = "c:\\tmp\\myclient.p12";
host1.Ssl.CertPassphrase = "secret";
var host2 = new HostConfiguration();
host2.Host = "rmq2.contoso.com";
host2.Port = 443;
host2.Ssl.Enabled = true;
host2.Ssl.ServerName = "rmq2.contoso.com";
host2.Ssl.CertPath = "c:\\tmp\\myclient.p12";
host2.Ssl.CertPassphrase = "secret";
connection.Hosts = new List<HostConfiguration> { host1, host2 };
connection.Validate(); //VERY IMPORTANT - DOES CONFIG AS WELL AS VALIDATION!
var Bus = RabbitHutch.CreateBus(connection, services => services.Register<IEasyNetQLogger>(logger => new DoNothingLogger()));
尽管在ConnectionConfiguration
上有一个Ssl
选项属性,但在HostConfiguration
对象上设置Ssl
选项属性是一个合适的地方。HostConfiguration
对象上设置SSL
选项可以支持集群的场景。注意,在上面代码中我们指定了两个HostConfiguration
对象。假如一个挂了,EasyNetQ
的持续连接功能将自动连接到下一个可用的主机。在这个主机上配置SSL
在连接时就不会出现任何错误。
假如你仅仅指定一个主机,你可以选择通过HostConfiguration
对象去设置SSL
选项,也可以直接用ConnectionConfiguration
对象去设置。
不要忘记调用Validate()
方法。我最初跳过那儿(基本上我写的都是硬编码,因此可能没有什么错误需要验证)。但是,这个方法调用实际上回去应用一系列设置,为了确保连接运行是必要的。
SslOption
详情参见文档SslOption Class
你可以尝试用官方的RabbitMQ .NET client
去配置和测试,尝试去运行示例。首先要阐明,在你的项目做任何修改前,所有这些设置都被正确的描述在Official RabbitMQ SSL documentation for .NET.
EasyNetQ
提供了一个Logger
接口 IEasyNetQLogger
:
public interface IEasyNetQLogger
{
void DebugWrite(string format,params object[] args);
void InfoWrite(string format, params object[] args);
void ErrorWrite(string format, params object[] args);
void ErrorWrite(Exception exception);
}
Logging
默认是关闭的,NullLogger
作为IEasyNetQLogger
的具体实现被注册进去。
有一个控制台Logger(ConsoleLogger)
可以用来做测试或调试。但是,它或许不能在生产环境系统中使用。调试级别的Logging
是非常详细的,记录了所有信息,会对你的应用有性能上的影响。并且,这可能对于那些在AMQP
和EasyNetQ
方面没有深入了解的人来说没有多大意义。
你应该提供自己的基于IEasyNetQLogger
实现,记录日志信息和错误信息到自己的应用日志中。RabbitHutch.CreateBus
方法提供了overloads
方法,允许你替换成自己的日志组件。参看Replacing EasyNetQ Components
.你可以使用这个方法注册自己的Logger
到Bus
中。示例如下:
var logger = new MyLogger();// IEasyNetQLogger实现。
var bus = RabbitHutch.CreateBus(“我的连接字符串”,x => x.Register<IEasyNetQLooger>(_ => looger));