159人参与 • 2024-08-04 • Erlang
rabbitmq云端配置参考
消息队列中间件是微服务分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性。
常用的消息队列:activemq(安全),rabbitmq(高效),rocketmq,kafka(大数据中应用广泛)。
rabbitmq是一个由erlang语言开发的基于amqp协议的开源中间件。
rabbitmq最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
amqp:advanced message queue高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。
rabbitmq具体特点包括:
(1)可靠性(reliability)
rabbitmq 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
(2)灵活的路由(flexible routing)
在消息进入队列之前,通过exchange 来路由消息的。对于典型的路由功能,rabbitmq已经提供了一些内置的 exchange 来实现。
针对更复杂的路由功能,可以将多个exchange 绑定在一起,也通过插件机制实现自己的 exchange 。
(3)消息集群(clustering)
多个 rabbitmq 服务器可以组成一个集群,形成一个逻辑 broker。
(4)高可用(highly available queues)
队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
(5)多种协议(multi-protocol)
rabbitmq 支持多种消息队列协议,比如 stomp、mqtt 等。
(6)多语言客户端(many clients)
rabbitmq 几乎支持所有常用语言,比如 java、.net、ruby 等。
(7)管理界面(management ui)
rabbitmq 提供了一个易用的用户界面,使得用户可以监控和管理消息 broker 的许多方面。
(8)跟踪机制(tracing)
如果消息异常,rabbitmq提供了消息跟踪机制,使用者可以找出发生了什么。
(9)插件机制(plugin system)
rabbitmq 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。
1.下载eralng20.0,用于支持rabbitmq的运行与编程
2.下载rabbitmq-server-3.7.4
installing rabbitmq | rabbitmq
1、安装erlang并配置环境
1.1 双击安装文件otp_win64_20.2.exe,点击next
1.2 选择安装目录d:\programd\erl9.2\,继续点next
1.3 配置环境变量
新建系统变量名为:erlang_home 变量值为erlang安装地址
双击系统变量path,点击“新建”,将%erlang_home%\bin加入到path中。
1.4 验证erlang是否安装成功
win+r键,输入cmd,再输入erl,看到erlang版本号就说明erlang安装成功了。
2、安装rabbitmq
2.1 双击下载后的执行文件,安装过程与安装erlang相同
2.2 安装rabbitmq-plugins插件
打开命令窗口,并进入rabbitmq的sbin文件夹。
输入以下命令:rabbitmq-plugins enable rabbitmq_management,效果如下
2.3 验证rabbitmq是否安装成功
rabbitmq的sbin文件夹下输入命令:rabbitmqctl status
出现下图,说明安装成功,同时说明rabbitmq server已经正常启动。
2.4 打开浏览器,地址栏输入mq访问地址http://127.0.0.1:15672,即可看到管理界面的登陆页
输入用户名和密码,都是guest,进入主界面
2.5 rabbitmq管理界面
上边导航条依次是:概览、连接、信道、交换器、队列、用户管理
1、出现 authentication failed (rejected by the remote node), please check the erlang cookie
解决办法:
清除cookie缓存,重启一下电脑,获取最新修改的cookie,即可解决该问题。
2、报错:status of node rabbit@ … ** (argumenterror) argument error (stdlib)
解决办法:
检查rabbitmq 服务的日志db、log 等文件夹的路径是否含有中文,检查本机的用户名是否为中文,如果存在中文会出现下面的报错。
将本机名称改为英文名称。
3、主机名原来为中文,改为英文后执行rabbitmqctl status报错, * connected to epmd (port 4369) on desktop-aj0n…suggestion: start the node
报错信息如下:
epmd reports: node ‘rabbit’ not running at all
no other nodes on desktop-aj0n
suggestion: start the node
解决办法:
执行以下命令,重新安装rabbit-mq
rabbitmq-service remove
rabbitmq-service install
如果上述命令还不行,则执行
rabbitmq-server start
4、报错"start_error, failed_to_start_child", 原因是rabbitmq和erlang版本不一致
解决办法:rabbitmq和erlang版本对应关系参考以下官网
https://www.rabbitmq.com/which-erlang.html
5、出现如下错误提示
distribution failed: {{:shutdown, {:failed_to_start_child, :net_kernel, {:exit, :nodistribution}}}, {:child, :undefined, :net_sup_dynamic, {:erl_distribution, :start_link, [[:rabbitmqcli67, :shortnames], false]}, :permanent, 1000, :supervisor, [:erl_distribution]}}
解决办法:
检查rabbitmq服务的日志db、log等文件夹的路径是否含有中文,检查本机的用户名是否为中文,存在中文会出错。
请将本机名称,rabbitmq的日志 db、log等文件夹都改为英文。
云服务器需要在控制台添加“安全组设置”
1、阿里云配置
2、华为云配置
springboot应用可以完成自动配置及依赖注入,可以通过spring直接提供与mq的连接对象。
server:
port: 9001
spring:
application:
name: producer
rabbitmq:
host: 47.96.11.185
port: 5672
virtual-host: host1
username: ytao
password: admin123
@service
public class testservice {
@resource
private amqptemplate amqptemplate;
public void sendmsg(string msg){
//1. 发送消息到队列
amqptemplate.convertandsend("queue1",msg);
//2. 发送消息到交换机(订阅交换机)
amqptemplate.convertandsend("ex1","",msg);
//3. 发送消息到交换机(路由交换机)
amqptemplate.convertandsend("ex2","a",msg);
}
}
@service
//@rabbitlistener(queues = {"queue1","queue2"})
@rabbitlistener(queues = "queue1")
public class receivemsgservice {
@rabbithandler
public void receivemsg(string msg){
system.out.println("接收msg:"+msg);
}
}
rabbitmq是消息队列,发送和接收的都是字符串/字节数组类型的消息。
要求:
(1)传递的对象实现序列化接口
(2)传递的对象的包名、类名、属性名必须一致
@service
public class mqservice {
@resource
private amqptemplate amqptemplate;
public void sendgoodstomq(goods goods){
//消息队列可以发送 字符串、字节数组、序列化对象
amqptemplate.convertandsend("","queue1",goods);
}
}
//消息消费者
@component
@rabbitlistener(queues = "queue1")
public class receiveservice {
@rabbithandler
public void receivemsg(goods goods){
system.out.println("goods---"+goods);
}
}
要求:
@service
public class mqservice {
@resource
private amqptemplate amqptemplate;
public void sendgoodstomq(goods goods){
//消息队列可以发送 字符串、字节数组、序列化对象
byte[] bytes = serializationutils.serialize(goods);
amqptemplate.convertandsend("","queue1",bytes);
}
}
@component
@rabbitlistener(queues = "queue1")
public class receiveservice {
@rabbithandler
public void receivemsg(byte[] bs){
goods goods = (goods) serializationutils.deserialize(bs);
system.out.println("byte[]---"+goods);
}
}
要求:对象的属性名一直
@service
public class mqservice {
@resource
private amqptemplate amqptemplate;
public void sendgoodstomq(goods goods) throws jsonprocessingexception {
//消息队列可以发送 字符串、字节数组、序列化对象
objectmapper objectmapper = new objectmapper();
string msg = objectmapper.writevalueasstring(goods);
amqptemplate.convertandsend("","queue1",msg);
}
}
@component
@rabbitlistener(queues = "queue1")
public class receiveservice {
@rabbithandler
public void receivemsg(string msg) throws jsonprocessingexception {
objectmapper objectmapper = new objectmapper();
goods goods = objectmapper.readvalue(msg,goods.class);
system.out.println("string---"+msg);
}
}
更多精彩内容请关注本站!!!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论