欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

RabbitMq消息服务(SpringBoot)

程序员文章站 2022-06-27 20:53:28
AMQP中文名:高级消息队列协议,他是线路层协议规范,所以可以跨平台,就像是HTTP一样,只要按照规范发送数据,就可以通过AMQP进行消息交互,本文基于我安装了超级久的RabbitMQRabbitMQRabbitMQ 是实现了AMQP的消息中间件,使用Erlang编写,所以使用前要安装Erlang环境#下载wget http://erlang.org/download/otp_src_21.0.tar.gz#解压tar -zxvf otp_src_21.0.tar.gzcd otp_src_...

AMQP

中文名:高级消息队列协议,他是线路层协议规范,所以可以跨平台,就像是HTTP一样,只要按照规范发送数据,就可以通过AMQP进行消息交互,本文基于我安装了超级久的RabbitMQ

RabbitMQ

RabbitMQ 是实现了AMQP的消息中间件,使用Erlang编写,所以使用前要安装Erlang环境

#下载
wget http://erlang.org/download/otp_src_21.0.tar.gz
#解压
tar -zxvf otp_src_21.0.tar.gz
cd otp_src_21.0
#编译
./otp_build autoconf
./configure
make
#安装
make install
#检验
erl
#编辑文件
vi /etc/yum/repos.d/rabbitmq-erlang/21/el/7
[rabbitmq-erlang]
name-rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/21/el/7
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1

#清楚缓存
yum clean all
yum makecache

#安装RabbitMQ
wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.7/rabbitmq-server-3.7.7.el7.noarch.rpm
#安装
yum install rabbitmq-server-3.7.7-1.el7.noarch.rpm
#添加依赖
yum install socat
#启动
service rabbitmq-server start
#查看状态
rabbitmqctl status
#开启web插件
rabbitmq-plugins enable rabbitmq-management
#重启
service rabbitmq-server restart
#添加一个用户
rabbitmqctl add_user root	root
#设置管理员
rabbitmqctl set_user_tags root administrator
#配置root可以远程登录
rabbitmqctl set_permissions -p / root ".*" ".*" ".*"

RabbitMQ用自己的电脑Web登录:
http://IP:15672/

RabbitMq消息服务(SpringBoot)
用idea连接是用的端口是5672,还有就是千万记得在安全组开放这些端口!

How to use

Direct

DirectExchange的路由策略是将消息队列绑定到一个DriectExchange上,当一条消息到达DirectExchange上,就会被转发到与该消息routing key相同的Queue上。

看看这种方式的配置:

@Configuration
public class RabbitDirectConfig {
    @Bean
    Queue queue() {
        return new Queue("hello-queue");
    }
}

创建一个Queue实例,设置他的name为"hello-queue",当有一条信息带着routing key为"hello-queue"时,就会传入这个队列中.

Fanout

FanoutExchange交换策略是把所有到达FanoutExchange的消息转发给所有跟他绑定的Queue实例上,此时就不需要routingkey了
配置如下:

@Configuration
public class RabbitFanoutConfig {
    public final static String FANOUTNAME = "panlijie-fanout";
    @Bean
    Queue queue_one() {
        return new Queue("queue-one");
    }
    @Bean
    Queue queue_two() {
        return new Queue("queue-two");
    }
    @Bean
    Queue queue_three() {
        return new Queue("queue-three");
    }
    /**
     * 创建FanoutExchange实例,用来接受传入的消息,然后转发给某些Queue信息通道
     * @return
     */
    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange(FANOUTNAME, true, false);
    }
    /**
     * 这个将通道2绑定到FanoutExchange中
     * @return Binding实例
     */
    @Bean
    Binding bindingTwo() {
        return BindingBuilder
                .bind(queue_two())
                .to(fanoutExchange());
    }
    /**
     * 这个将通道1绑定到FanoutExchange中
     * @return Binding实例
     */
    @Bean
    Binding bindingOne() {
        return BindingBuilder
                .bind(queue_one())
                .to(fanoutExchange());
    }
}

RabbitMq消息服务(SpringBoot)routingKey直接传入null,因为用不上。第三个参数传入消息内容(Object)

Topic

TopicExchange是既复杂又灵活的策略,在TopicExchange中,Queue通过routingkey绑定到TopicExchange上,当消息送到TopicExchange后,TopicExchange根据消息的routingkey将消息路由到不同的Queue中。

直接上配置

@Configuration
public class RabbitFanoutConfig {
    public final static String TOPICNAME = "panlijie-topicname";
    @Bean
    Queue queueApple() {
        return new Queue("queueApple");
    }
    @Bean
    Queue queueOrange() {
        return new Queue("queueOrange");
    }
    @Bean
    Queue queueFruit() {
        return new Queue("queueFruit");
    }
    /*
    创建topicExchange实例,name=TOPICNAME
     */
    @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange(TOPICNAME, true, false);
    }
    /*
        将以apple开头的  routingKey的待发消息传到指定topicExchange然后再传到绑定的queue通道
     */
    @Bean
    Binding bindingToApple() {
        return BindingBuilder.bind(queueApple()).to(topicExchange()).with("apple.#");
    }
    /*
        将以orange开头的  routingKey的待发消息传到指定topicExchange然后再传到绑定的queue通道
     */
    @Bean
    Binding bindingToOrange() {
        return BindingBuilder.bind(queueOrange()).to(topicExchange()).with("orange.#");
    }
    /*
        将包含fruit  routingKey的待发消息传到指定topicExchange然后再传到绑定的queue通道
     */
    @Bean
    Binding bindingToFruit() {
        return BindingBuilder.bind(queueFruit()).to(topicExchange()).with("#.fruit.#");
    }
}

RabbitMq消息服务(SpringBoot)
用到("#.fruit.#")时,fruit必须被 . 包围,不然传不到

heade

这个暂时放下

本文地址:https://blog.csdn.net/coding_deliver/article/details/109631203