目录
代理代理ip全网最简单的安装手册
// 安装erlang wget https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh bash script.rpm.sh sudo yum install erlang // 安装rabbitmq 3.7 版本 wget https://antsentry-cloud-firmware.s3.cn-northwest-1.amazonaws.com.cn/raspberrypy/rabbitmq-server-3.7.26-1.el7.noarch.rpm sudo yum install rabbitmq-server-3.7.26-1.el7.noarch.rpm sudo service rabbitmq-server start配置用户
rabbitmqctladd_user username passwd// 添加用户 rabbitmqctlset_user_tags username administrator// 给用户分配权限 rabbitmqctllist_users// 查看系统中有哪些用户启用web控制台
sudo rabbitmq-plugins list // 查看启用了哪些插件 sudo rabbitmq-plugins enable rabbitmq_management// 启用Web管理界面,默认端口是15672经过上述几个步骤,打开浏览器,输入服务器的ip和端口,就能看到久违的登录界面了。
配置集群
至少需要两个节点才能组成集群,简单起见,就选两台啦。在另一台服务上,重复上面的安装过程,配置用户和管理界面步骤可以略过。
复制前一台服务器上的cookie到新安装的这台服务器,cookie所在目录为:/var/lib/rabbitmq/.erlang.cookie。
Tips:如果copy,需要注意.erlang.cookie文件的权限必须是400。同时,不要用vim代理代理ip编辑器编辑,会留下换行符导致cookie不一致。cookie文件的大小为20字节。上述两个小问题,确实困扰了笔者挺长时间,导致安装不成功。
sudo rabbitmqctl cluster_status// 查看集群状态 sudo rabbitmqctl stop_app// 停止app sudo rabbitmqctl join_cluster rabbit@ip-10-0-5-62// 把当前节点添加到集群中 sudo rabbitmqctl start_app// 启动app通过简单的几步,这两台服务器已经组成集群了。登录web控制台,效果如下:
节点之间同步配置信息,关于集群的特点,这是最正确的描述。其他的一些特性,都是可配置的,例如内存节点、磁盘节点;镜像模式等;持久化等等。在可用性和性能之间,用不同的配置,做相应的取舍。这方面的话题,后续展开介绍,敬请关注。
代理中间件
代理代理ip在上一章节中介绍了集群的安装,纵观网上绝大多数的教程,到这里并没有结束,还有很重要的一步,那就是HAProxy+KeepAlived。笔者并没有研究过HAProxy,更别提KeepAlive了,看到这样的东东一脸懵逼。好在业务运行在云上,云服务上有TCP层的负载均衡(LB)组件,用LB代替HAProxy+KeepAlive是一样的。结构如下:
从体系结构的角度考虑,集群中的节点是对等的,即客户端连接任意一个节点都能正常工作,因为只有这样,我们才能用粗暴的负载均衡器做代理。
从实现的细节看,也却是如此。对生产者来说,发送给那个节点并不重要,路由到相应的queue master节点存储即可。代理代理ip消费者若是连接到了master节点,直接取数据即可;如果连接到非master节点,创建一个master节点到目标节点的通道传输数据。
在软件架构实践中,这是非常普遍的一种模式,例如调用微服务的多个实例、例如访问某个域名对应的多个IP地址,例如eureka注册中心等,有些用了中心化的代理中间件,有些则是在客户端实现的。同样的道理,访问rabbitmq集群,除了常见的代理中间件,也可采用客户端代理实现。
客户端代理
支持多个地址
通常,初始化ConnectionFactory只能接受一个地址。这么看来,用官方SDK完成客户端代理,要重写基础的访问组件了,代理代理ip这条路肯定是没有错的,就像sharding-jdbc。仔细研究官方提供的API文档,ConnnectionFactory有个newConnection函数,是可以传入一个地址列表的,实现逻辑如下
factory.newConnection(addresses);根据地址列表依次创建连接,直到创建成功为止。Tips:这段代码并不优雅,如果直接用到这段代码,会客户端都连接到第一个正常的节点。
恢复连接
ConnectFactory个重要的功能,那就是自动恢复连接,代码很简单,在4.0版本以后是默认开启的。按照官方的解释,在连接失败后,可以做到打开连接、恢复连接上的listeners、重新创建channel、恢复channel上的listeners以及配置信息。
factory.setAutomaticRecoveryEnabled(true);结合这两个特性,经测试,集群中的节点宕机后,确实可以重新连接到另一个节点。但是,中间有一段时间连接是中断的,生产者发送消息,会连续失败!
补丁
为了解决这个问题,在生产者增加重试机制,问题得到解决。发送消息失败后,要等待创建连接和channel,重新发送消息。
public void send(String exchange, MQMessage message) { try { sentMsg(exchange, message); } catch (Exception ex) { connnect(); sentMsg(exchange, message); } }到此为止,验证了通过客户端代理模式访问rabbitmq集群。但是,笔者在生产中真不敢这么用。你知道有哪些好用的客户端中间件吗?欢迎留言讨论。