zoukankan      html  css  js  c++  java
  • rabbitmq 的简单使用

    1. RabbitMQ安装

    (1) 什么是RabbitMQ?

    (2) 什么是Erlang?

    Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab 开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境

    (3) 如何在Linux环境中安装RabbitMQ?

    1、首先自己创建一个目录,我在usr/local下创建了一个erlang目录,cd到该目录下

    2、在这个目录下下载最新版本的erlang,当前版本是20.0

    3、下载完后查看目录,

    4、解压下载好的文件

    5、编译安装Erlang对环境有要求,为防止在编译的时候提示某些软件包未安装之类的错误,所以我将Erlang需要的软件提前安装,直接使用yum进行安装即可。

    yum install ncurses ncurses-base ncurses-devel ncurses-libs ncurses-static ncurses-term ocaml-curses ocaml-curses-devel -y

    yum install openssl-devel zlib-devel –y

    yum -y install make ncurses-devel gcc gcc-c++ unixODBC unixODBC-devel openssl openssl-devel

    三条yum命令都执行完之后,开始编译安装erlang

    回到我们刚创建的erlang目录下,进到解压完的文件夹内

    6、然后再configure 。prefix后面指定的是安装目录,此时我把Erlang安装到了/opt/erlang目录下

    ./configure --prefix=/opt/erlang --with-ssl -enable-threads -enable-smmp-support -enable-kernel-poll --enable-hipe --without-javac

    出现以下内容说明已经配置完毕

    7、接下来使用编译命令

    make&&make install

    到make这一步需要大约10分钟左右。。。

    安装完成后做个软连接

    ln -s /opt/erlang/bin/erl /usr/local/bin/erl

    测试Erlang的安装是否成功:

    cd /usr/local/bin

    erl

    会出现如下的提示信息

    Erlang/OTP 20 [erts-9.0] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:10] [hipe] [kernel-poll:false]

    Eshell V9.0 (abort with ^G)

    1>

    在1>后面输入EvenN = lists:filter (fun (N) -> N rem 2 == 0 end, lists:seq (1,100)).

    会出现下面提示信息

    [2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,

    44,46,48,50,52,54,56,58|...]

    2>

    然后输入halt().

    到此时说明Erlang已经安装成功,下面我们要修改环境变量。

    vim /etc/profile

    我们移到最后一行,在这里我们输入以下信息

    ERLANG_HOME=opt/erlang

    PATH=$ERLANG_HOME/bin:$PATH

    export ERLANG_HOME

    export PATH

    具体效果如下图

    然后保存并退出。保存后重新激活使环境变量生效

    source /etc/profile

    验证是否已经追加成功

    echo $ERLANG_HOME

    上面命令会显示以下信息

    opt/erlang

    echo $PATH

    上面命令会显示以下信息

    opt/erlang/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/lmy/bin

    OK,到现在为止我们的Erlang安装完成啦!!

    下载最新版的rabbitmq,当前最新版本为3.6.10

    还是回到之前在local创建的erlang目录下

    使用命令

    wget 

    在这里使用wget命令的时候,会出现报错信息,显示当前openssl的版本太低,需要进行更新,我们使用命令yum update -y wget,yum完成之后再执行上面的wget命令

    查看下载的文件

    下载下来的文件名为rabbitmq-server-generic-unix-3.6.10.tar.xz。这里需要注意,下载下来的文件是.xz后缀,我们需要下载安装xz解压软件

    使用命令

    yum -y install xz

    然后解压rabbitmq

    xz -d rabbitmq-server-generic-unix-3.6.10.tar.xz

    tar -xvf rabbitmq-server-generic-unix-3.6.10.tar

    将解压好的文件移动到我的安装目录下去:

    mv rabbitmq_server-3.6.10 /opt/

    然后进到rabbitmq的sbin目录下

    这时候我们有两种启动方式,一种是前台启动,还有一种是后台启动

    命令分别是

    直接启动 ./rabbitmq-server 
    后台启动 ./rabbitmq-server -detached 
    开启插件管理页面 ./rabbitmq-plugins enable rabbitmq_management
    关闭服务 ./rabbitmqctl stop

    在这里我们还需要设置登录的账号和密码

    ./rabbitmqctl add_user admin 123456

    然后设置该用户的类型

    ./rabbitmqctl set_user_tags admin administrator

    再给这个用户设置权限

    ./rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

    由于我们要使用页面管理,所以需要在启动后开启页面插件,然后关闭防火墙在window中使用ip地址登录

    输入刚才设置好的账号和密码进行登录

    看到右上角的账号和版本信息,就表示rabbitmq已经成功运行

    2. 为什么要用RabbitMQ

    (1) 什么要使用RabbitMQ?

    异步削峰和解耦

    (2) RabbitMQ解决了什么问题?

    异步削峰和解耦

    3. 消息队列基础讲解

    (1) 什么是Provider?

    消息的生成者 ,就是投递消息的程序

    (2) 什么是Consumer?

    消息的消费者,接受消息的程序

    (3) 什么是队列?

    存放消息的队列,是生产商品和给购买商品的用户之间的中转站

    (4) 队列里存储了什么?

    在 rabbitMQ 中,信息流从你的应用程序出发,来到 Rabbitmq 的队列,所有信息可以只

    存储在一个队列中。队列可以存储很多信息,因为它基本上是一个无限制的缓冲区,前提是

    你的机器有足够的存储空间。

    (5) 队列和应用程序的关系是什么?

    多个生产者可以将消息发送到同一个队列中,多个消息者也可以只从同一个队列接收数

    据。

    4. 消息队列入门案例-环境搭建

    (1) 如果现在项目中使用RabbitMQ需要添加Spring Boot的什么启动器?

    <dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-amqp</artifactId>

    </dependency>

    (2) 在项目的全局配置文件中需要配置哪些内容?

    spring.application.name=springcloud-mq

    spring.rabbitmq.host=192.168.70.131spring.rabbitmq.port=5672

    spring.rabbitmq.username=oldlu

    spring.rabbitmq.password=123456

    5. 消息队列入门案例-编码

    (1) 创建队列对象的名称是什么?

    #error 队列名称

    mq.config.queue.error=log.error

    (2) 能够发送消息的方法名称是什么?

    (3) 监听队列的注解名称是什么?

    @RabbitListener

    分享/讲解/扩展思考

    点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。

    第226次(RabbitMQ)

    学习主题:RabbitMQ

    学习目标:

    对应视频:

    对应文档:

    对应作业

    6. RabbitMQ原理讲解

    (1) 什么是交换器?

    指定消息队列处理存放消息的

    用来接受生产者发送的消息并将这些消息路由给服务器中的队列

    (2) 常见的交换器类型有哪些?

    1. direct(发布与订阅,完全匹配)

    2. Fanout(广播)

    3. Topic(主题,规则匹配)

    (3) 什么是Routing-key?

    路由键.RabbutMQ决定消息该投递到那个队列的规则

    队列通过路由键绑定到交换器

    消息发送到MQ服务器时,消息将用于一个路由键,即便是空的,RabbitMQ也会将其和绑定使用的路由键进行匹配

     

    如果相匹配,消息将会投递到该队列

    如果不匹配.消息将会进入黑洞

    (4) 什么是Channel?

    信道

    1. Channel中文叫做信到 是TCP里面的虚拟连接.例如.电缆相当于TCP.信道是一个独立光纤束,一条TCP连接上创建多条信道是没有问题的

    2. TCP一旦打开,就会创建AMQP信道

    3. 无论是发布消息,接受消息,订阅队列,这些动作都是通过信道完成的

    (5) 交换器与队列的关系是什么?

    交换器是通过路由键和队列绑定在一起的,如果消息拥有的路由键跟队列和交换器的路由键相匹配,那么雄安锡就会路由器绑定到该队列中

    也就是说,消息到队列的过程中,消息首先会经过交换器,接下来交换器在通过路由键匹配分发消息到具体的队列中

    (6) RabbitMQ为什么需要信道?为什么不使用TCP协议直接通信

    1. TCP的创建和销毁开销特别大,创建需要3次握手,销毁需要4次分手

    2. 如果不用信道,那应用程序就会以TCP连接Rabbit,高峰时每秒成千上万连接会造成资源巨大的浪费,而且操作系统每秒处理TCP连接数也是有限制的,必定造成性能瓶颈

    3. 信道的原理是一条线程一条通道,多条线程多条通道同用一条TCP链接.,一条TCP链接可以容纳无限的信道,即使每秒成千上万的请求也不会成为性能的瓶颈

    7. Direct交换器-搭建环境

    (1) 什么是Direct交换器?

    (2) 如何在全局配置文件中配置交换器名称?

    #设置交换器的名称
    mq.config.exchange=log.direct

    #info队列名称
    mq.config.queue.info=

    #info路由键
    mq.config.queue.info.routing.key=log.info.routing.key

    #error队列名称
    mq.config.queue.error=log.error

    #error路由键
    mq.config.queue.error.routing.key=log.error.routing.key

    (3) 如何在全局配置文件中配置队列名称?


    #error队列名称
    mq.config.queue.error=log.error

    (4) 如何在全局配置文件中配置路由键?

    #error路由键
    mq.config.queue.error.routing.key=log.error.routing.key

    8. Direct交换器-编写消费者

    (1) @RabbitHandler的作用是什么?

    将消息进入队列时会触发注解下的方法 消息队列监听机制

    (2) @RabbitListener注解中的bindings属性的作用是什么?

    绑定队列

    (3) @QueueBinding注解中的value属性的作用是什么?

    绑定队列的名称

    (4) @QueueBinding注解中的exchange属性的作用是什么?

    配置交换器

    (5) @QueueBinding注解中的key属性的作用是什么?

    设置路由键

    (6) @Exchange注解中的value属性的作用是什么?

    为交换器起个名称

    (7) @Exchange注解中的type属性的作用是什么?

    指定具体的交换器类型

    9. Direct交换器-编写生产者

    (1) AmqpTemplate中的converteAndSend(arg0,arg1,arg2)中的三个参数分别表示什么含义?

    Arg0: 交换器名称

    Arg1: 路由键

    Arg2: 消息

    10. Topic交换器-搭建环境

    (1) 什么是Topic交换器?

    类似模糊匹配机制的交换器

    11. Topic交换器-编写消费者

    (1) 如何在消息消费者的注解中指定交换器与路由规则?

    /**
    * 消息接受者
    * @author Administrator
    * @RabbitListener Bingings:绑定队列
    * @QueueBinging value:绑定队列的名称
    * exchange:配置交换器
    * @Queue value:配置队列名称
    * autoDelete:是否是一个可删除的临时队列
    * @Exchange value:为交换器起个名称
    * type:指定具体的交换器类型
    *
    *
    */

    @Component
    @RabbitListener(
    bindings = @QueueBinding(
    value = @Queue(value = "${}",autoDelete = "true"),
    exchange = @Exchange(value = "${mq.config.exchange}",type = ExchangeTypes.TOPIC),
    key = "*."

    )
    )
    public class InfoReceiver {

    /*
    * 采用消息队列监听模式
    * */
    @RabbitHandler
    public void receive(Object msg){
    //向消息队列发送消息
    //参数一:交换器名称。
    //参数二:路由键
    //参数三:消息
    System.out.println("接受 info 信息"+msg);
    }
    }

    12. Fanout交换器-搭建环境

    (1) 什么是Fanout交换器?

    类似于订阅广播机制的交换器

    13. 什么是服务注册中心

    (1) 什么是服务的注册中心?

    服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者url串,路由信息等,服务注解中心是SOA架构中最基础的设施之一

    (2) 服务的注册中心的作用是什么?

    1. 服务的注册

    2. 服务的发现

    (3) 常见的注册中心有哪些?

    1. Dubbo的注册中心Zookeeper

    2. Springcloud的注册中心Eureka

    14. 注册中心解决了什么问题

    (1) 注册中心主要解决了什么问题?

    1. 服务管理

    2. 服务的依赖关系管理

    15. 什么是Eureka注册中心

    (1) 什么是Eureka注册中心?

    Eureka是Netflix开发的服务发现组件,本身是一个基于Rest的服务,Spring Cloud将它集成在其项目 sprin-cloud-netflix中,以实现Spring Cloud的服务注册于发现,同时还提供了负载均衡,故障转移等能力

    (2) Eureka注册中心有几种角色?每种角色的代表什么?

    1. Eureka Server

    通过Register,Get,Renew等接口提供服务的注册和发现

    2. Application Service(Service Provider)

    服务提供方

    把自身的服务实例注册到Eureka Server中

    3. Application Client(Service Consumer)

    服务调用方

    通过Eureka Server获取服务列表 ,消费服务

  • 相关阅读:
    推荐一款Notepad++主题Dracula
    一个小工具,利用php把指定目录文件递归上传到阿里云OSS
    svn2个小问题的解决
    借助Algorithmia网站API:用AI给黑白照片上色,复现记忆中的旧时光
    C++@sublime GDB调试
    C++@重载函数
    C++@语句块
    C++@命名空间(转)
    《Linux与Qt程序设计》知识框架
    多线程中的使用共享变量的问题 (转)
  • 原文地址:https://www.cnblogs.com/well-666/p/12934436.html
Copyright © 2011-2022 走看看