zoukankan      html  css  js  c++  java
  • 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. 设置为trueRabbitMQ将会把消息持久化到磁盘,并且在服务器重启后仍会存在。设置为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,我又花费了很多时间。

    第一次通过SSLEasyNetQ运作时,在他们为了测试而做的可以运行的页面上的那点DotNet代码给我提供了很大帮助。我有一个简单的控制台程序,包涵了RabbitEasyNetQ代码,会在下面展示。此外使用了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是非常详细的,记录了所有信息,会对你的应用有性能上的影响。并且,这可能对于那些在AMQPEasyNetQ方面没有深入了解的人来说没有多大意义。

    你应该提供自己的基于IEasyNetQLogger实现,记录日志信息和错误信息到自己的应用日志中。RabbitHutch.CreateBus方法提供了overloads方法,允许你替换成自己的日志组件。参看Replacing EasyNetQ Components.你可以使用这个方法注册自己的LoggerBus中。示例如下:

    var logger = new MyLogger();// IEasyNetQLogger实现。
    var bus = RabbitHutch.CreateBus(“我的连接字符串”,x => x.Register<IEasyNetQLooger>(_ => looger));
  • 相关阅读:
    将时间超过万的数字转换为保留两位小数的阅读
    获取日期的最早和最晚时间
    Mybatis 关联查询分页问题的解决
    使用 java stream 获取两个集合之间的交集.差集
    使用 Stream 流对集合排序,包含对空属性的处理
    SpringBoot 多个子项目中下载 excel 报错解决方法
    单元测试捕获异常的写法
    单元测试用例需要登录信息的写法
    openwaf实战
    70个python练手项目
  • 原文地址:https://www.cnblogs.com/lhxsoft/p/11880951.html
Copyright © 2011-2022 走看看