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.然后在远程连接的时候一直连接失败. 官网上面给的例子都是在本地使 ...
随机推荐
- Http 缓存剖析
缓存一直是前端优化的主战场, 利用好缓存就成功了一半. 本篇从http请求和响应的头域入手, 让你对浏览器缓存有个整体的概念. 最终你会发现强缓存, 协商缓存 和 启发式缓存是如此的简单. 导读 浏览 ...
- 算法设计与分析 - 李春葆 - 第二版 - html v2
1 .1 第 1 章─概论 1.1.1 练习题 1 . 下列关于算法的说法中正确的有( ). Ⅰ Ⅱ Ⅲ Ⅳ .求解某一类问题的算法是唯一的 .算法必须在有限步操作之后停止 .算法 ...
- [唐胡璐]Selenium技巧- dataProvider实现数据驱动
废话不多讲,直接进主题,怎么实现用Excel配置测试数据,用dataProvider来调用测试数据。 jxl目前来看只支持.xls格式的文件,所以我们采用Apache POI来实现对.xlsx的操作, ...
- v-model原理解析
vue中v-model可以实现数据的双向绑定,但是为什么这个指令就可以实现数据的双向绑定呢? 其实v-model是vue的一个语法糖.即利用v-model绑定数据后,既绑定了数据,又添加了一个inpu ...
- 控制warning信息在控制台的显示
在运行代码时,有时出现warning信息, 1.当你后台不需要warning信息的时候,可以直接把warning信息省略掉. 2.如果代码是循环,则会在控制台打印多次warning信息,这会使得war ...
- P4149 [IOI2011]Race 点分治
思路: 点分治 提交:5次 题解: 刚开始用排序+双指针写的,但是调了一晚上,总是有两个点过不了,第二天发现原因是排序时的\(cmp\)函数写错了:如果对于路径长度相同的,我们从小往大按边数排序,当双 ...
- Gradle 如何打包 Spring Boot 可执行 JAR
如何在 Gradle 中配置一个项目可以打包为 Spring Boot 可执行 Jar? 你首先需要添加到 org.springframework.boot 到插件中: 例如下面的代码: plugin ...
- 数据结构实验之二叉树二:遍历二叉树 SDUT 3341
#include <bits/stdc++.h> using namespace std; struct Tree { char data; struct Tree *right; str ...
- MySQL备忘点(下)
联结表 创建联结 FROM 表1,表2 与内连接作用相同类似:如果失去WHERE子句,会出现笛卡尔积现象 内联结 INNER JOIN 高级联结 自联结 例子:SELECT 字段b FROM 表 WH ...
- 7月清北学堂培训 Day 4
今天是丁明朔老师的讲授~ 图论 图是种抽象结构,这种抽象结构可以表示点与点之间的关系. 最短路: Dijkstra(堆优化) SPFA Floyd 最小生成树: Kruscal 连通性: BFS / ...