微服务框架springcloud(实用篇)【4】RabbitMQ

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

一、初识MQ

1.同步和异步通讯

微服务间通讯有同步和异步两种方式:

同步通讯:就像打电话,需要实时响应。

异步通讯:就像发邮件,不需要马上回复。

微服务框架springcloud(实用篇)【4】RabbitMQ

两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发送邮件可以同时与多个人收发邮件,但是往往响应会有延迟。

1)同步通讯

Feign调用就属于同步方式,虽然调用可以实时得到结果,但存在下面的问题:

微服务框架springcloud(实用篇)【4】RabbitMQ

微服务框架springcloud(实用篇)【4】RabbitMQ

总结:

同步调用的优点:时效性较强,可以立即得到结果

同步调用的问题:耦合度高、性能和吞吐能力下降、有额外的资源消耗、有级联失败问题

2)异步通讯

异步调用则可以避免上述问题:

常见的实现方式是事件驱动模式

优势:服务解耦、性能提升,吞吐量提高、服务没有强依赖,不担心级联失败问题、流量削峰

微服务框架springcloud(实用篇)【4】RabbitMQ微服务框架springcloud(实用篇)【4】RabbitMQ

以购买商品为例,用户支付后需要调用订单服务完成订单状态修改,调用物流服务,从仓库分配响应的库存并准备发货。

在事件模式中,支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件(event),事件中带上订单id。

订单服务和物流服务是事件订阅者(Consumer),订阅支付成功的事件,监听到事件后完成自己业务即可。

为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,而是有一个中间人(Broker)。发布者发布事件到Broker,不关心谁来订阅事件。订阅者从Broker订阅事件,不关心谁发来的消息。

微服务框架springcloud(实用篇)【4】RabbitMQ

Broker 是一个像数据总线一样的东西,所有的服务要接收数据和发送数据都发到这个总线上,这个总线就像协议一样,让服务间的通讯变得标准和可控。

好处:

        吞吐量提升:无需等待订阅者处理完成,响应更快速

        故障隔离:服务没有直接调用,不存在级联失败问题

        调用间没有阻塞,不会造成无效的资源占用

        耦合度极低,每个服务都可以灵活插拔,可替换

        流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件

缺点:

        架构复杂了,业务没有明显的流程线,不好管理

        需要依赖于Broker的可靠、安全、性能(吞吐能力)

好在现在开源软件或云平台上 Broker 的软件是非常成熟的,比较常见的一种就是MQ技术。

2.技术对比

MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。

比较常见的MQ实现:ActiveMQ、RabbitMQ、RocketMQ、Kafka

几种常见MQ的对比:

微服务框架springcloud(实用篇)【4】RabbitMQ

追求可用性:Kafka、 RocketMQ 、RabbitMQ

追求可靠性:RabbitMQ、RocketMQ

追求吞吐能力:RocketMQ、Kafka

追求消息低延迟:RabbitMQ、Kafka

二、快速入门

1.安装RabbitMQ

(参考最下方的RabbitMq安装指南)

RabbitMQ是基于Erlang语言开发的开源消息通信中间件,官网地址:https://www.rabbitmq.com/

MQ的基本结构:

微服务框架springcloud(实用篇)【4】RabbitMQ

RabbitMQ中的一些角色:

        publisher:生产者

        consumer:消费者

        exchange:交换机,负责消息路由

        queue:队列,存储消息

        virtualHost:虚拟主机,隔离不同租户的exchange、queue、消息的隔离

2.RabbitMQ消息模型

RabbitMQ官方提供了5个不同的Demo示例,对应了不同的消息模型:

微服务框架springcloud(实用篇)【4】RabbitMQ

3.导入Demo工程

课前资料提供了一个Demo工程,mq-demo:

导入后可以看到结构如下:

微服务框架springcloud(实用篇)【4】RabbitMQ

包括三部分:

        mq-demo:父工程,管理项目依赖

        publisher:消息的发送者

        consumer:消息的消费者

4.入门案例

简单队列模式的模型图:

微服务框架springcloud(实用篇)【4】RabbitMQ

官方的HelloWorld是基于最基础的消息队列模型来实现的,只包括三个角色:

- publisher:消息发布者,将消息发送到队列queue

- queue:消息队列,负责接受并缓存消息

- consumer:订阅队列,处理队列中的消息

微服务框架springcloud(实用篇)【4】RabbitMQ

<!--    mq-demo/pom.xml 在父工程中主要是进行依赖管理的-->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.itcast.demo</groupId>
    <artifactId>mq-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>publisher</module>
        <module>consumer</module>
    </modules>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--AMQP依赖,包含RabbitMQ-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <!--单元测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
</project>
//   mq-demo/publisher/src/main/java/cn/itcast/mq/PublisherApplication.java 消息的发布者
package cn.itcast.mq;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class PublisherApplication {
    public static void main(String[] args) {
        SpringApplication.run(PublisherApplication.class);
    }
}

//  mq-demo/consumer/src/main/java/cn/itcast/mq/ConsumerApplication.java 消息的消费者
package cn.itcast.mq;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}
#mq-demo/publisher/src/main/resources/application.yml
#mq-demo/consumer/src/main/resources/application.yml

logging:
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
<!--    mq-demo/publisher/pom.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>mq-demo</artifactId>
        <groupId>cn.itcast.demo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>publisher</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

<!--  ——————————————————————————————————————————        -->
<!--    mq-demo/consumer/pom.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>mq-demo</artifactId>
        <groupId>cn.itcast.demo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>consumer</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

1)publisher实现

思路:建立连接、创建Channel、声明队列、发送消息、关闭连接和channel文章来源地址https://www.toymoban.com/news/detail-501187.html

//  mq-demo/publisher/src/test/java/cn/itcast/mq/h

到了这里,关于微服务框架springcloud(实用篇)【4】RabbitMQ的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【微服务 SpringCloud】实用篇 · Ribbon负载均衡

    微服务(4) 在前面,我们添加了@LoadBalanced注解,即可实现负载均衡功能,这是什么原理、什么策略呢? SpringCloud底层其实是利用了一个名为 Ribbon 的组件 ,来实现负载均衡功能的。 那么我们发出的请求明明是http://userservice/user/1,怎么变成了http://localhost:8081的呢? 为什么我

    2024年02月08日
    浏览(51)
  • SpringCloud微服务 【实用篇】| 统一网关Gateway

    目录 一:统一网关Gateway 1. 为什么需要网关 2. gateway快速入门 3. 断言工厂 4. 过滤器工厂 5. 全局过滤器 6. 跨域问题 前面我们已经学习了注册中心Eureka、Nacos和配置管理中心Nacos;但是此时存在很多安全的问题,服务器摆在那里谁都可以进行访问! 网关功能: ① 身份认证和权

    2024年02月04日
    浏览(43)
  • 【微服务 SpringCloud】实用篇 · Eureka注册中心

    微服务(3) 假如我们的服务提供者 user-service部署了多个实例(不同实例,端口号不一致) ,如图: 大家思考几个问题: 我们刚才的编程,是写死在程序里的,ip和端口都是写死的, 这种硬编码的方式,之后改变ip和端口代码不就没法用了? order-service在发起远程调用的时候

    2024年02月08日
    浏览(40)
  • SpringCloud微服务 【实用篇】| Docker启示录

    目录 一:Docker启示录 1. Docker启示录 2. Docker和虚拟机的区别 3. Docker架构 4. Centos7安装Docker 4.1. 卸载 4.2. 安装docker 4.3. 启动docker 4.4. 配置镜像加速 前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,感兴趣的同学可以进行学习人工

    2024年02月04日
    浏览(38)
  • SpringCloud微服务 【实用篇】| Dockerfile自定义镜像、DockerCompose

    目录 一:Dockerfile自定义镜像 1. 镜像结构 2. Dockerfile语法 3. 构建Java项目 二: Docker-Compose 1. 初识DockerCompose 2. 部署微服务集群 前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,感兴趣的同学可以进行学习人工智能学习 前面我们怎么拉取镜像,怎么去创

    2024年02月03日
    浏览(44)
  • SpringCloud微服务 【实用篇】| Docker镜像、容器、数据卷操作

    目录 一:Docker基本操作 1. 镜像操作 镜像相关命令 2. 容器操作 容器相关命令 3. 数据卷(容器数据管理) 数据卷 操作数据卷 挂载数据卷 挂载的方式区别 前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,感兴趣的同学可以进行学习人工智能学习 镜像相

    2024年02月04日
    浏览(40)
  • SpringCloud微服务 【实用篇】| Eureka注册中心、Ribbon负载均衡

    目录 一:Eureka注册中心 1. Eureka原理 2. 动手实践 ①搭建EurekaServer ②服务注册 ③服务发现  二:Ribbon负载均衡 1. 负载均衡原理 2. 负载均衡策略 3. 懒加载 tips:前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,感兴趣的同学可以

    2024年02月05日
    浏览(49)
  • Linux:服务器间同步文件的脚本(实用)

    比如有三台服务器, hadoop102、hadoop103、hadoop104 ,且都有 atguigu 账号 循环复制文件到所有节点的相同目录下,且脚本可以在任何路径下使用 1、查看环境变量 2、进入 /home/atguigu/bin 目录 在该目录下创建脚本,则该脚本可以在任何路径下使用,因为,这个路径添加在环境变量中

    2024年04月28日
    浏览(41)
  • SpringCloud学习路线(9)——服务异步通讯RabbitMQ

    一、初见MQ (一)什么是MQ? MQ(MessageQueue) ,意思是 消息队列 ,也就是事件驱动架构中的Broker。 (二)同步调用 1、概念: 同步调用是指,某一服务需要多个服务共同参与,但多个服务之间有一定的执行顺序,当每一个服务都需要等待前面一个服务完成才能继续执行。

    2024年02月15日
    浏览(40)
  • SpringCloud实用篇2——Nacos配置管理 Feign远程调用 Gateway服务网关

    Nacos除了可以做注册中心,同样可以做配置管理来使用。 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理,另一方可以

    2024年02月13日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包