消息中间件学习

消息中间件概念

       利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信进行分布式系统的集成,通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。

消息中间件应用场景

       跨系统数据传递、高并发流量削峰、数据异步处理...等等

常用消息中间件

       ActiveMQ、RabbitMQ、Kafka、RocketMQ

消息中间件核心设计

       本质

       一种具备接收请求、保存数据、发送数据等功能的网络应用

       和一般网络应用程序的区别是它主要负责数据的接收和传递,所以性能一般都高于普通程序

      5大核心组成

       协议

       持久化机制

       消息分发机制

       高可用设计

       高可靠设计

协议

       协议是计算机之间通信时共同遵从的一组约定,都遵守相同的约定,计算机之间才能相互交流。

       对数据格式和计算之间交换数据时必须遵守的规则的正式描述。

       三要素

       1)语法:即数据与控制信息的结构或格式

       2)语义:即需要发出何种控制信息,完成何种动作以及做出何种响应

       3)时序(同步):即实现顺序的详细说明

消息中间件常用协议:OpenWire、AMQP、MQTT、Kafka、OpenMessage

AMQP协议

       AMQP(Advanced Message Queuing Protocol)是高级消息队列协议,04年JPMorgan Chase(摩根大通集团)联合其他公司共同设计。

       特性

       事务支持、持久化支持,出生金融行业,在可靠性消息处理上具备天然的优势。

       RabbitMQ、ActiveMQ

MQTT协议

       MQTT(Message Queuing Telemetry Transport)消息队列遥测传输是IBM开发的一个即时通讯协议,是物联网系统架构中的重要组成部分。

       特性

       轻量、结构简单、传输快、没有事务支持、没有持久化相关设计

       应用场景

       适用于计算能力有限、低带宽、网络不稳定的场景。

       RabbitMQ、ActiveMQ

Open Message协议

       OpenMessaging是近一两年有阿里发起,与雅虎、滴滴出行、Streamlio等公司共同参与创立的分布式消息中间件、

流处理领域的应用开发标准。

       是国内首个在全球范围内发起的分布式消息领域国际标准

       特性

       结构简单、解析快、有事务设计、持久化设计

       Apache RocketMQ

Kafka协议

       Kafka协议是基于TCP的二进制协议。消息内部是通过长度来分隔,有一些基本数据类型组成。

       特性

       结构简单、解析快、无事务设计、有持久化设计

       Kafka

持久化

       简单来说就是将数据存入磁盘,而不是存在内存中随服务重启而消失,使数据能够永久保存叫做持久化

 ActiveMQRabbitMQKafkaRocketMQ
文件系统支持支持支持支持
数据库支持///

消息分发

         常用消息中间件分发策略

 ActiveMQRabbitMQKafkaRocketMQ
发布订阅支持支持支持支持
轮询分发支持支持支持/
公平分发/支持支持/
重发支持支持/支持
消息拉取/支持支持支持

高可用

       高可用性是指产品在规定的条件和规定的时间区间内处于可执行规定功能状态的能力。当业务量大时,一台消息中间件服务器无法满足需求,所以需要消息中间件能够集群部署,来达到高可用目的。

Master-Slave主从共享数据的部署方式

Master-Slave主从同步数据的部署方式

Broker-Cluster多主集群同步数据的部署方式

Broker-Cluster多主集群转发数据的部署方式

高可靠

       高可靠性是指系统可以无障碍地持续运行。比如一个系统从来不崩溃、报错,或者崩溃、报错的机率较低,那就是高可靠。在高并发业务场景下,如果不能保证系统的高可靠,那造成的损失将会非常严重。

       保证消息中间件的高可靠性,可以从以几个方面考虑

       消息传输可靠:通过协议保证系统间数据解析的正确性

       消息存储可靠:通过持久化保证消息存储的可靠性

ActiveMQ

       ActiveMQ是Apache出品,最流行的,最强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊地位。

JMS规范

       Java消息服务(Java Message Service,即JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API。

JMS对象模型

       ConnectionFactory       连接工厂

       Connection                   连接

       Session                        会话

       Destination                   目的

       MessageProducer       生产者

       MessageConsumer     消费者

       Message                      消息

       Broker                          消息中间件实例

JMS消息模型

       Point-to-Point(P2P)/点对点

        Publish/Subscribe(Pub/Sub)/主题(发布/订阅)

JMS消息结构

       

                                                           消息                    
        消息头           消息属性            消息体

       消息头关于一些描述信息

       JMSDestination            消息的目的地,Topic或者是Queue

       JMSDeliveryMode        消息的发送模式

       JMSTimestamp             消息传递给Broker的时间戳,它不是实际发送的时间

       JMSExpiration               消息的有效期,在有效期内,消息消费者才可以消费这个消息

       JMSPriority                    消息的优先级。0-4为正常的优先级,5-9为高优先级

       JMSMessageID             一个字符串用来唯一标示一个消息

       JMSReplyTo                  有时消息生产者希望消费者回复一个消息,JMSReplyTo为一个Destination,表示需要恢复的目的地

       JMSCorrelationID          通常用来关联多个Message

      JMSType                         表示消息体的结构,和JMS提供者有关

      JMSRedelivered              如果这个值为true,表示消息是被重新发送了

       消息属性可以理解为消息的附加消息头,属性名可以自定义。

       属性值类型:boolean、byte、int、long、float、double、String

       消息体类型

       BytesMessage           用来传递字节消息

       MapMessage             用来传递键值对消息

       ObjectMessage          用来传递序列化对象

       StreamMessage         用来传递文件等

       TextMessage              用来传递字符串

ActiveMQ特性

       支持多中编程语言

       支持多种传输协议

       有多种持久化方式

环境准备

       CentOS7

       JDK 1.8

下载ActiveMQ

       http://activemq.apache.org/download.html

       进入/tmp目录

       cd /tmp

       使用wget下载存档

       wget -c http://mirrors.shu.edu.cn/apache/activemq/5.1.8/apache-activemq-5.15.8-bin.tar.gz

安装ActiveMQ

       提取存档

       tar -zxvf apache-activemq-5.15.8-bin.tar.gz -C /var

       修改ActiveMQ目录名

       mv /var/apache-activemq-5.15.8/ /var/activemq/

       启动ActiveMQ以后,后台进程会有以下输出

       INFO: Loading'/var/activemq//bin/env'

       INFO:Using java '/usr/local/java/jdk1.8.0_181/bin/java'

       INFO:Starting - inspect logfiles specified in logging.propertites and log4j.properties to get details

       INFO: pidfile created : '/var/activemq//data/activemq.pid' (pid '38455')

       作为后台进程启动ActiveMQ

       ./bin/activemq start

ActiveMQ服务

       前面使用命令行运行ActiveMQ,但最好的方式是将ActiveMQ作为服务启动,使用system服务将可以确保ActiveMQ能在系统时自动启动。

创建ActiveMQ服务

       1.使用vim创建一个systemd服务文件

       vi /usr/lib/systemd/system/activemq.service

       2.填入以下内容

       [Unit]

       Description=ActiveMQ service

       After=network.target

 

       [Service]

       Type=forking

       ExecStart=/var/activemq/bin/activemq start

       ExecStop=/var/activemq/bin/activemq stop

       User=root

       Group=root

       Restart=always

       RestartSec=9

       StandardOutput=syslog

       StandardError=syslog

       SyslogIdentifier=activemq

 

       [Install]

       WantedBy=multi-user.target

       3.修改/var/activemq/bin/env配置,将JAVA_HOME的注释取消,填入jdk安装路径

       # Location of the java installation

       # Specify the location of your java installation using JAVA_HOME, or specify the

       # path to the "java" binary using JAVACMD

       # (set JAVACMD to "auto" for automatic detection)

       JAVA_HOME="/usr/local/java/jdk1.8.0_181"

       JAVACMD="auto"

       启动ActiveMQ服务

       systemctl start activemq

       查看服务状态

       systemctl status activemq

       设置开机自动启动

       ln -s /usr/lib/systemd/system/activemq.service /etc/systemd/system/multi-user.target.wants/activemq.service system enable activemq

       开机自启:systemctl status activemq

       检测是否开启成功(enable):systemctl list-unit-files | grep activemq

防火墙添加ActiveMQ端口

       ActiveMA启动后,外部还无法访问,还需要在防火墙中增加ActiveMQ的Web管理端口和通讯端口。

       添加端口

       #Web管理端口默认为8161,通讯端口默认为61616

       firewall-cmd --zone=public --add-port=8161/tcp --permanent

       firewall-cmd --zone=public --add-port=61616/tcp --permanent

       重启防火墙

       systemctl restart firewalld.service

使用ActiveMQ

       使用ActiveMQ Web管理平台

       ActiveMQ自带管理平台,在浏览器访问http://服务IP:8161/admin即可进入。

       ActiveMQ的管理页面默认开启身份校验

       账号:admin

       密码:admin

       Web管理配置

       ActiveMQ的Web管理平台是基于jetty运行,因此在/var/activemq/conf目录可以看到jetty配置文件

      修改web管理平台的默认端口,在/var/activemq/conf/jetty.xml中进行修改

在Java中使用ActiveMQ

       使用Jar包

       在activemq的根目录下有activemq-all-5.15.8.jar包,将其直接复制工程即可

       使用Maven依赖

       <dependency>

         <groupId>org.apache.activemq</groupId>

         <artifactId>activemq-all</artifactId>

         <version>5.15.8</version>

       </dependency>

 

 

 

 

 

 

       

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值