--- title: 消息中间件(1)-初见 date: 2018-10-24 10:57:22 categories: - Java tags: - JMS --- ### 中间件 非底层操作系统软件, 非业务应用软件, 不是直接给最终用户使用的 不能直接给客户带来价值的软件统称为中间件 ### 消息中间件 关注**数据的发送和接收**, 利用高效可靠的异步消息传递机制集成**分布式**系统 不同的模块或者服务之间利用消息中间件进行间接的交互, 可以降低耦合度 也可以适应容灾的需要, 避免由于一个服务出现问题对其他服务造成重大影响 比如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)