消息中间件之RabbitMQ(一)基础概念及安装部署

基础概念

RabbitMQ简介

RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。

RabbitMQ支持的协议

AMQP协议

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品、不同的开发语言等条件的限制。
AMQP的实现有:RabbitMQ、OpenAMQ、Apache Qpid、Redhat Enterprise MRG、AMQP Infrastructure、ØMQ、Zyre等。

MQTT协议

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

RabbitMQ 应用场景

  • 串行变并行 减少时间
    在这里插入图片描述
  • 应用解耦
    处理性能提升 非关联模块解耦
    在这里插入图片描述
  • 串行变并行 减少时间
    在这里插入图片描述

RabbitMQ 的特性

(1)可靠性(Reliability) RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
(2)灵活的路由(Flexible Routing) 在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功 能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在 一起,也通过插件机制实现自己的 Exchange 。
(3)消息集群(Clustering) 多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。
(4)高可用(Highly Available Queues) 队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下 队列仍然可用。
(5)多种协议(Multi-protocol) RabbitMQ 支持多种消息队列协议,比如 AMQP、STOMP、MQTT 等等。
(6)多语言客户端(Many Clients) RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby、PHP、C#、 JavaScript 等等。
(7)管理界面(Management UI) RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息、集群 中的节点。
(8)插件机制(Plugin System) RabbitMQ提供了许多插件,以实现从多方面扩展,当然也可以编写自己的插件。

RabbitMQ 的工作模型

在这里插入图片描述

Broker :即RabbitMQ的实体服务器。提供一种传输服务,维护一条从生产者到消费者的传输线路,保证消息数据能按照指定的方式传输

Exchange:消息交换机。指定消息按照什么规则路由到哪个队列Queue。

Queue:消息队列。消息的载体,每条消息都会被投送到一个或多个队列中。

Binding:绑定。作用是将Exchange和Queue按照某种路由规则绑定起来。

Routing Key :路由关键字。Exchange根据Routing Key进行消息传递。定义绑定时指定的关键字称为Binding Key

Vhost:虚拟主机。一个Broker可以有多个虚拟主机,用作不同用户的权限分离。一个虚拟主机持有一组Exchange、Queue和Binding。

Producer:消息生产者。主要将消息投递到对应的Exchange上面。一般是独立的程序。

Consumer:消息消费者。消息的接收者,一般是独立的程序

Connection:Producer和Consumer与Broker之间的TCP长连接。

Channel:消息通道,也称信道。在客户端的每个连接里可以建立多个channel,每个Channel代表一个会话任务。在RabbitMQ Java Client API 中,channel上定义了大量的编程接口。

当消息生产者/(消费者)要生产/(消费)消息的时候需要与服务器建立一个长连接,在RabbitMQ中叫做Connection,为了解决客户端与服务器所产生的频繁的连接问题,由于会大量的消耗服务器内存,这里引入了消息通道的概念,在保持长连接的情况下。可以通过建立Channel的方式与服务器通讯,当有请求的时候就会建立通道,结束则关闭通道。在RabbitMQ中,一般的做法不会让消息直接发送到消息队列中,这里引入了Exchange(交换机)的概念,通过交换机来实现消息更加灵活的消息分发,交换机没有实际的进程,而队列是有的,它只是一个地址列表,在队列创建的时候会与Exchange绑定一个专属的 key ,在生产者生产消息的时候也会指定这个key,那么 Exchange 就会通过这个key去匹配 Queue,从而实现灵活分发。然后消费者会通过订阅指定的队列去消费消息。在RabbitMQ中有Virtual Host 虚拟机的概念,他可以当成是一个小型的MQ,一个RabbitMQ服务器上可以有多个虚拟机,相互之间是隔离的,当然不同的虚拟机之间可以有相同命名的交换机与队列,可以实现资源的隔离。

RabbitMQ 交换机类型

RabbitMQ有四种交换机类型,分别是Direct exchange、Fanout exchange、Topic exchange、Headers exchange。

Direct Exchange 直连交换机

定义:直连类型的交换机与一个队列绑定时,需要指定一个明确的binding key。
路由规则:发送消息到直连类型的交换机时,只有routing key跟binding key完全匹配时,绑定的队列才能收到消息。
在这里插入图片描述

channel.basicPublish(EXCHANGE_NAME,"key1",null,msg.getBytes());

Tpoic Exchange 主题交换机

定义:主题类型的交换机与一个队列绑定时,可以指定按模式匹配的routing key。

通配符有两个,*代表匹配一个单词。#代表匹配零个或者多个单词。单词与单词之间用.隔开。

路由规则:发送消息到主题类型的交换机时,routing key符合binding key的模式时,绑定的队列才能收到消息。

在这里插入图片描述

// 只有队列1能收到消息 
channel.basicPublish("MY_TOPIC_EXCHANGE", "sh.abc", null, msg.getBytes()); 
// 队列2和队列3能收到消息 
channel.basicPublish("MY_TOPIC_EXCHANGE", "bj.book", null, msg.getBytes()); 
// 只有队列4能收到消息 
channel.basicPublish("MY_TOPIC_EXCHANGE", "abc.def.food", null, msg.getBytes());

Fanout Exchange 广播交换机

定义:广播类型的交换机与一个队列绑定时,不需要指定binding key。
路由规则:当消息发送到广播类型的交换机时,不需要指定routing key,所有与之绑定的队列都能收到消息。
在这里插入图片描述

// 3个队列都会收到消息 
channel.basicPublish("MY_FANOUT_EXCHANGE", "", null, msg.getBytes());

Headers Exchanges

不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。匹配规则x-match有下列两种类型:

x-match = all :表示所有的键值对都匹配才能接受到消息。

x-match = any :表示只要有键值对匹配就能接受到消息。

安装与部署

环境
系统版本:CentOS Linux release 7.2
RabbitMQ版本:3.6.12
Erlang版本:erlang-19.0.4-1.el7.centos.x86_64
JDK版本:1.8

首先先装JDK1.8 具体操作可以参考另一篇博文

安装 Erlang

Erlang包安装:
https://www.erlang.org/downloads/19.0
下载对应安装包 otp_src_19.0.tar.gz
在这里插入图片描述
添加依赖:

yum install ncurses-devel
yum list | grep ssl 
yum install openssl-devel
yum list | grep ODBC
yum install unixODBC-devel
yum install gcc-c++yum install fop.noarch
apt install libwxgtk3.0-dev
yum install -y gcc gcc-c++
yum -y install gtk2-devel binutils-devel
yum install mesa-libGLU-devel.x86_64
yum install unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel
yum install fop.noarch

或者安装erlang运行依赖

yum -y install gcc glibc-devel make ncurses-devel openssl-devel xmlto perl wget

安装
解压:

tar -xf otp_src_19.0.tar.gz 

重命名下

mv otp_src_19.0 otp

进入目录安装:

./configure --prefix=/usr/local/erlang --without-javac & make & make install

发现出现如下情况
在这里插入图片描述
需要安装wxWidgets:

wget https://netix.dl.sourceforge.net/project/wxwindows/3.0.1/wxWidgets-3.0.1.tar.bz2
bzip2 -dkv wxWidgets-3.0.1.tar.bz2
tar -xvf wxWidgets-3.0.1.tar
cd wxWidgets-3.0.1/
./configure --with-opengl --enable-debug --enable-unicode
make && make install

修改如下:

./configure --prefix=/usr/local/erlang
make && make install

进入erlang bin

cd /usr/local/erlang/bin

执行

./erl 

出现以下即安装完成
在这里插入图片描述
配置环境变量

export PATH=$PATH:/usr/local/erlang/bin

安装RabbitMQ

下载安装包:http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.12/
选择 rabbitmq-server-generic-unix-3.6.12.tar.xz 下载

上传至服务器,我这边放在 /mysoft 下。
Mq安装包默认是xz结尾的,解压xz文件后得到tar文件

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

执行解压命令

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

添加环境变量:

export PATH=$PATH:/mysoft/rabbitmq_server-3.6.12/sbin

环境变量生效:

source  /etc/profile

配置网页插件:

首先创建目录,否则可能报错:

mkdir /etc/rabbitmq 

rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问。如果想使用guest/guest通过远程机器访问,需要在rabbitmq配置文件中(/mysoft/rabbitmq_server-3.6.12/etc/rabbitmq/rabbitmq.config)中设置loopback_users为[]。rabbitmq.config文件需要自己创建,完整内容如下(注意后面的半角句号):

[{rabbit, [{loopback_users, []}]}].

启动mq及启动插件:

./rabbitmq-server -detached
./rabbitmq-plugins enable rabbitmq_management

访问 http://192.168.40.128:15672 ,通过guest/guest 登陆
在这里插入图片描述
查看服务状态:

rabbitmqctl status

关闭服务:

rabbitmqctl stop

查看mq用户:

rabbitmqctl list_users

查看用户权限:

rabbitmqctl list_user_permissions guest

新增用户:

rabbitmqctl add_user admin 123456

设置角色:

rabbitmqctl set_user_tags admin administrator

赋予管理员权限:

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

rabbitmqctl set_permissions -p [Vhost_Name][username][conf][write][read]
conf:一个正则表达式match哪些配置资源能够被该用户访问
write:一个正则表达式match哪些配置资源能够被该用户读。
read:一个正则表达式match哪些配置资源能够被该用户访问

更改rabbitmq的环境变量

默认状态下 日志存放位置 /mysoft/rabbitmq_server-3.6.12/var/log/rabbitmq 下面,通过查看日志,在启动的时候会输出以下信息:

=INFO REPORT==== 2-Aug-2020::13:41:22 ===
Starting RabbitMQ 3.6.12 on Erlang 19.0
Copyright (C) 2007-2017 Pivotal Software, Inc.
Licensed under the MPL.  See http://www.rabbitmq.com/

=INFO REPORT==== 2-Aug-2020::13:41:22 ===
node           : rabbit@localhost
home dir       : /root
config file(s) : /mysoft/rabbitmq_server-3.6.12/etc/rabbitmq/rabbitmq.config (not found)
cookie hash    : wxw8uUMf88reFagmfV8QVA==
log            : /mysoft/rabbitmq_server-3.6.12/var/log/rabbitmq/rabbit@localhost.log
sasl log       : /mysoft/rabbitmq_server-3.6.12/var/log/rabbitmq/rabbit@localhost-sasl.log
database dir   : /mysoft/rabbitmq_server-3.6.12/var/lib/rabbitmq/mnesia/rabbit@localhost

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Memory high watermark set to 391 MiB (410145587 bytes) of 977 MiB (1025363968 bytes) total

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Enabling free disk space monitoring

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Disk free limit set to 50MB

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Limiting to approx 924 file handles (829 sockets)

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
FHC read buffering:  OFF
FHC write buffering: ON

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Database directory at /mysoft/rabbitmq_server-3.6.12/var/lib/rabbitmq/mnesia/rabbit@localhost is empty. Initialising from scratch...

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Waiting for Mnesia tables for 30000 ms, 9 retries left

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Waiting for Mnesia tables for 30000 ms, 9 retries left

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Waiting for Mnesia tables for 30000 ms, 9 retries left

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Priority queues enabled, real BQ is rabbit_variable_queue

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Starting rabbit_node_monitor

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Adding vhost '/'

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Creating user 'guest'

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Setting user tags for user 'guest' to [administrator]

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Setting permissions for 'guest' in '/' to '.*', '.*', '.*'

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
msg_store_transient: using rabbit_msg_store_ets_index to provide index

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
msg_store_persistent: using rabbit_msg_store_ets_index to provide index

=WARNING REPORT==== 2-Aug-2020::13:41:23 ===
msg_store_persistent: rebuilding indices from scratch

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
started TCP Listener on [::]:5672

=INFO REPORT==== 2-Aug-2020::13:41:23 ===
Server startup complete; 0 plugins started.

=INFO REPORT==== 2-Aug-2020::13:43:40 ===
Management plugin: using rates mode 'basic'

=INFO REPORT==== 2-Aug-2020::13:43:40 ===
Management plugin started. Port: 15672

=INFO REPORT==== 2-Aug-2020::13:43:40 ===
Statistics database started.

=INFO REPORT==== 2-Aug-2020::13:43:40 ===
Stopping RabbitMQ applications and their dependencies in the following order:

=INFO REPORT==== 2-Aug-2020::13:43:40 ===
Plugins changed; enabled [amqp_client,cowlib,cowboy,rabbitmq_web_dispatch,
                          rabbitmq_management_agent,rabbitmq_management], disabled []

=WARNING REPORT==== 2-Aug-2020::13:47:11 ===
HTTP access denied: user 'guest' - User can only log in via localhost

=INFO REPORT==== 2-Aug-2020::13:55:14 ===
Starting RabbitMQ 3.6.12 on Erlang 19.0
Copyright (C) 2007-2017 Pivotal Software, Inc.
Licensed under the MPL.  See http://www.rabbitmq.com/

=INFO REPORT==== 2-Aug-2020::13:55:14 ===
node           : rabbit@localhost
home dir       : /root
//配置文件位置
config file(s) : /mysoft/rabbitmq_server-3.6.12/etc/rabbitmq/rabbitmq.config
cookie hash    : wxw8uUMf88reFagmfV8QVA==
//日志文件
log            : /mysoft/rabbitmq_server-3.6.12/var/log/rabbitmq/rabbit@localhost.log
sasl log       : /mysoft/rabbitmq_server-3.6.12/var/log/rabbitmq/rabbit@localhost-sasl.log
//数据库位置
database dir   : /mysoft/rabbitmq_server-3.6.12/var/lib/rabbitmq/mnesia/rabbit@localhost
//内存信息
=INFO REPORT==== 2-Aug-2020::13:55:15 ===
Memory high watermark set to 391 MiB (410145587 bytes) of 977 MiB (1025363968 bytes) total

=INFO REPORT==== 2-Aug-2020::13:55:15 ===
Enabling free disk space monitoring

=INFO REPORT==== 2-Aug-2020::13:55:15 ===
Disk free limit set to 50MB

=INFO REPORT==== 2-Aug-2020::13:55:15 ===
Limiting to approx 924 file handles (829 sockets)

=INFO REPORT==== 2-Aug-2020::13:55:15 ===
FHC read buffering:  OFF
FHC write buffering: ON

=INFO REPORT==== 2-Aug-2020::13:55:15 ===
Waiting for Mnesia tables for 30000 ms, 9 retries left

=INFO REPORT==== 2-Aug-2020::13:55:15 ===
Waiting for Mnesia tables for 30000 ms, 9 retries left

=INFO REPORT==== 2-Aug-2020::13:55:15 ===
Priority queues enabled, real BQ is rabbit_variable_queue

=INFO REPORT==== 2-Aug-2020::13:55:15 ===
Starting rabbit_node_monitor

=INFO REPORT==== 2-Aug-2020::13:55:15 ===
Management plugin: using rates mode 'basic'

=INFO REPORT==== 2-Aug-2020::13:55:15 ===
msg_store_transient: using rabbit_msg_store_ets_index to provide index

=INFO REPORT==== 2-Aug-2020::13:55:15 ===
msg_store_persistent: using rabbit_msg_store_ets_index to provide index

=WARNING REPORT==== 2-Aug-2020::13:55:15 ===
msg_store_persistent: rebuilding indices from scratch
//AMQP端口
=INFO REPORT==== 2-Aug-2020::13:55:15 ===
started TCP Listener on [::]:5672
//管理端口
=INFO REPORT==== 2-Aug-2020::13:55:15 ===
Management plugin started. Port: 15672
//数据库加载完成
=INFO REPORT==== 2-Aug-2020::13:55:15 ===
Statistics database started.
//插件加载
=INFO REPORT==== 2-Aug-2020::13:55:15 ===
Server startup complete; 6 plugins started.
 * rabbitmq_management
 * rabbitmq_web_dispatch
 * rabbitmq_management_agent
 * amqp_client
 * cowboy
 * cowlib

=INFO REPORT==== 2-Aug-2020::13:55:25 ===
Stopping RabbitMQ applications and their dependencies in the following order:

=INFO REPORT==== 2-Aug-2020::13:55:25 ===
Plugins changed; enabled [], disabled []

这段日志包含了RabbitMQ的版本号、Erlang的版本号、RabbitMQ服务节点名称、cookie的hash值、RabbitMQ配置文件地址、内存限制、磁盘限制、默认账户guest的创建以及权限配置等等。

创建环境变量配置文件

vi /mysoft/rabbitmq_server-3.6.12/etc/rabbitmq/rabbitmq-env.conf 
RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia //数据库位置
RABBITMQ_LOG_BASE=/data/rabbitmq/log //日志文件目录

创建数据库目录及日志目录:

mkdir  /data/rabbitmq/mnesia
mkdir  /data/rabbitmq/log 
chowm -R rabbitmq:rabbitmq /data/rabbitmq

RabbitMQ配置说明

配置属性、 说明以及默认值如下所示

spring.rabbitmq.addresses:客户端连接的地址, 有多个的时候使用逗号分隔 , 该地址可以是IP与Port的结合
spring.rabbitmq.cache.channel.checkout-timeout:当缓存已满时,获取Channel的等待时间,单位为毫秒
spring.rabbitmq.cache.channel.size:缓存中保待的Channel数量
spring.rabbitmq.cacbe.connection.mode:连接缓存的模式,默认 CHANNEL
spring.rabbitmq.cache.connection.size:缓存的连接数
spring.rabbitmq.connection-timeout:连接超时参数, 单位为毫秒; 设置为"0"代表无穷大
spring.rabbitmq.dynamic:默认创建 一 个 AmqpAdmin的Bean ,默认值true
spring.rabbitmq.host:RabbitMQ的主机地址 localhost
spring.rabbitmq.listener.acknowledge-mode:容器的acknowledge 模式
spring.rabbitmq.listener.auto-startup:启动时自动启动容器 true
spring.rabbitmq.listener.concurrency:消费者的最小数量
spring.rabbitmq.listener.default-requeue-rejected:投递失败时是否重新排队 true
spring.rabbitmq. Iistener.max-concurrency:消费者的最大数噩
spring.rabbitmq.listener.prefetch:在单个请求中处理的消息个数, 它应该大于等于事务数量
spring.rabbitmq.listener.retry.enabled:不论是不是重试的发布 false
spring.rabbitmq.listener.retry.initial-interval:第 一 次与第二次投递尝试的时间间隔 1000
spring.rabbitmq.listener.retry.max-attempts :尝试 投递消息的最大数量 3
spring.rabbitmq.listener.retry.max-interval: 两次尝试的最大 时间间隔 10000
spring.rabbitmq.listener.retry.multiplier: 上 一 次尝试 时间间隔的乘数 1.0
spring.rabbitmq.listener.retry.stateless: 不论重试是有状态的还是无状态的 true
spring.rabbitmq.listener.transaction-size: 在 一 个 事务中处理的消息数量。 为了获得最佳效果, 该值应设置为小于等于每个请求中处 理 的 消 息个数, 即 spring.rabbitmq. listener.prefetch的值
spring.rabbitmq.password: 登录到RabbitMQ的密码
spring.rabbitmq.port:RabbitMQ的端口号 5672
spring.rabbitmq.publisher-confinns: 开启Publisher Confirm机制 false
spring rabbitmq publisher-returns: 开启PublisherReturn机制 false
spring rabbitmq.requested-heartbeat: 请求心跳超时时间, 单位为秒
spring rabbitmq.ssl.enabled: 启用SSL支持 false
spring.rabbitmq.ssl.key-store: 保存SSL证书的地址
spring.rabbitmq.ssl.key-store-password: 访问SSL证书的地址使用的密码
spring.rabbitmq.ssl.trust-store: SSL的可信地址
spring.rabbitmq.ssl.trust-store-password: 访问SSL的可信地址的密码
spring.rabbitmq.ssl.algonthm: SSL算法,默认使用Rabbit的客户端算法库
spring.rabbitmq.template.mandatory: 启用强制消息 false
spring.rabbitmq.template.receive-timeout: receive ()方法的超时时间 。
spring.rabbitmq.template.reply-timeout: sendAndReceive()方法的超时时间 5000
spring.rabbitmq.template.retry.enabled :设置为true的时候RabbitTemplate能够实现重试 false
spring.rabbitmq.template.retry.initial-interval: 第 一 次与第二次发布消息的时间间隔 1000
spring.rabbitmq.template retry.max-attempts :尝试发布消息的最大数量 3
spring.rabbitmq.template.retry.max-interval :尝试发布消息的最大时间间隔 10000
spring.rabbitmq.template.retry.multiplie:r 上 一 次尝试时间间隔的乘数 1.0
spring.rabbitmq. usemame: 登录到RabbitMQ的用户名
spring.rabbitmq.virtual-host: 连接到Rabb1tMQ的虚拟主机

本套餐将包括两个重磅性的课程与一个赠送学习的课程,分别为SpringBoot实战视频教程与RabbitMQ实战教程跟SSM整合开发之poi导入导出Excel。目的是为了让各位小伙伴可以从零基础一步一个脚印学习微服务项目的开发,特别是SpringBoot项目的开发,之后会进入第二个课程:RabbitMQ的实战,即消息中间件在实际项目或者系统中各种业务模块的实战并解决一些常见的典型的问题!核心的知识点分别包括 一、SpringBoot实战历程课程 (1)SpringBoot实战应用场景的介绍与代码实战 (2)发送邮件服务、上传下载文件服务、Poi导入导出Excel (3)单模块与多模块项目构建、项目部署打包、日志、多环境配置、lombok、validator以及mybatis整合实战跟多数据源实战 (4)Redis缓存中间件的实战与缓存雪崩跟缓存穿透等问题的解决实战 (5)RabbitMQ消息中间件在业务模块异步解耦、通信、消息确认机制以及并发量配置等的实战 二、RabbitMQ实战教程课程 (1)RabbitMQ的官网权威技术手册拜读,认识并理解各大专有名词,如队列,交换机,路由,死信队列,消息确认机制等等 (2)RabbitMQ在业务服务模块之间的异步解耦通信实战,如异步记录日志与发送邮件等 (3)商城系统抢单高并发情况下RabbitMQ的限流作用与代码实战 (4)消息确认机制与并发量配置并用来实战商城用户下单 (5)死信队列深入讲解与DLX,DLK,TTL等概念的讲解并用来实战 “支付系统用户下单后支付超时而失效其下单记录”实战 详情,各位小伙伴可以查看两个课程的目录。相信学完该套餐相关课程后,你的实战能力将大大提升!涨薪将不再遥遥无期! 最后,赠送的SSM整合开发之POI导入导出Excel目的是为了让各位小伙伴也可以学习Spring+SpringMVC+Mybatis整合开发的项目,让大家一对比SpringBoot与SPring的项目开发流程以及复杂程度!!! 相信学完之后,你会对SpringBoot爱不释手!!
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页