it编程 > 前端脚本 > Erlang

消息队列RabbitMQ在Windows中安装与配置完全解析

159人参与 2024-08-04 Erlang

内容导读

一、rabbitmq简介

1.1 消息队列mq简介

消息队列中间件是微服务分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性。

常用的消息队列:activemq(安全),rabbitmq(高效),rocketmq,kafka(大数据中应用广泛)。

1.2 什么是rabbitmq

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的运行与编程

downloads - erlang/otp

2.下载rabbitmq-server-3.7.4

installing rabbitmq | 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等文件夹都改为英文。

五、rabbitmq云端配置参考

云服务器需要在控制台添加“安全组设置”

1、阿里云配置

2、华为云配置

六、rabbitmq在spring boot中的应用

springboot应用可以完成自动配置及依赖注入,可以通过spring直接提供与mq的连接对象。

6.1 消息生产者

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);
        
    }
}

6.2 消息消费者

@service
//@rabbitlistener(queues = {"queue1","queue2"})
@rabbitlistener(queues = "queue1")
public class receivemsgservice {
    @rabbithandler
    public void receivemsg(string msg){
        system.out.println("接收msg:"+msg);
    }
}

6.3 使用rabbitmq传递对象

rabbitmq是消息队列,发送和接收的都是字符串/字节数组类型的消息。

1、使用序列化对象

要求:

(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);
    }
}

2、使用序列化字节数组

要求:

@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);
    }
}

3、使用json字符串传递

要求:对象的属性名一直

@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);
    }
}

更多精彩内容请关注本站!!!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

RabbitMQ3.13.x之二_RabbitMQ所有端口说明及开启后台管理功能

08-04

RabbitMQ的介绍和使用

08-06

Elasticsearch的使用教程

08-02

关于rabbitmq(docker)部署,启动,访问,连接一系列问题最全面解决办法与思路,rabbitmq报私密连接,user can only log in via localhost,页面访问失败

08-01

消息队列-RabbitMQ

08-01

Erlang、RabbitMQ下载与安装教程(windows超详细)

08-01

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论