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.然后在远程连接的时候一直连接失败. 官网上面给的例子都是在本地使 ...
随机推荐
- devops发展历程
第一阶段:只有 Dev ,没有 Ops ,Dev 是全栈工程师 如何理解?最初的时候,产品和业务形态都处于摸索期,业务复杂度不高,访问量不大,软件能够尽快跑起来推向市场是最重要的,所以架构上不设计的很 ...
- python_面向对象——对象之间的关联关系
1.将类中的对象关联起来(简单的方法) class Person: def __init__(self,name,age,sex): self.name = name self.age = age s ...
- git 从某一版本拉取新分支,并在新分支合并某几个commit
场景:需要回退至红框中的那个版本,并且只添加“缓存逻辑优化,增加加载中的状态”这一次commit,其他的commit不添加. 步骤: 1) 切换到指定分支 dev git checkout dev 2 ...
- 关系型数据库与NoSQL的对比
SQL(结构化的查询语言)数据库是过去四十年间存储数据的主要方式.20世纪90年代末随着Web应用和MySQL.PostgreSQL和SQLite等开源数据库的兴起,用户爆炸式的增长. NoSQL数据 ...
- 内存管理2-@class关键字
Review: 给对象发送消息,进行相应的计数器操作. Retain消息:使计数器+1,改方法返回对象本身 Release消息:使计数器-1(并不代表释放对象) retainCount消息:获得对象当 ...
- vxe-table 可编辑表格 行内编辑以及验证 element-UI集成
<vxe-table border show-overflow ref="xTable" ----------------------------------------- ...
- 学院管理系统(mysql版)
需求 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节上课纪录对应多条学员的上 ...
- Ubuntu14.04 系统复制迁移到新的机器上
1.打包系统文件 制作启动盘,然后进入bios, #进入bios的boot标签选择sandisk启动 如果没有找到u盘进入save & exit标签页选择boot override中的sand ...
- 关于Sign in with Apple 后台验证的一些记录
2019年10月9号 IOS端新增Sign in with Apple IOS真是世界上最垃圾的语言,没有之一,苹果是世界上最垃圾的公司,没有之一 关于Sign in with Apple 苹果官方 ...
- Codeforces 23A You're Given a String...
A. You're Given a String... time limit per test 2 seconds memory limit per test 256 megabytes input ...