微服务: 03-rabbitmq在springboot中如何使用(下篇)

这篇具有很好参考价值的文章主要介绍了微服务: 03-rabbitmq在springboot中如何使用(下篇)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言: 上文传送

4.六大模式实际操作(续)

4.4  路由模式: 

---> 4.4.1 消费者配置类

---> 4.4.2 消费者代码

--->4.4.3 生产者代码

4.5  主题模式: (路由升级版)

---> 4.5.1 消费者配置类

---> 4.5.2 消费者代码

---> 4.5.3 生产者代码

---> 4.5.4 测试效果

4.6  RPC异步调用模式(用的少) 

---> 4.6.0 找了个mq的简史 还是蛮有趣的: 消息中间件的发展史是一个有趣的历史故事

---> 4.6.1 消费者配置类

---> 4.6.2 生产者配置类

---> 4.6.3 消费者代码

---> 4.6.4 生产者代码

---> 4.6.5 实现效果

文章总结:


前言: 上文传送

微服务 02-rabbitmq在springboot中如何使用(上篇)

4.六大模式实际操作(续)

4.4  路由模式: 

---> 4.4.1 消费者配置类

package cn.pingzhuyan.rabbitmq.config;

import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * rabbitmq的默认手动确认模式
 * @author pzy
 * @version 0.1.0
 * @description: TODO
 */
@Configuration
public class RabbitConfig {

    /**
     * 创建(声明)一个简单队列
     * @return
     */
    @Bean
    public Queue helloQueue(){
//        return new Queue("PZY",true,false,false);
        return new Queue("PZY");
    }

    /**
     * 创建radioFanout交换机
     * 消费者需要绑定此交换机
     * @return
     */
    @Bean
    public FanoutExchange radioFanout(){
        return new FanoutExchange("PZY_RADIO",false,false);
    }

    /**
     * 路由模式 指定路由交换机
     * 指定接收路由键
     * @return
     */
    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange("PZY_DIRECT",false,false);
    }

}

---> 4.4.2 消费者代码

package cn.pingzhuyan.rabbitmq.directM4;

import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 路由交换机消费者
 *
 * @author pzy
 * @version 0.1.0
 * @description: TODO
 */
@Component
public class DirectM4Consumer {

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue,  //不写就是随机队列, false true true
            exchange = @Exchange(name = "PZY_DIRECT", declare = "false"),//交换机(PZY_RADIO, 不创建并使用已经存在的交换机)
            key = {"pzy1", "pzy2"}
    ))
    public void radioFanoutMessage1(String msg) {
        System.out.printf("消费者1接收到<1/2>: %s\n", msg);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue,  //不写就是随机队列, false true true
            exchange = @Exchange(name = "PZY_DIRECT", declare = "false"),//交换机(PZY_RADIO, 不创建并使用已经存在的交换机)
            key = {"pzy3", "pzy4"}
    ))
    public void radioFanoutMessage2(String msg) {
        System.out.printf("消费者2接收到<3/4>: %s\n", msg);
    }

}

--->4.4.3 生产者代码

package cn.pingzhuyan.rabbitmq.directM4;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Random;

/**
 * 路由交换机生产者
 *
 * @author pzy
 * @version 0.1.0
 * @description: TODO
 */
@Component
public class DirectM4Provider {

    @Autowired
    private AmqpTemplate amqpTemplate;


    @Async
    @Scheduled(cron = "*/1 * * * * ?")
    public void directSend01() {

        int num = new Random().nextInt(4) + 1;//生成1-4的随机数

        System.out.println("生产者1: <发布和订阅模式>定时(1次/s)发送 -> " + "我是消息,编号是: " + num);

        amqpTemplate.convertAndSend("PZY_DIRECT", "pzy" + num, "我是消息,编号是: " + num);
    }


}

4.5  主题模式: (路由升级版)

---> 4.5.1 消费者配置类

    /**
     * 主题模式(升级版路由) 指定路由交换机
     * 指定接收路由键表达式
     * @return
     */
    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange("PZY_TOPIC",false,false);
    }

---> 4.5.2 消费者代码

//测试四种

//1. pzy.pzy.pzy 1和2 都能收到

//2. aaa.pzy.bbb 1能收到

//3. pzy.aaa.bbb.ccc 2能收到

//4. aaa.bbb.pzy 2能收到

package cn.pingzhuyan.rabbitmq.topicM5;

import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 路由交换机消费者
 * 测试四种
 * 1. pzy.pzy.pzy     1和2 都能收到
 * 2. aaa.pzy.bbb     1能收到
 * 3. pzy.aaa.bbb.ccc 2能收到
 * 4. aaa.bbb.pzy     2能收到
 *
 * @author pzy
 * @version 0.1.0
 * @description: TODO
 */
@Component
public class TopicM5Consumer {

    /**
     * 消费者1
     *
     * @param msg
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue,  //不写就是随机队列, false true true
            exchange = @Exchange(name = "PZY_TOPIC", declare = "false"),//交换机(PZY_RADIO, 不创建并使用已经存在的交换机)
            key = {"*.pzy.*"}
    ))
    public void radioFanoutMessage1(String msg) {
        System.out.printf("消费者1接收到: %s\n", msg);
    }

    /**
     * 消费者2
     *
     * @param msg
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue,  //不写就是随机队列, false true true
            exchange = @Exchange(name = "PZY_TOPIC", declare = "false"),//交换机(PZY_RADIO, 不创建并使用已经存在的交换机)
            key = {"pzy.#", "*.*.pzy"}
    ))
    public void radioFanoutMessage2(String msg) {
        System.out.printf("消费者2接收到: %s\n", msg);
    }

}

---> 4.5.3 生产者代码

@PostConstruct解释传送门===> : 启动类加载时方法执行的几种实现方式 

package cn.pingzhuyan.rabbitmq.topicM5;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Scanner;

/**
 * 主题模式生产者
 *
 * @author pzy
 * @version 0.1.0
 * @description: TODO
 */
@Component
public class TopicM5Provider {

    @Autowired
    private AmqpTemplate amqpTemplate;
    
    @PostConstruct
    public void topicSend01() {

        for (; ; ) {
            System.out.println("请输入路由键: ");
            String routingKey = new Scanner(System.in).nextLine();

            /*中断测试,启动程序完成*/
            if ("exit".equalsIgnoreCase(routingKey)) break;

            System.out.println("请输入消息: ");
            String message = new Scanner(System.in).nextLine();

            System.out.println("生产者1: <发布和订阅模式>发送 -> " + message + "路由键是: " + routingKey);

            amqpTemplate.convertAndSend("PZY_TOPIC", routingKey, message);
        }
    }
}

---> 4.5.4 测试效果

微服务: 03-rabbitmq在springboot中如何使用(下篇),# 分布式必备服务配置,java-rabbitmq,微服务,rabbitmq,spring boot,spring cloud

4.6  RPC异步调用模式(用的少) 

[个人理解, 不喜勿喷]

   有成熟的rpc 框架 dubbo Netflix(feign,ribbon,Hystrix), gRpc等 功能更加完善,在微服务架构中服务与服务内部通信必不可少的技术.

   使用rabbitmq的rpc模式  性能瓶颈就在它身上, 如果mq宕机 整个服务系统都不可用.
   之后看mq的简史, 这个技术应该是在微服务诞生之前就出现了, 了解了这模式用的人少原因

---> 4.6.0 找了个mq的简史 还是蛮有趣的: 消息中间件的发展史是一个有趣的历史故事

---> 4.6.1 消费者配置类

第二个随机队列可以不写 声明在哪都行 

   /**
     * RPC异步调用模式(用的最少)
     * @return
     */
    @Bean
    public Queue sendQueue() {
        return new Queue("PZY_PRC", false);
    }

    /**
     * 声明PRC一个随机队列  (生产者需要监听这个队列 收到回执消息)
     * @return
     */
    @Bean
    public Queue rpcRandomQueue() {
        return new Queue(UUID.randomUUID().toString(), false);
    }

---> 4.6.2 生产者配置类

 需要获取到queue的名称 spring给了获取bean的方法 #{rpcRandomQueue.name}

package cn.pingzhuyan.rabbitmq.config;

import org.springframework.amqp.core.Queue;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.UUID;

/**
 * 生产者
 * rabbitmq的默认手动确认模式
 * <p>
 * 只需要声明一个随机队列 绑定生成的验证码
 *
 * @author pzy
 * @version 0.1.0
 * @description: TODO
 */
@Configuration
public class RabbitConfig {

    /**
     * 声明一个随机队列
     *
     * @return
     */
    @Bean
    public Queue rpcRandomQueue() {
        return new Queue(UUID.randomUUID().toString(), false);
    }

}

---> 4.6.3 消费者代码

 业务代码随便, 主要是要这个业务处理结果, 写个相加, 随机数, 猜字符都行

package cn.pingzhuyan.rabbitmq.RpcM6;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Random;

/**
 * Rpc模式 消费者
 *
 * 其实也是生产者 将收到的消息放入随机队列
 * @author pzy
 * @version 0.1.0
 * @description: TODO
 */
@Component
public class RpcM6Consumer {

    @RabbitListener(queues = "PZY_PRC")
    public String getAuthCode(int length) {

        String authCode = makeAuthCode(length);

        System.out.printf("由消费者1制作完成: %s \n", authCode);

        return authCode;
    }

    @RabbitListener(queues = "PZY_PRC")
    public String getAuthCode1(int length) {
        String authCode = makeAuthCode(length);

        System.out.printf("由消费者1制作完成: %s \n", authCode);

        return authCode;
    }

    /**
     * 制作验证码
     *
     * @param length
     * @return
     */
    private String makeAuthCode(int length) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 26; i++) {
            builder.append((char) ('a' + i));
            builder.append((char) ('A' + i));

            if (i < 10) builder.append(i);

        }
        String line = builder.toString();
        StringBuilder b = new StringBuilder();
        Random rand = new Random();
        for (int i = 0; i < length; i++) {
            b.append(line.charAt(rand.nextInt(line.length())));
        }

        try {
            Thread.sleep(rand.nextInt(2000));//阻塞0-5000ms
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.printf("生成 %s 位数验证码, ", length);
        return b.toString();
    }


}

---> 4.6.4 生产者代码

package cn.pingzhuyan.rabbitmq.RpcM6;


import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Random;

import java.util.UUID;

/**
 * rpc模式 生产者
 * <p>
 * 也是消费者 从绑定的随机队列中接收到消息
 *
 * @author pzy
 * @version 0.1.0
 * @description: TODO
 */

@Component
@EnableAsync
@EnableScheduling
public class RpcM6Provider {

    @Autowired
    private AmqpTemplate amqpTemplate;


    @Value("#{rpcRandomQueue.name}")
    private String rpcRandomQueue;


    /**
     * 定时操作 生成随机位数的验证码
     */
    @Async
    @Scheduled(cron = "*/5 * * * * ?")
    public void topicSend01() {

        int length = new Random().nextInt(19) + 1;//自然数
        System.out.printf("验证码生成器(随机生成位数): %s \n", length);
//        if (length <= 0) length = 1;

        amqpTemplate.convertAndSend("PZY_PRC", length, message -> {
            MessageProperties messageProperties = message.getMessageProperties();
            messageProperties.setReplyTo(rpcRandomQueue);
            messageProperties.setCorrelationId(UUID.randomUUID().toString());
            return message;
        });
    }

    /**
     * 生产者-> 消费者  接收绑定了消息的随机队列
     * 然后进行后面逻辑业务
     * @param authCode
     * @param correlationId
     */
    @RabbitListener(queues = "#{rpcRandomQueue.name}")
    public void receive(String authCode, @Header(name = AmqpHeaders.CORRELATION_ID) String correlationId) {

        System.out.println("生产者: 收到关联id号-> " + correlationId + "的验证码是: " + authCode);
    }


}

---> 4.6.5 实现效果

生产者服务 

微服务: 03-rabbitmq在springboot中如何使用(下篇),# 分布式必备服务配置,java-rabbitmq,微服务,rabbitmq,spring boot,spring cloud

 消费者服务

微服务: 03-rabbitmq在springboot中如何使用(下篇),# 分布式必备服务配置,java-rabbitmq,微服务,rabbitmq,spring boot,spring cloud


文章总结:

到此 springboot整合rabbitmq的基础demo结束了 代码一行行敲得 结果都是实际测试成功的

还有其他写法 后续可能会补充进去 , 欢迎评论文章来源地址https://www.toymoban.com/news/detail-524765.html

到了这里,关于微服务: 03-rabbitmq在springboot中如何使用(下篇)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例

    Dubbo是一个 分布式服务框架 ,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求。其本质上是个远程服务调用

    2024年01月21日
    浏览(51)
  • Springboot实战16 消息驱动:如何使用 RabbitTemplate 集成 RabbitMQ?

    15 讲我们介绍了基于 ActiveMQ 和 JmsTemplate 实现消息发送和消费,并重构了 SpringCSS 案例系统中的 account-service 和 customer-service 服务。 今天,我们将介绍另一款主流的消息中间件 RabbitMQ,并基于 RabbitTemplate 模板工具类为 SpringCSS 案例添加对应的消息通信机制。 AMQP 规范与 RabbitM

    2024年02月02日
    浏览(50)
  • 微服务学习:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    目录 一、高级篇 二、面试篇 ==============实用篇============== day05-Elasticsearch01 1.初识elasticsearch 1.4.安装es、kibana 1.4.1.部署单点es 1.4.2.部署kibana 1.4.3.安装IK分词器 1.4.4.总结 2.索引库操作 2.1.mapping映射属性 2.2.索引库的CRUD 2.2.1.创建索引库和映射 2.2.2.查询索引库 2.2.3.修改索引库 2.

    2024年02月02日
    浏览(59)
  • 使用Jaeger进行分布式跟踪:学习如何在服务网格中使用Jaeger来监控和分析请求的跟踪信息

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月08日
    浏览(40)
  • 微服务技术栈SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式(五):分布式搜索 ES-下

    聚合(aggregations)可以实现对文档数据的统计、分析、运算。聚合常见的有三类: 桶(Bucket)聚合:用来对文档做分组 TermAggregation:按照文档字段值分组 Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组 度量(Metric)聚合:用以计算一些值,比如:最大值

    2024年03月26日
    浏览(65)
  • SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈

    我们发现在微服务中有一个令人头疼的问题——部署,用Docker去解决这个部署难题 1、项目部署的问题 2、Docker 扔到一台机器上,它们的依赖难道没有干扰吗?不会,docker将打包好的程序放到一个隔离容器去运行,使用沙箱机制,避免互相干扰,之间不可见,这样就解决了混

    2023年04月24日
    浏览(46)
  • 在ASP.NET Core微服务架构下使用RabbitMQ如何实现CQRS模式

    前言 在现代软件开发中,微服务架构和CQRS模式都是备受关注的技术趋势。微服务架构通过将应用程序拆分为一系列小型、自治的服务,提供了更好的可伸缩性和灵活性。而CQRS模式则通过将读操作和写操作分离,优化了系统的性能和可维护性。本文小编将为大家介绍如何在

    2024年01月16日
    浏览(50)
  • 开源.NET8.0小项目伪微服务框架(分布式、EFCore、Redis、RabbitMQ、Mysql等)

    为什么说是伪微服务框架,常见微服务框架可能还包括服务容错、服务间的通信、服务追踪和监控、服务注册和发现等等,而我这里为了在使用中的更简单,将很多东西进行了简化或者省略了。 年前到现在在开发一个新的小项目,刚好项目最初的很多功能是比较通用的,所以

    2024年03月09日
    浏览(55)
  • 分布式消息队列RabbitMQ-Linux下服务搭建,面试完腾讯我才发现这些知识点竟然没掌握全

    vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app 5.修改配置文件 这里面修改{loopback_users, [“guest”]}改为{loopback_users, []} {application, rabbit, %% - - erlang - - [{description, “RabbitMQ”}, {id, “RabbitMQ”}, {vsn, “3.6.5”}, {modules, [‘background_gc’,‘delegate’,‘delegate_sup’,‘dtree’,‘file_han

    2024年04月14日
    浏览(56)
  • 【分布式云储存】Springboot微服务接入MinIO实现文件服务

    上篇博客我们介绍了分布式云存储MinIO作业环境的搭建,以及分布式云储存MinIO在实际的文件服务中的优势。那么,今天我们就小试牛刀来将MinIO接入我们的微服务项目,实现一个分布式的文件服务器。 MinIO 提供高性能、与S3 兼容的对象存储系统,让你自己能够构建自己的私有

    2024年02月07日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包