最近在写微服务架构的项目,使用的是dubbo来让服务上传到注册中心,rpc远程调用,这样消费者也就是web页面可以远程调用服务。但此时存在了问题。
首先,服务会越来越多,消费者也是,有的站点需要调用多个服务,此时也就代表着项目的耦合度很高,因为如果有的站点需要依次执行很多服务提供的接口服务,此时一旦有一个服务出现问题,就会出现失效,所以此时消息中间件出场了。
什么是消息中间件?
- 定义:
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有
Producer(生产者)
Consumer(消费者)
Broker(消息服务器,作为server提供消息核心服务)
Topic :主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播
Queue:队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收
Message:消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输
- 常见的消息中间件产品:
- (1)ActiveMQActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。
- (2)RabbitMQAMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得到运用。
- (3)ZeroMQ史上最快的消息队列系统
- (4)KafkaApache下的一个子项目 。特点:高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统。适合处理海量数据。
为什么使用消息中间件可以降低耦合?
我们可以提供消息中间件将消费者的需求(需要调用什么服务)送到中间件中,此时服务查看中间件的信息,发现了有消费者需要调用自己的服务,就开始执行,也就是说,此时我们改变了之前消费者和提供者同步的机制,进行异步执行。
JMS是什么?
JMS(Java Meaasge service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。
JMS本身只定义了一系列的接口规范,是一种与厂商无关的 API,用来访问消息收发系统。JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JMS 客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。
- JMS 定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。
名称 | 作用 |
---|---|
TextMessage | 一个字符串对象 |
MapMessage | 键值对数据 |
ObjectMessage | 一个序列话对象 |
BytesMessage | 一个字节的输入流 |
StreamMessage | java原始值的数据流 |
JMS消息传递类型
方式 | 概念 |
---|---|
点对点 | 一个生产者和一个消费者一一对应(一条消息只能有一个接收方(消费者)) |
发布/ 订阅模式 | 一个生产者产生消息并进行发送后,可以由多个消费者进行接收。(一条消息可以有多个接收方) |
ActiveMQ的下载和安装
- 下载linux或者window下的压缩包,我这里使用的是linux
- 解压缩后进入目录使用以下命令开启:
./activemq start
- 开启防火墙端口或者直接关闭防火墙,开启防火墙端口命令如下(centos7版本):
firewall-cmd --add-port=61616/tcp --permanent
firewall-cmd --add-port=8161/tcp --permanent
firewall-cmd --reload
- 虚拟机IP地址+访问8161端口:
- 此时可以进入管理界面:
- 账户和密码均为admin
名称 | 含义 |
---|---|
Number Of Pending Messages | 等待消费的消息 这个是当前未出队列的数量。 |
Number Of Consumers | 消费者 这个是消费者端的消费者数量 |
Messages Enqueued | 进入队列的消息 进入队列的总数量,包括出队列的 |
Messages Dequeued | 出了队列的消息 可以理解为是消费这消费掉的数量。 |