ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

必备新版RabbitMQ教程-高性能消息队列RabbitMQ课程介绍-小滴课堂

2021-06-21 15:01:28  阅读:218  来源: 互联网

标签:教程 String EXCHANGE factory RabbitMQ 交换机 小滴 channel NAME


 

 

第八章 玩转RabbitMQ 路由、主题模式实战和总结

第1集 玩转RabbitMQ的路由模式和应用场景

简介:RabbitMQ的路由模式和应用场景

  • 什么是rabbitmq的路由模式

    • 文档:https://www.rabbitmq.com/tutorials/tutorial-four-java.html

    • 交换机类型是Direct

    • 队列和交换机绑定,需要指定一个路由key( 也叫Bingding Key)

    • 消息生产者发送消息给交换机,需要指定routingKey

    • 交换机根据消息的路由key,转发给对应的队列

  • 例子:日志采集系统 ELK

    • 一个队列收集error信息-》告警

    • 一个队列收集全部信息-》日常使用

 

第2集 RabbitMQ的路由模式代码实战

简介:RabbitMQ路由模式代码实战

  • 消息生产者

public class Send {    private final static String EXCHANGE_NAME = "exchange_direct";    public static void main(String[] argv) throws Exception {        ConnectionFactory factory = new ConnectionFactory();        factory.setHost("10.211.55.13");        factory.setUsername("admin");        factory.setPassword("password");        factory.setVirtualHost("/xdclass1");        factory.setPort(5672);        /**         * 消息生产者不用过多操作,只需要和交换机绑定即可         */        try (//创建连接             Connection connection = factory.newConnection();             //创建信道             Channel channel = connection.createChannel()) {            //绑定交换机,直连交换机            channel.exchangeDeclare(EXCHANGE_NAME,BuiltinExchangeType.DIRECT);            String error = "我是错误日志";            String info = "我是info日志";            String debug = "我是debug日志";            channel.basicPublish(EXCHANGE_NAME, "errorRoutingKey", null, error.getBytes(StandardCharsets.UTF_8));            channel.basicPublish(EXCHANGE_NAME, "infoRoutingKey", null, info.getBytes(StandardCharsets.UTF_8));            channel.basicPublish(EXCHANGE_NAME, "debugRoutingKey", null, debug.getBytes(StandardCharsets.UTF_8));            System.out.println("消息发送成功");        }    }}

消息消费者(两个节点)

public class Recv1 {    private final static String EXCHANGE_NAME = "exchange_direct";    public static void main(String[] argv) throws Exception {        ConnectionFactory factory = new ConnectionFactory();        factory.setHost("10.211.55.13");        factory.setUsername("admin");        factory.setPassword("password");        factory.setVirtualHost("/xdclass1");        factory.setPort(5672);        //消费者一般不增加自动关闭        Connection connection = factory.newConnection();        Channel channel = connection.createChannel();        //绑定交换机,fanout扇形,即广播类型        channel.exchangeDeclare(EXCHANGE_NAME,BuiltinExchangeType.DIRECT);        //获取队列        String queueName = channel.queueDeclare().getQueue();        //绑定队列和交换机,另外一个节点只绑定一个 errorRoutingKey        channel.queueBind(queueName,EXCHANGE_NAME,"errorRoutingKey");    channel.queueBind(queueName,EXCHANGE_NAME,"infoRoutingKey");        channel.queueBind(queueName,EXCHANGE_NAME,"debugRoutingKey");        DeliverCallback deliverCallback = (consumerTag, delivery) -> {            String message = new String(delivery.getBody(), "UTF-8");            System.out.println(" [x] Received '" + message + "'");        };        //自动确认消息        channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });    }}

 

第3集 玩转RabbitMQ的topic主题通配符模式和应用场景

简介:RabbitMQ的主题模式和应用场景

  • 背景:

    • 如果业务很多路由key,怎么维护??

    • topic交换机,支持通配符匹配模式,更加强大

    • 工作基本都是用这个topic模式

  • 什么是rabbitmq的主题模式

    • 交换机和队列绑定时用的binding使用通配符的路由健

    • 生产者发送消息时需要使用具体的路由健

    • 文档 https://www.rabbitmq.com/tutorials/tutorial-five-java.html

    • 交换机是 topic, 可以实现发布订阅模式fanout和路由模式Direct 的功能,更加灵活,支持模式匹配,通配符等

    • 交换机同过通配符进行转发到对应的队列,* 代表一个词,#代表1个或多个词,一般用#作为通配符居多,比如 #.order, 会匹配 info.order 、sys.error.order, 而 *.order ,只会匹配 info.order, 之间是使用. 点进行分割多个词的; 如果是 ., 则info.order、error.order都会匹配

    • 注意

  • 测试,下面的匹配规则是怎样的

quick.orange.rabbit 只会匹配  *.orange.* 和 *.*.rabbit ,进到Q1和Q2lazy.orange.elephant 只会匹配 *.orange.* 和 lazy.#,进到Q1和Q2quick.orange.fox 只会匹配 *.orange.*,进入Q1lazy.brown.fox 只会匹配azy.#,进入Q2lazy.pink.rabbit 只会匹配 lazy.#和*.*.rabbit ,同个队列进入Q2(消息只会发一次)quick.brown.fox 没有匹配,默认会被丢弃,可以通过回调监听二次处理lazy.orange.male.rabbit,只会匹配 lazy.#,进入Q2

  • 例子:日志采集系统

    • 一个队列收集订单系统的全部日志信息,order.log.#

    • 一个队列收集全部系统的全部日志信息, #.log

第4集 玩转RabbitMQ的topic主题通配符模式代码实战

简介:RabbitMQ的topic主题模式代码实战

  • 例子:日志采集系统

    • 一个队列收集订单系统的error日志信息,order.log.error

    • 一个队列收集全部系统的全部级别日志信息, * .log. *

  • 生产者

public class Send {    private final static String EXCHANGE_NAME = "exchange_topic";    public static void main(String[] argv) throws Exception {        ConnectionFactory factory = new ConnectionFactory();        factory.setHost("10.211.55.13");        factory.setUsername("admin");        factory.setPassword("password");        factory.setVirtualHost("/dev");        factory.setPort(5672);        /**         * 消息生产者不用过多操作,只需要和交换机绑定即可         */        try (//创建连接             Connection connection = factory.newConnection();             //创建信道             Channel channel = connection.createChannel()) {            //绑定交换机,直连交换机            channel.exchangeDeclare(EXCHANGE_NAME,BuiltinExchangeType.TOPIC);            String error = "我是订单错误日志";            String info = "我是订单info日志";            String debug = "我是商品debug日志";            channel.basicPublish(EXCHANGE_NAME, "order.log.error", null, error.getBytes(StandardCharsets.UTF_8));            channel.basicPublish(EXCHANGE_NAME, "order.log.info", null, info.getBytes(StandardCharsets.UTF_8));            channel.basicPublish(EXCHANGE_NAME, "product.log.debug", null, debug.getBytes(StandardCharsets.UTF_8));            System.out.println("消息发送成功");        }    }}

消费者(两个)

public class Recv1 {    private final static String EXCHANGE_NAME = "exchange_topic";    public static void main(String[] argv) throws Exception {        ConnectionFactory factory = new ConnectionFactory();        factory.setHost("10.211.55.13");        factory.setUsername("admin");        factory.setPassword("password");        factory.setVirtualHost("/dev");        factory.setPort(5672);        //消费者一般不增加自动关闭        Connection connection = factory.newConnection();        Channel channel = connection.createChannel();        //绑定交换机        channel.exchangeDeclare(EXCHANGE_NAME,BuiltinExchangeType.TOPIC);        //获取队列        String queueName = channel.queueDeclare().getQueue();        //绑定队列和交换机,第一个节点        //channel.queueBind(queueName,EXCHANGE_NAME,"order.log.error");   //绑定队列和交换机,第二个节点      //channel.queueBind(queueName,EXCHANGE_NAME,"*.log.*");        DeliverCallback deliverCallback = (consumerTag, delivery) -> {            String message = new String(delivery.getBody(), "UTF-8");            System.out.println(" [x] Received '" + message + "'");        };        //自动确认消息        channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });    }}

 

第5集 RabbitMQ的多种工作模式总结

简介:RabbitMQ的多个工作模式总结

  • 对照官网回顾总结

    • https://www.rabbitmq.com/getstarted.html

  • 简单模式

    • 一个生产、一个消费,不用指定交换机,使用默认交换机

  • 工作队列模式

    • 一个生产,多个消费,可以有轮训和公平策略,不用指定交换机,使用默认交换机

  • 发布订阅模式

    • fanout类型交换机,通过交换机和队列绑定,不用指定绑定的路由健,生产者发送消息到交换机,fanout交换机直接进行转发,消息不用指定routingkey路由健

  • 路由模式

    • direct类型交换机,过交换机和队列绑定,指定绑定的路由健,生产者发送消息到交换机,交换机根据消息的路由key进行转发到对应的队列,消息要指定routingkey路由健

  • 通配符模式

    • topic交换机,过交换机和队列绑定,指定绑定的【通配符路由健】,生产者发送消息到交换机,交换机根据消息的路由key进行转发到对应的队列,消息要指定routingkey路由健

 

 

标签:教程,String,EXCHANGE,factory,RabbitMQ,交换机,小滴,channel,NAME
来源: https://blog.csdn.net/XDCLASS21/article/details/118086554

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有