消息驱动之背景概述(十九)
背景历史
在EJB2.0的时候,J2EE就引入了java message bean组件,即java消息组件,来处理企业组件之间的通讯。Spring Cloud里面提供的消息驱动就来源于这里,并且使用这些消息驱动模块来完成微服务之间的通讯。
消息中间件
当我们的消息生产者产生了消息之后,就把消息推送到RabbitMQ或Kafka这样的消息中间件上,消息消费者实现了对消息中间件的监听,当侦听到了消息的时候,就去获取对应的消息,完成整个消息的推送接收流程。
如果是简单的单条消息传递,那直接从消息生产者到消息消费者就OK了,但是消息一旦多起来,并且生产者和消费者都错综复杂,就更不利于管理了。使用消息中间件就可以集中化管理这些复杂的消息。消息生产者可以看作是现实生活中的寄信人,RabbitMQ或Kafka这样的消息中间件相当于是一个邮局,最后的收信人类似消息消费者。我们只需要把自己需要寄送的信件放到邮筒里,就可以完成信件的寄送,收信人也只需要从邮箱取信件,至于中间邮局是怎么完成信件的接收、运输和分发,我们都不关心。
Spring Cloud就完成了上述的工作,它使用Stream来帮助我们完成各个服务之间的消息推送接收,同时集成了RabbitMQ和Kafka这样的消息中间件API,可以十分便捷地完成消息推送接收开发。
其实这也是Spring Cloud整个核心的体现,简化开发流程,能让我们将大部分的精力集中到业务的开发上。
RabbitMQ简介
1.RabbitMQ的特点
RabbitMQ是最广泛部署的开放源码消息代理。
RabbitMQ在小型创业公司和大型企业中有超过3.5万的生产部署。
RabbitMQ是轻量级的,并且可以很容易地部署在网站和云中。
RabbitMQ支持多个消息传递协议。
RabbitMQ可以部署在分布式和级联配置中,以满足高规模、高可用性需求。
RabbitMQ在许多操作系统和云环境中运行,并为大多数流行语言提供了广泛的开发工具。
2.AMQP协议
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有 RabbitMQ等。
下图就是一个AMQP协议的模型:
消息生产者与RabbitMQ服务器建立了一个channel通道,通过这个channel通道向交换器传输消息,交换器接收了消息之后决定把消息交给哪一个消息队列,同样,消息消费者和RabbitMQ之间也建立了一个channel通道,消息消费者通过这个通道来监听消息队列的消息。
Kafka简介
Kafka是Apache的一个分布式流媒体平台。
首先看看下面列出的流媒体特性:
- 发布和订阅记录流,类似于消息队列或企业消息传递系统。
- 以一种容错的持久方式存储记录流。
- 在发生的过程中处理记录流
Kafka通常用于两大类应用:
- 构建实时的流数据管道,可靠地在系统或应用程序之间获取数据
- 构建能够转换或响应数据流的实时流媒体应用程序
Kafka的几个特性:
- Kafka是在一个或多个服务器上运行的,可以跨越多个数据中心。
- Kafka的集群存储了被称为Topic类别的记录流。
- 每条记录由一个键、一个值和一个时间戳组成。
Kafka的四个核心API:
- 生产者API允许应用程序将记录流发布到一个或多个Kafka的Topic。
- 使用者API允许应用程序订阅一个或多个Topic,并处理生成给它们的记录流。
- Streams API允许应用程序充当流处理器,从一个或多个Topic中获取输入流,并生成一个输出流到一个或多个输出Topic,有效地将输入流转换为输出流。
- 连接器API允许构建和运行可重用的生产者或消费者,将Kafka的Topic与现有的应用程序连接起
Spring Cloud系列:
Spring Cloud服务管理框架Eureka简单示例(三)