blog-web/source/_posts/Java/消息中间件(1)-初见.md
2018-11-02 17:26:03 +08:00

81 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 消息中间件(1)-初见
date: 2018-10-24 10:57:22
categories:
- Java
tags:
- JMS
---
### 中间件
非底层操作系统软件, 非业务应用软件, 不是直接给最终用户使用的
不能直接给客户带来价值的软件统称为中间件
<!-- more -->
### 消息中间件
关注**数据的发送和接收**, 利用高效可靠的异步消息传递机制集成**分布式**系统
不同的模块或者服务之间利用消息中间件进行间接的交互, 可以降低耦合度
也可以适应容灾的需要, 避免由于一个服务出现问题对其他服务造成重大影响
比如A服务一个业务功能执行时需要发送一份通知邮件
发送邮件的服务可以独立出来
由A服务向消息中间件发送有关于邮件的消息, 发送邮件服务负责从消息中间件获取这些消息进行对应的处理
如果由A服务直接调用邮件服务
若邮件服务出现问题, 比如响应缓慢, 那么A服务的正常业务功能就会受到重大影响
### JMS
Java消息服务(Java Message Service) 即JMS, 是一个Java平台中关于面向消息中间件的API, 用于在两个程序之间, 或分布式系统中发送消息, 进行异步通信
它只是一个API的规范
### AMQP
AMQP(advanced message queuing protocol)是一个提供统一消息服务的**应用层**标准协议, 基于此协议的客户端与消息中间件可传递消息, **并不受客户端/中间件不同产品, 不同开发语言等条件的限制**
### JMS消息模式
#### 队列模型
+ 客户端包括生产者和消费者
+ 队列中的消息只能被一个消费者消费
+ 消费者可以随时消费队列中的消息
![队列模型](/images/Java/消息队列/队列模型.png)
最主要的特点就是消费的行为是互斥的, 消费的过程就是出队的过程
某一个消息只能被一个消费者消费掉
#### 主题模型
+ 客户端包括发布者和订阅者
+ 主题中的消息被所有订阅者消费
+ 订阅者不能消费订阅之前就发送到主题中的消息
![主题模型](/images/Java/消息队列/主题模型.png)
每一个连接都会收到主题当中所有的消息(订阅之后发布到主题当中的消息)
### ActiveMQ
Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件由于ActiveMQ是一个纯Java程序因此只需要操作系统支持Java虚拟机ActiveMQ便可执行。
首先需要具备jre的环境
下载解压之后执行bin目录下的activemq就可以完成运行或者停止
```bash
# 运行
bin/activemq start > /dev/null 2>&1 &
#停止
bin/activemq stop
```
默认的管理页面端口是8161, 用浏览器访问可以打开管理页面
默认的用户名和密码是admin/admin
这个端口的设定在`conf/jetty.xml`当中
![管理后台端口](/images/Java/消息队列/jetty_port.png)
管理员用户名和密码的设定在`conf/jetty-realm.properties`当中
![管理员设定](/images/Java/消息队列/jetty_realm.png)
注意格式为`用户名: 密码,角色1,角色2...`
ActiveMQ的默认通讯端口有5个, 用于支持不同的协议
设定在`conf/activemq.xml`当中
![通讯端口设定](/images/Java/消息队列/transport.png)