80.分布式消息中间件-消息中间件设计思想与RabbitMQ环境搭建

一、内容安排

在这里插入图片描述

二、传统Http协议调用接口存在的缺陷

1.http

在这里插入图片描述
1.http基于请求与响应。
2.同步过 程

在这里插入图片描述
时间 >=9s
1.耗时
2. 用同步 ,不解耦
在这里插入图片描述
高并发下,频繁创建thread
自己要写补偿机制
重试:会存在幂等性问题

总结

在这里插入图片描述

三、为什么要使用消息中间件

在这里插入图片描述
在这里插入图片描述

四、消息中间件异步、流量削峰、解耦问题

在这里插入图片描述
在这里插入图片描述

五、市面主流消息中间件对比分析

市面主流的MQ对比分析

ActiveMQ

历史悠久的开源项目,是Apache下的一个子项目。已经在很多产品中得到应用,实现了JMS1.1规范,可以和spring-jms轻松融合,实现了多种协议,不够轻巧(源代码比RocketMQ多),支持持久化到数据库,对队列数较多的情况支持不好

RabbitMQ

结合erlang语言本身的并发优势,支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。

RocketMQ

阿里系下开源的一款分布式、队列模型的消息中间件,原名Metaq,3.0版本名称改为RocketMQ,是阿里参照kafka设计思想使用java实现的一套mq。同时将阿里系内部多款mq产品(Notify、metaq)进行整合,只维护核心功能,去除了所有其他运行时依赖,保证核心功能最简化,在此基础上配合阿里上述其他开源产品实现不同场景下mq的架构,目前主要多用于订单交易系统。

Kafka

Apache下的一个子项目,使用scala实现的一个高性能分布式Publish/Subscribe消息队列系统,具有以下特性:高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率;高堆积:支持topic下消费者较长时间离线,消息堆积量大;
在这里插入图片描述

六、windows版本安装Rabbitmq

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件),RabbitMQ服务器是用Erlang语言编写的。
RabitMQ官方网站:
https://www.rabbitmq.com/
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

RabitMQ环境的基本安装

1.下载并安装erlang,下载地址:http://www.erlang.org/download
2.配置erlang环境变量信息
新增环境变量ERLANG_HOME=erlang的安装地址
将%ERLANG_HOME%\bin加入到path中
3.下载并安装RabbitMQ,下载地址:http://www.rabbitmq.com/download.html
注意: RabbitMQ 它依赖于Erlang,需要先安装Erlang。
在这里插入图片描述

出现此窗口 启动成功:

在这里插入图片描述

七、rabbitmq管理平台端口号介绍

RabbitMQ 管理平台地址 http://127.0.0.1:15672
默认账号:guest/guest 用户可以自己创建新的账号
在这里插入图片描述
在这里插入图片描述

八、VirtualHosts的核心作用

在这里插入图片描述
在这里插入图片描述

Virtual Hosts:

像mysql有数据库的概念并且可以指定用户对库和表等操作的权限。那RabbitMQ呢?

RabbitMQ也有类似的权限管理。在RabbitMQ中可以虚拟消息服务器VirtualHost,每

个VirtualHost相当月一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互

隔离的。exchange、queue、message不能互通。

九、rabbitmq创建Virtual Hosts

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重新创建
在这里插入图片描述

10.第十节-简单工作队列之生产者投递消息.ev4

依赖:

 <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>3.6.5 </version>
        </dependency>
public class RabitMQConnection {

    public static Connection getConnection() throws IOException, TimeoutException {
        // 1.创建我们的连接
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 2.设置我们的连接地址
        connectionFactory.setHost("127.0.0.1");
        // 3.设置我们的端口号
        connectionFactory.setPort(5672);
        // 4.设置账号和密码
        connectionFactory.setUsername("meite");
        connectionFactory.setPassword("meite");
        // 5.设置VirtualHost
        connectionFactory.setVirtualHost("/meite_rabbitmq");
        return connectionFactory.newConnection();
    }
}
public class Producer {
    private static final String QUEUE_NAME = "mayikt";

    public static void main(String[] args) throws IOException, TimeoutException {
        System.out.println("生产者启动成功..");
        // 1.创建我们的连接
        Connection connection = RabitMQConnection.getConnection();
        // 2.创建我们通道
        Channel channel = connection.createChannel();
        for (int i = 0; i < 10; i++) {
            String msg = "突破3万月薪" + i;
            channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
            System.out.println("生产者发送消息成功:" + msg);
        }
        channel.close();
        connection.close();
    }
}
public class Consumer {
    private static final String QUEUE_NAME = "mayikt";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.创建我们的连接
        Connection connection = RabitMQConnection.getConnection();
        // 2.创建我们通道
        Channel channel = connection.createChannel();
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String msg = new String(body, "UTF-8");
                System.out.println("消费消息msg:" + msg);
            }
        };
        // 3.创建我们的监听的消息
        channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
   
    }
}

在这里插入图片描述
生产者投递的消息,还未被 消费者消费的 条数
在这里插入图片描述
在这里插入图片描述
可被lambda优化

十一、简单工作队列之消费者投递消息

点对点

1、一个生产者 一个消费者。
2、一个生产者 两个消费者时:
会轮训均摊
生产者产生10条消息 。
两个消费者 各自消费5条

发布了119 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44722978/article/details/103503068