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));
EasyNetQ使用(二)【连接RabbitMQ,SSL连接,Logging】的更多相关文章
- 【EasyNetQ】- 使用SSL连接
EasyNetQ可以通过SSL连接.戈登·库尔特(Gordon Coulter)撰写的这本指南最初是针对一个提出的问题而写的. 首先,您必须仔细按照https://www.rabbitmq.com/s ...
- 【EasyNetQ】- 连接RabbitMQ
如果您习惯于处理与SQL Server等关系数据库的连接,那么您可能会发现EasyNetQ处理连接的方式有点奇怪.与关系数据库的通信始终由客户端启动.客户端打开连接,发出SQL命令,在必要时处理结果, ...
- 3-在EasyNetQ上使用SSL连接(黄亮翻译)
EasyNetQ可以通过SSL进行连接.这篇指南的作者Gordon Coulter最初为回应一个提问写的. 首先,你必须仔细依据https://www.rabbitmq.com/ssl.html文章中 ...
- Pika 连接 rabbitmq 集群
原文:https://blog.csdn.net/Tech_Salon/article/details/82890431 使用 Pika 连接 rabbitmq 集群使用 python 编程经常会用到 ...
- 在linux下的apache配置https协议,开启ssl连接
环境:linux 配置https协议,需要2大步骤: 一.生成服务器证书 1.安装openssl软件 yum install -y openssl mod_ssl 2.生成服务器私匙,生成server ...
- SSL连接分为两个阶段:握手和数据传输阶段
一.SSL概述SSL连接分为两个阶段:握手和数据传输阶段.握手阶段对服务器进行认证并确立用于保护数据传输的加密密钥,必须在传输任何应用数据之前完成握手.一旦握手完成,数据就被分成一系列经过保护的记录进 ...
- SSL Pining Mode 设置iOS SSL 连接安全
一:SSL Ping Mode 使用SSL来进行网络通信成为了很多mobile app的默认选择.最近一些文章发现:一些app并没有采用“额外的措施”来保证窃听不可以发生:这个“额外的步骤“就是SSL ...
- SpringBoot设置mysql的ssl连接
因工作需要,mysql连接需要开启ssl认证,本文主要讲述客户端如何配置ssl连接. 开发环境信息: SpringBoot: 2.0.5.RELEASE mysql-connector-java: 8 ...
- 远程连接RabbitMQ失败
远程连接RabbitMQ失败 为了避免污染宿主系统环境,于是在虚拟机中搭建了一个linux环境并且按照了rabbitmq-server.然后在远程连接的时候一直连接失败. 官网上面给的例子都是在本地使 ...
随机推荐
- #Python语言程序设计Demo - 七段数码管绘制
Python设计七段数码管绘制 单个数码管效果: 设计总数码管效果: Pyhton 编程: #七段数码管绘制 import turtle as t import time as T def drawG ...
- Controllers返回View的一个完整流程
详细说明一个MVC框架下,返回一个view的原理.如下图: 上图粗略的说明了一个返回View的流程,细节如下: 1.定义Model类: 2.定义接口添加接口约束为class: 3.定义接口实现类,即对 ...
- P3183 [HAOI2016]食物链[拓扑/记忆化搜索]
题目来源:洛谷 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a ...
- Red Hat Enterprise Linux 7.0
简介 Red Hat Enterprise Linux是Red Hat公司的Linux发行版,面向商业市场,包括大型机.红帽公司从Red Hat Enterprise Linux 5开始对企业版LIN ...
- 0009SpringBoot静态资源访问路径
访问静态资源: 静态资源需要放在哪些路径下才能被访问呢: 通过WebMvcAutoConfiguration.java中 addResourceHandlers()方法查找绑定的路径,一个是通过web ...
- mongodb 启动数据库失败原因及解决办法
刚开始接触mongodb 每次启动完数据库 用好之后退出时直接 command+q强制退出了 导致了下一次数据库启动失败 错误原因: 上一次退出数据库端口号并没有杀死 解决办法 lsof -i tc ...
- stm32如何核对flash大小和sram大小
以stm32f103zet6为例,直接上图:
- CF70E Information Reform
题意:给你一棵树,要选择若干节点,若一个点i没有选择,则有\(d(dis(i,j))\)的代价,其中j被选择.选择一个点代价为k,求最小代价. 首先,考虑这样一个问题: 如果距离a的最近被选点为i,距 ...
- 快速幂 x
快速幂! 模板如下: #include<iostream> #include<cmath> #include<cstdio> #define LL long lon ...
- 《视觉SLAM十四讲》学习日志(二)——初识SLAM
小萝卜机器人的例子: 就像这种机器人,它的下面有一组轮子,脑袋上有相机(眼睛),为了让它能够探索一个房间,它需要知道: 1.我在哪——定位 2.周围环境怎么样——建图 定位和建图可以理解成感知的 &q ...