zoukankan      html  css  js  c++  java
  • Rabbit MQ和Spring Boot的整合

     

    背景有时需与其它系统集成来完成相关业务功能,原始做法是程序内部相互调用,但增强了内部耦合性,不易维护,此外,还可用消息服务中间件来进行业务处理,使用消息服务中间件处理业务能够提升系统的异步通信和扩展解耦的能力,个人有点面向切面的意思。    

     

    .为什么要使用消息服务?

          消息服务相当于是一个中间介质,而且从消息中间件中读取数据还是比较快的,所以既在一定程度上提高了效率,而且也缓解服务器压力,提高系统稳定性和可靠性

          特点如下:

          1.异步处理;      如到银行取款,取完了之后收到了短信通知,另外,手机里相关app也有相关扣款操作和提示。   开始取款,数据库数据发生变化,并将发生的变化写入到消息中间件,然后短信业务,APP相关业务都会异步读取消息中间件中的数据。

          2.流量消峰;       按一定规则限定请求数,提高系统稳定性,常用于电商项目。

          3.提高效率和可靠性,并在一定程度上起到了解耦的作用;       如系统异常,导致订单丢失等,就很麻烦,但如果事先将其快速写入到消息队列中,然后相关服务去消费中间件这种的消息,则相对安全和高效。      

     

     

    二、RabbitMQ消息中间件的原理和工作模式

     

    RabbitMQ消息中间件的原理如下

     

                                 消息                                                                            -------------------连接管道1 

    发布者------------------->Broker(消息队列和转换器的绑定)---------------------------连接管道2----------------消息消费者

                                                                                                           -------------------连接管道n

     

     

    开发大致流程:发送消息(发送者实例将发送消息进行一个转换和发送,中间用到spring提供的rabbitTemplate类进行一个转化和消息发送,以及消息本身需要序列化的相关配置) ,对于消息根据不同的工作模式进行绑定,然后消费者接收消息题,然后开始消费消息。

     

     

    消息中间件的工作模式的分类、具体的实现步骤、适用场景

     

    工作模式:

          Publish/Subscrib(发布订阅模式)

     

      

    step1.配置一个fanout类型的交换器。

    step2.不需指定对应的路由键,同时会将消息路由到每一个消息队列。

    step3.每个队列都可以对不同的消息进行接收存储,进而各自消息队列关联的消费者进行消费。

           适用场景:相同业务功能处理的场合。如用户注册成功后,同时给该用户发送邮件和短信,使得该功能增强,所以也有点面向切面的意思。

     

     

    Routing(路由模式)

     

    step1.先配置一个direct类型的转换器;

    step2.制定不同的路由键值将对应的消息从路由器路由到不同的消息队列中存储,再由各自消费者消费。

     

            适用场景:进行不同类型消息分类处理场合。如日志收集处理,用户可以配置不同的路由键值分别对不同级别日志信息进行分类处理

     

    Topics通配符模式)

     

           该原理类似于路由模式,不同的是Topics模式设置的路由建是包含通配符的,其中,#匹配多个字符,*匹配一个字符,然后与其它字符一起使用“.”进行连接,从而组成动态路由键,从而将消息路由到不同的消息队列。

     

            适用场景:使用于不同的需求动态传递处理业务的场合。如某些订单客户只收邮件,一些订阅客户只接收短信。可根据需求进行动态路由匹配,从而将订阅消息分发到不同的消息队列中。

     

     

    RPC 

             原理是客户端发送消息到消息队列,远程服务端获取消息,然后做一定的处理并写入到另一个消息队列中,最后再向客户端发送响应消息处理结果,其原理图是一个回环状。

     

             适用场景:远程调用、分布式,另外,过程中需用到事务,因为要考虑消息的完整性。

                      

     

     

    Spring Boot整合Rabbit MQ

     

        整合方式分类:1.基于API的方式; 2.基于配置类的方式;3.基于注解的方式;

             工作模式: Publish/SubscribeRoutingTopics工作模式;

              

     

     

    Publish/Subscribe的工作组成 1.定制中间件; 2.消息发送者发送消息; 3.消息消费者接收消息

     

     1.基于API的方式

    e.g: 用户注册成功后同时发送邮件通知和消息通知为例。

          1)建SpringBoot工程,添加web依赖和RabbitMQ依赖。

          2)全局配置文件配置rabbitMQ连接相关配置,以及虚拟主机路径。

          3)使用AMQPAdmin定制消息发送组件,并且该类也可作为测试类来使用

                         I)注入AdqmAdmin类的实例     II)写定义fanout类型的交换器、定义持久化队列分别处理消息、然后将前两者绑定

          4)建立消息发布者模型,用一个实体类传递消息对象,即一个javaBean。

          5)实现可序列化接口或写一个消息转换器,否则会抛出异常,因为发送消息过程中必须是字符串或是序列化后的实体类对象。

               此时,消息会暂存在消息队列中。

          6)接下来,消费者开始消费消息,在业务层中写消息接收和处理的类,在代码头部写@Service注解将本类注入到Spring容器

               中,然后@RabbitListener来监听相关的消息队列中的消息,然后取得消息体。

     

                

     

     2.基于配置类的方式

            I)基于配置类的方式主要是使Spring Boot框架提供的@Configuration注解配置类定制的消息发送组件,并进行消息发送

            II)在此过程中用@Bean注解将需要的组件注入到Spring容器中,这些需要定制的组件包括:消息转换器、消息交换器(用于

            消息路由)、消息队列组件的定制、并用bind方法将消息队列和转换器绑定到一起。

            III)测试

            

            

    3.基于注解的方式

           在类的头部写@Service注解,然后通过@RabbitListenter(bindings=@QueueBindsing(value=(""),exchange="value",type=""))创建消息,并将消息组件和交换器绑定在一起。

     

    对比:其实三种方式原理一致,只是实现方式不同,相比之下更推荐第三种和第三种。     

     

     

     

     

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    Out of hay
    P3028 [USACO10OCT]汽水机Soda Machine
    P3619 魔法
    P2847 [USACO16DEC]Moocast(gold)奶牛广播-金
    P2830 写程序
    c#DateTime与unix时间戳互相转换
    C# UdpClient使用
    udp单播,广播,多播实现(ReceiveFromAsync,SendToAsync)
    udp广播,单播,多播
    C#实现异步阻塞TCP(Send,Receive,Accept,Connect)
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/12234054.html
Copyright © 2011-2022 走看看