您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

深入剖析 rabbitMQ

时间:2021-03-11 09:48:47  来源:Java高级架构师  作者:

一、关于 RabbitMQ

说到 RabbitMQ,相信大家都不会陌生,微服务开发中必不可少的中间件。

深入剖析 rabbitMQ

 

在上篇关于消息队列的文章中,我们了解到 RabbitMQ 本质其实是用 Erlang 开发的 AMQP(Advanced Message Queuing Protocol )的具体实现,最初起源于金融系统,主要用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面有着不俗的表现。

2010年4月,RabbitMQ 科技公司被 VMware 旗下的 SpringSource 收购,在 2013 年 5 月被并入 Pivotal 。

其实 VMware,Pivotal 本质上是一家的。不同的是,VMware 是独立上市子公司,而 Pivotal 是整合了EMC的某些资源,现在并没有上市。其中我们现在使用的 Spring 系列框架,就是 Pivotal 公司热门的产品之一。

直到后来 Pivotal 将其开源,RabbitMQ 才逐渐走向大众!

RabbitMQ 发展到今天,已经被越来越多的人认可,尤其是互联网公司,已经有着大规模的场景应用,今天我们就一起来深入了解一下 RabbitMQ。

二、RabbitMQ 模型介绍

2.1、内部结构分析

上面我们有说到 RabbitMQ 本质是 AMQP 协议的一个开源实现,在详细介绍 RabbitMQ 之前,我们先来看一下 AMQP 的内部结构图!

深入剖析 rabbitMQ

 

基本概念如下

  • Publisher:消息的生产者,也是一个向交换器发布消息的客户端应用程序
  • Exchange:交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
  • Binding:绑定,用于将消息队列和交换器之间建立关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将它理解成一个由绑定构成的路由表。
  • Queue:消息队列,用来保存消息直到发送给消费者
  • Connection:网络连接,比如一个 TCP 连接
  • Channel:信道,多路复用连接中的一条独立的双向数据流通道
  • Consumer:消息的消费者,表示一个从消息队列中取得消息的客户端应用程序
  • Virtual Host:虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 /
  • Broker:表示消息队列服务器实体
  • Message:消息实体,它由消息头和消息体组成。消息头主要由路由键、交换器、队列、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等属性组成,而消息体就是指具体的业务对象

相比传统的 JMS 模型,AMQP 主要多了 ExchangeBinding 这个新概念。

在 AMQP 模型中,消息的生产者不是直接将消息发送到Queue队列,而是将消息发送到Exchange交换器,其中还新加了一个中间层Binding绑定,作用就是通过路由键Key将交换器和队列建立绑定关系。

深入剖析 rabbitMQ

 

就好比类似用户表角色表,中间通过用户角色表来将用户和角色建立关系,从而实现关系绑定,在 RabbitMQ 中,消息生产者不直接跟队列建立关系,而是将消息发送到交换器之后,由交换器通过已经建立好的绑定关系,将消息发送到对应的队列!

RabbitMQ 最终的架构模型,核心部分就变成如下图所示:

深入剖析 rabbitMQ

 

从图中很容易看出,与 JMS 模型最明显的差别就是消息的生产者不直接将消息发送给队列,而是由Binding绑定决定交换器的消息应该发送到哪个队列,进一步实现了在消息的推送方面,更加灵活!

2.2、交换器分发策略

当消息的生产者将消息发送到交换器之后,是不会存储消息的,而是通过中间层绑定关系将消息分发到不同的队列上,其中交换器的分发策略分为四种:Direct、Topic、Headers、Fanout!

  • Direct:直连类型,即在绑定时设定一个 routing_key, 消息的 routing_key 匹配时, 才会被交换器投送到绑定的队列中去,原则是先匹配、后投送
  • Topic:按照规则转发类型,支持通配符匹配,和 Direct 功能一样,但是在匹配 routing_key的时候,更加灵活,支持通配符匹配,原则也是先匹配、后投送
  • Headers:头部信息匹配转发类型,根据消息头部中的 header attribute 参数类型,将消息转发到对应的队列,原则也是先匹配、后投送
  • Fanout:广播类型,将消息转发到所有与该交互机绑定的队列上,不关心 routing_key;

2.2.1、Direct

Direct 是 RabbitMQ 默认的交换机模式,也是最简单的模式,消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中。

如果传入的 routing key 为 black,不会转发到black.green。Direct 类型交换器是完全匹配、单播的模式

深入剖析 rabbitMQ

 

2.2.2、Topic

Topic 类型交换器转发消息和 Direct 一样,不同的是:它支持通配符转发,相比 Direct 类型更加灵活!

两种通配符:*只能匹配一个单词,#可以匹配零个或多个。

如果传入的 routing key 为 black#,不仅会转发到black,也会转发到black.green。

深入剖析 rabbitMQ

 

2.2.3、Headers

headers 也是根据规则匹配, 相比 direct 和 topic 固定地使用 routing_key , headers 则是通过一个自定义匹配规则的消息头部类进行匹配。

在队列与交换器绑定时,会设定一组键值对规则,消息中也包括一组键值对( headers 属性),当这些键值对有一对, 或全部匹配时,消息被投送到对应队列。

此外 headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了。

深入剖析 rabbitMQ

 

2.2.4、Fanout

Fanout 类型交换器与上面几个不同,不管路由键或者是路由模式,会把消息发给绑定给它的全部队列,如果配置了 routing_key 会被忽略,也被成为消息广播模式。很像子网广播,每台子网内的主机都获得了一份复制的消息

fanout 类型转发消息在四种类型中是最快的。

深入剖析 rabbitMQ

 

三、RabbitMQ 安装

RabbitMQ 基于 erlang 进行通信,相比其它的软件,安装有些麻烦,为了跟生产环境保持一直,操作系统选择centos7,不过本例采用rpm方式安装,任何新手都可以完成安装,过程如下!

3.1、安装前命令准备

输入如下命令,完成安装前的环境准备。

yum install lsof  build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz wget vim

3.2、下载 RabbitMQ、erlang、socat 的安装包

本次下载的是RabbitMQ-3.6.5版本,采用rpm一键安装,适合新手直接上手。

先创建一个rabbitmq目录,本例的目录路径为/usr/App/rabbitmq,然后在目录下执行如下命令,下载安装包!

  • 下载erlang
wget www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos.x86_64.rpm
  • 下载socat
wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm
  • 下载rabbitMQ
wget www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-3.6.5-1.noarch.rpm

最终目录文件如下:

深入剖析 rabbitMQ

 

3.3、安装软件包

下载完之后,按顺序依次安装软件包,这个很重要哦~

  • 安装erlang
rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
  • 安装socat
rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm
  • 安装rabbitmq
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm

安装完成之后,修改rabbitmq的配置,默认配置文件在
/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin目录下。

vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app

修改loopback_users节点的值!

深入剖析 rabbitMQ

 

最后只需通过如下命令,启动服务即可!

rabbitmq-server start &

运行脚本之后,如果报错,例如下图!

深入剖析 rabbitMQ

 

解决办法如下:

vim /etc/rabbitmq/rabbitmq-env.conf

在文件里添加一行,如下配置!

NODENAME=rabbit@localhost

然后,再保存!再次以下命令启动服务!

rabbitmq-server start &

通过如下命令,查询服务是否启动成功!

lsof -i:5672

如果出现5672已经被监听,说明已经启动成功!

深入剖析 rabbitMQ

 

3.4、启动可视化的管控台

输入如下命令,启动控制台!

rabbitmq-plugins enable rabbitmq_management

用浏览器打开http://ip:15672,这里的ip就是 CentOS 系统的 ip,结果如下:

深入剖析 rabbitMQ

 

账号、密码,默认为guest,如果出现无法访问,检测防火墙是否开启,如果开启将其关闭即可!

登录之后的监控平台,界面如下:

深入剖析 rabbitMQ

 

四、web界面使用

相比其他的消息队列,rabbitMQ 其中一个很明显的好处就是有 web 操作界面,而且简单易用。

进入 web 管理界面之后,可以很清晰的看到分了 6 个菜单目录,分别是:Overview、Connections、Channels、Exchanges、Queues、Admin

  • Overview:总览概述,主要介绍 rabbitmq 一些基础汇总等信息
深入剖析 rabbitMQ

 

  • Connections:连接池管理,主要介绍客户端连接等信息
深入剖析 rabbitMQ

 

  • Channels:信道管理,主要介绍信道连接等信息
深入剖析 rabbitMQ

 

点击具体某个具体的信道,可以看到对应的消费队列等信息。

深入剖析 rabbitMQ

 

  • Exchanges:交换器管理,主要介绍交换器等信息
深入剖析 rabbitMQ

 

  • Queues:队列管理,主要介绍队列等信息
深入剖析 rabbitMQ

 

  • Admin:系统管理,主要介绍用户、虚拟主机、权限等信息
深入剖析 rabbitMQ

 

下面,我们重点介绍一些如何通过 web 页面来操作 rabbitMQ!

4.1、交换器管理

点击进入 Exchanges 菜单,最下面有一个Add a new exchange标签。

深入剖析 rabbitMQ

 

点击Add a new exchange,会展示如下信息!

深入剖析 rabbitMQ

 

  • Name:交换器名称
  • Type:交换器类型
  • Durability:是否持久化,Durable:持久化,Transient:不持久化
  • Auto delete:是否自动删除,当最后一个绑定(队列或者exchange)被unbind之后,该exchange 自动被删除
  • Internal:是否是内部专用exchange,是的话,就意味着我们不能往该exchange里面发消息
  • Arguments:参数,是AMQP协议留给AMQP实现做扩展使用的

我们先新建一个名称为hello-exchange,类型为direct的交换器,结果如下。

深入剖析 rabbitMQ

 

等会用于跟队列关联!

4.2、队列管理

点击进入 Queues 菜单,最下面也有一个Add a new queue标签。

深入剖析 rabbitMQ

 

点击标签,即可进入添加队列操作界面!

深入剖析 rabbitMQ

 

  • Name:队列名称
  • Durability:是否持久化,Durable:持久化,Transient:不持久化
  • Auto delete:是否自动删除,是的话,当队列内容为空时,会自动删除队列
  • Arguments:参数,是AMQP协议留给AMQP实现做扩展使用的

同样的,新建一个名称为hello-mq的消息队列,结果如下。

深入剖析 rabbitMQ

 

队列新建好了之后,继续来建立绑定关系!

4.3、绑定管理

建立绑定关系,既可以从队列进入也可以从交换器进入。

如果是从交换器进入,那么被关联的对象就是队列。

深入剖析 rabbitMQ

 

如果是从队列进入,那么被关联的对象就是交换器。

深入剖析 rabbitMQ

 

我们选择从队列入手,被绑定的交换器是hello-exchange,因为类型是direct,所以还需要填写routing key。

深入剖析 rabbitMQ

 

建立完成之后,在交换器那边也可以看到对应的绑定关系。

深入剖析 rabbitMQ

 

4.4、发送消息

最后,我们从交换器入手,选择对应的交换器,点击Publish message标签,填写对应的路由键 key,发送一下数据,查看数据是否发送到对应的队列中。

深入剖析 rabbitMQ

 

然后点击进入 Queues 菜单,查询消息队列基本情况。

深入剖析 rabbitMQ

 

然后选择hello-mq消息队列,点击Get messages标签,获取队列中的消息。

深入剖析 rabbitMQ

 

结果如下,可以很清晰的看到,消息写入到队列!

深入剖析 rabbitMQ

 

五、JAVA客户端使用

RabbitMQ 支持多种语言访问,本次介绍 RabbitMQ Java Client 的一些简单的api使用,如声明 Exchange、Queue,发送消息,消费消息,一些高级 api 会在后面的文章中详细的说明。

5.1、引入 rabbitMQ 依赖包

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>4.1.0</version>
</dependency>

5.2、连接服务器

使用给定的参数(host name,端口等等)连接AMQP的服务器。

ConnectionFactory factory = new ConnectionFactory();
factory.setUsername(userName);
factory.setPassword(password);
factory.setVirtualHost(virtualHost);
factory.setHost(hostName);
factory.setPort(portNumber);
Connection conn = factory.newConnection();

也可以使用通过 URI 方式进行连接。

ConnectionFactory factory = new ConnectionFactory();
factory.setUri("amqp://userName:password@hostName:portNumber/virtualHost");
Connection conn = factory.newConnection();

Connection(连接)接口可以被用作创建一个channel(管道),利用 channel(管道)可以进行发送和接收消息,在后面我们会频繁使用到它。

Channel channel = conn.createChannel();

注意,管道使用之后,需要进行关闭。

channel.close();
conn.close();

5.3、创建交换器

不仅可以通过 web页面进行创建交换器,还可以通过代码进行声明(创建的意思)交换器。

//创建exchange,类型是direct类型
channel.exchangeDeclare("ex-hello","direct");

//第三个参数表示是否持久化,同步操作,有返回值
AMQP.Exchange.DeclareOk ok = channel.exchangeDeclare("ex-hello","direct",true);
System.out.println(ok);

//创建带属性的交换器
Map<String,Object> argument = new HashMap<>();
argument.put("alternate-exchange","log");
channel.exchangeDeclare("ex-hello","direct",true,false,argument);

//异步创建exchange,没有返回值
channel.exchangeDeclareNoWait("ex-hello","direct",true,false,false,argument);

///判断exchange是否存在,存在的返回ok,不存在的exchange则报错
AMQP.Exchange.DeclareOk declareOk = channel.exchangeDeclarePassive("ex-hello");
System.out.println(declareOk);


//删除exchange(可重复执行),删除一个不存在的也不会报错
channel.exchangeDelete("ex-hello");

创建交换器参数解读

  • 第一个参数:表示交换器名称
  • 第二个参数:表示交换器类型
  • 第三个参数:表示是否持久化,为true表示会将队列持久化存储到硬盘
  • 第四个参数:表示是否自动删除,当最后一个绑定(队列或者exchange)被unbind之后,该exchange 自动被删除
  • 第五个参数:表示设置参数,参数类型为Map<String, Object>

5.4、创建队列

同样的,也可以通过代码进行声明队列。

//同步创建队列
channel.queueDeclare(queueName, true, false, false, null);

//异步创建队列没有返回值
channel.queueDeclareNoWait(queueName,true,false,false,null);

//判断queue是否存在,不存在会抛出异常
channel.exchangeDeclarePassive(queueName);

//删除队列
channel.queueDelete(queueName);

创建队列参数解读

  • 第一个参数:表示队列名称
  • 第二个参数:表示是否持久化,为true表示会将队列持久化存储到硬盘
  • 第三个参数:表示是否排它性,为true表示只对首次声明它的连接可见,会在其连接断开的时候自动删除
  • 第四个参数:表示是否自动删除,为true表示有过消费者并且所有消费者都解除订阅了,自动删除队列
  • 第五个参数:表示设置参数,参数类型为Map<String, Object>

5.5、创建绑定

当交换器和队列都创建成功之后,就可以建立绑定关系。

//交换器和队列进行绑定(可重复执行,不会重复创建)
channel.queueBind(queueName, exchangeName, routingKey);

//异步进行绑定,最后一个参数表示可以带自定义参数
channel.queueBindNoWait(queueName,exchangeName,routingKey,null);

//exchange和queue进行解绑(可重复执行)
channel.queueUnbind(queueName, exchangeName, routingKey);

//exchange与exchange进行绑定(可重复执行,不会重复创建)
//第一个参数表示目标交换器
//第二个参数表示原地址交换器
//第三个参数表绑定路由key
channel.exchangeBind(destination,source,routingKey);

//exchange和exchange进行解绑(可重复执行)
channel.exchangeUnbind(destination,source,routingKey);

绑定关系参数解读

  • queueName:队列名称,取自创建的队列名称
  • exchangeName:交换器,取自创建的交换器名称
  • routingKey:路由键key,自定义

5.6、发送消息

发送消息到交换器就会使用我们上文所提到的channel管道。

//发送的消息内容
byte[] messageBodyBytes = "Hello, world!".getBytes();
channel.basicPublish(exchangeName, routingKey, null, messageBodyBytes);

也可以在发送消息前设定一些消息属性。

//自己构建BasicProperties的对象
channel.basicPublish(exchangeName, routingKey,
             new AMQP.BasicProperties.Builder()
               .contentType("text/plain")
               .deliveryMode(2)
               .priority(1)
               .userId("zhangsan")
               .build()),
               messageBodyBytes);

发送指定头信息的消息。

Map<String, Object> headers = new HashMap<String, Object>();
headers.put("userName",  '"zhangsan');
headers.put("userCode", "123");

//发送消息到交换器
channel.basicPublish(exchangeName, routingKey,
             new AMQP.BasicProperties.Builder()
               .headers(headers)
               .build()),
               messageBodyBytes);

发送一个有过期时间的消息,单位:ms。

//设置消息过期时间,单位ms
channel.basicPublish(exchangeName, routingKey,
             new AMQP.BasicProperties.Builder()
               .expiration("6000")
               .build()),
               messageBodyBytes);

更多用法,可以参见官方 API

5.7、接受消息

从消息队列中接受消息也会使用我们上文所提到的channel管道。

//监听队列中的消息
channel.basicConsume(queueName,true,new SimpleConsumer(channel));

监听队列消息参数解读

  • 第一个参数:表示需要监听的队列名称
  • 第二个参数:表示是否自动确认,如果配置false表示手动确认消息是否收到
  • 第三个参数:表示消息处理类

具体的消息处理类需要继承DefaultConsumer,并重写handleDelivery方法,代码如下:

public class SimpleConsumer extends DefaultConsumer{

    public SimpleConsumer(Channel channel){
        super(channel);
    }

    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
  //接受从队列中发送的消息
        System.out.println(consumerTag);
        System.out.println("-----收到消息了---------------");
        System.out.println("消息属性为:"+properties);
        System.out.println("消息内容为:"+new String(body));
    }
}

如果是手工确认消息,需要在handleDelivery方法中进行相关的确认,代码如下:

//手动确认
long deliveryTag = envelope.getDeliveryTag();
channel.basicAck(deliveryTag, false);

5.8、完整demo

5.8.1、发送消息

public class Producer {

    public static void main(String[] args) throws IOException, TimeoutException, NoSuchAlgorithmException, KeyManagementException, URISyntaxException {
        //连接RabbitMQ服务器
        ConnectionFactory factory = new ConnectionFactory();
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");
        factory.setHost("197.168.24.206");
        factory.setPort(5672);
        //创建一个连接
        Connection conn = factory.newConnection();
        //获得信道
        Channel channel = conn.createChannel();
        //声明交换器
        channel.exchangeDeclare("ex-hello","direct");
        //发送的消息内容
        byte[] messageBodyBytes = "Hello, world!".getBytes();
        channel.basicPublish("ex-hello", "route-hello", null, messageBodyBytes);
        //关闭通道
        channel.close();
        conn.close();
    }
}

5.8.2、接受消息

public class Consumer {

    public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
        //连接RabbitMQ服务器
        ConnectionFactory factory = new ConnectionFactory();
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");
        factory.setHost("197.168.24.206");
        factory.setPort(5672);
        //创建一个连接
        Connection conn = factory.newConnection();
        //获得信道
        Channel channel = conn.createChannel();
        //声明队列
        channel.queueDeclare("queue-hello", true, false, false, null);
        //声明绑定
        channel.queueBind("queue-hello", "ex-hello", "route-hello");

        //监听队列中的消息
        channel.basicConsume("queue-hello",true,new SimpleConsumer(channel));

        TimeUnit.SECONDS.sleep(10);

        channel.close();
        conn.close();
    }
}

消息处理类SimpleConsumer

public class SimpleConsumer extends DefaultConsumer {

    public SimpleConsumer(Channel channel) {
        super(channel);
    }

    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        //接受从队列中发送的消息
        System.out.println(consumerTag);
        System.out.println("-----收到消息了---------------");
        System.out.println("消息属性为:"+properties);
        System.out.println("消息内容为:"+new String(body));
    }
}

消息发送成功之后,启动消费者,输出结果如下:

深入剖析 rabbitMQ

 

六、总结

整篇文章主要介绍了 RabbitMQ 内部结构、安装步骤、使用教程,以及 java 客户端使用等内容,内容比较长,限于笔者的才疏学浅,对本文内容可能还有理解不到位的地方,如有阐述不合理之处还望留言一起探讨。



Tags:rabbitMQ   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
RabbitMQ 介绍RabbitMQ 是一个由erlang语言编写的、开源的、在AMQP基础上完整的、可复用的企业消息系统。支持多种语言,包括java、Python、ruby、PHP、C/C++等。1.1.AMQP模型...【详细内容】
2021-11-17  Tags: rabbitMQ  点击:(16)  评论:(0)  加入收藏
下载Erlang和RabbitMQ官网下载地址Erlang下载地址: http://www.erlang.org/downloadsRabbitMQ下载地址: http://www.rabbitmq.com/download.html版本:( Erlang23+RabbitMQ3.8.4...【详细内容】
2021-08-31  Tags: rabbitMQ  点击:(49)  评论:(0)  加入收藏
环境:Spring Boot2.3.10 + RabbitMQ 3.8.12 + Erlang 23.2.51.1 RabbitMQ介绍RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务...【详细内容】
2021-04-22  Tags: rabbitMQ  点击:(336)  评论:(0)  加入收藏
RabbitMQ环境搭建erlang和RabbitMQ版本对应关系:https://www.rabbitmq.com/which-erlang.htmlerlang环境安装yum方式安装 yum源配置[root@iyeed RabbitMQ]# curl -s https://...【详细内容】
2021-04-14  Tags: rabbitMQ  点击:(281)  评论:(0)  加入收藏
Direct 模式# 所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue。 Direct 模式可以使用 RabbitMQ 自带的 Exchange: default Exchange,所以不需要将 Exch...【详细内容】
2021-04-13  Tags: rabbitMQ  点击:(220)  评论:(0)  加入收藏
一、关于 RabbitMQ说到 RabbitMQ,相信大家都不会陌生,微服务开发中必不可少的中间件。 在上篇关于消息队列的文章中,我们了解到 RabbitMQ 本质其实是用 Erlang 开发的 AMQP(Adva...【详细内容】
2021-03-11  Tags: rabbitMQ  点击:(229)  评论:(0)  加入收藏
说明:想要理解RabbitMQ,需要先理解MQ是什么?能做什么?然后根据基础知识去理解RabbitMQ是什么、提供了什么功能。一、MQ的简单理解1. 什么是MQ? 消息队列(Message Queue),是基础数据...【详细内容】
2021-02-07  Tags: rabbitMQ  点击:(155)  评论:(0)  加入收藏
1、 查找Docker容器中的RabbitMQ镜像docker ps -a[root@linux ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED...【详细内容】
2020-11-27  Tags: rabbitMQ  点击:(221)  评论:(0)  加入收藏
一、Maven依赖添加 <!-- rabbitmq相关依赖 --> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId>...【详细内容】
2020-08-01  Tags: rabbitMQ  点击:(53)  评论:(0)  加入收藏
一、简单的发送与接收消息 HelloWorld1. 发送消息发送消息首先要获取与rabbitmq-server的连接,然后从渠道(chann)中指定的queue发送消息 , 不能定义两个queue名字相同,但属性...【详细内容】
2020-04-03  Tags: rabbitMQ  点击:(61)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(3)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(8)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(20)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(16)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(16)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条