1、 ActiveMq单机部署:
演示环境: Centos7、jdk8、activemq5.15.8
下载地址: http://activemq.apache.org/activemq-5158-release.html
解压: tar -zxvf apache-activemq-5.15.8-bin.tar.gz -C /var
修改目录名称 mv /var/apache-activemq-5.15.8/ /var/activemq/
启动: ./bin/activemq start
停止:./bin/activemq stop
**
1.1、创建一个systemd服务文件
**:vi /usr/lib/systemd/system/activemq.service
**
1.1.1、 放入内容
**
[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
1.1.2、 找到java命令所在的目录
whereis java
1.1.3、设置activemq配置文件/var/activemq/bin/env中的JAVA_HOME
# 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"
1.1.4、 通过systemctl管理activemq启停
- 启动activemq服务:
systemctl start activemq
- 查看服务状态:
systemctl status activemq
- 创建软件链接:
ln -s /usr/lib/systemd/system/activemq.service /etc/systemd/system/multi-user.target.wants/activemq.service
- 开机自启:
systemctl enable activemq
- 检测是否开启成功(enable):
systemctl list-unit-files |grep activemq
1.1.5、 防火墙配置
,
Web管理端口默认为8161(admin/admin),通讯端口默认为61616
- 添加并重启防火墙
firewall-cmd --zone=public --add-port=8161/tcp --permanent
firewall-cmd --zone=public --add-port=61616/tcp --permanent
systemctl restart firewalld.service
- 或者直接关闭防火墙:
systemctl stop firewalld.service
1.1.6、 修改web管理系统的部分配置
,配置文件在/var/activemq/conf
- 端口修改
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<!-- the default port number for the web console -->
<property name="host" value="0.0.0.0"/>
<!--此处即为管理平台的端口-->
<property name="port" value="8161"/>
</bean>
- 关闭登录
<bean id="securityConstraint" class="org.eclipse.jetty.util.security.Constraint">
<property name="name" value="BASIC" />
<property name="roles" value="user,admin" />
<!-- 改为false即可关闭登陆 -->
<property name="authenticate" value="true" />
</bean>
- 其他配置:
/var/activemq/conf/jetty-realm.properties
## ---------------------------------------------------------------------------
# 在此即可维护账号密码,格式:
# 用户名:密码,角色
# Defines users that can access the web (console, demo, etc.)
# username: password [,rolename ...]
admin: admin, admin
user: 123, user
1.1.7、 JAVA客户端的使用
- 标准客户端使用
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.8</version>
</dependency>
- Spring中使用:
http://spring.io/guides/gs/messaging-jms/
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-broker</artifactId>
<version>5.15.8</version>
<exclusions>
<exclusion>
<artifactId>geronimo-jms_1.1_spec</artifactId>
<groupId>org.apache.geronimo.specs</groupId>
</exclusion>
</exclusions>
</dependency>
2 、Broker-Cluster 部署
2.1机器列表
- 192.168.100.242
- 192.168.100.243
为了保证机器之间网络互通,建议关闭防火墙:
systemctl stop firewalld.service
2.2、Static静态集群部署方式
static 方式就是在broker的配置中,静态指定要连接到其它broker的地址,格式:
<networkConnector uri="static:(tcp://host1:61616,tcp://host2:61616)"/>
说明: host1、host2表示连接目标的地址,61616是连接目标开放的端口。修改配置前,先停止activemq
2.2.1、修改配置文件
- 修改192.168.100.242上的/var/activemq/conf/activemq.xml,在
<broker></broker>
标签中添加以下代码
<networkConnectors>
<networkConnector uri="static:(tcp://192.168.100.243:61616)"/>
</networkConnectors>
- 修改192.168.100.243上的/var/activemq/conf/activemq.xml,在
<broker></broker>
标签中添加以下代码
<networkConnectors>
<networkConnector uri="static:(tcp://192.168.100.242:61616)"/>
</networkConnectors>
2.3、验证
- 启动所有broker
- 查看日志中是否有WARN等警告/错误信息。
tail -f /var/activemq/data/activemq.log
- 所有的broker都启动后,可以在web管理界面的Networky页面可以看到连接信息。
- 将生产者与消费者分别连接到不同的节点上,看生产者发送的消息,在消费者中能不能收到。
2.2、Dynamic自动发现集群部署方式
ActiveMQ 通过组播方式将自己的信息发送出去,接收到的信息的机器再来连接这个发送源。默认情况下,ActiveMQ 发送的是机器名,可以通过配置修改成发送IP地址。注意机器间的网络。
2.2.1、修改配置文件
-
修改每台机器上的/var/activemq/conf/activemq.xml,在标签中添加以下代码
<networkConnectors> <networkConnector uri="multicast://default"/> </networkConnectors>
-
修改transportConnector,增加discoveryUri属性,并添加publishedAddressPolicy
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600" discoveryUri="multicast://default"> <publishedAddressPolicy> <publishedAddressPolicy publishedHostStrategy="IPADDRESS"></publishedAddressPolicy> </publishedAddressPolicy> </transportConnector>
验证方式和上面的静态方式一致
3、activeMq的解析
基于消息中间件是的分布式系统架构图
3.1消息中间件概述
3.1.1什么是消息中间件
利用高效可靠的消息传递机制进行平台无关的数据交流;
并基于数据通信来进行分布式系统的集成;
通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信;
3.1.2消息中间件的应用场景
跨系统数据传递、高并发流量削峰、数据异步处理…等等
3.1.3常用的消息中间件
ActiverMQ、RabbitMQ、kafka、RocketMQ
3.2 消息中间件核心设计
3.2.1本质
一种具备接收请求、保存数据、发送数据等功能的网络应用。
和一般网络应用程序的区别是它主要负责数据的接收和传递,所以性能一般都高于普通程序。
3.2.2、5大核心组成
- 协议
- 持久化机制
- 消息分发机制
- 高可用设计
- 高可靠设计
3.3协议是什么
协议是计算机之间通信时共同遵从的一组约定,都遵守相同的约定,计算机才能相互交流。
是对数据格式和计算机之间交换数据时必须遵守的规则的正式描述。
协议三要素:
语法:既数据与控制信息的结构或格式;
语义:即需要发出何种控制信息,完成何种动作以及做出何种响应;
时序(t同步);即事件是实现顺序的详细说明
3.4AMQP协议
AMQP(Advanced Message Queuing Protocol)是高级队列协议
04年JPMogran Chase(摩根大通公司)联合其他公司共同设计
特性
事务支持、持久化支持,出生金融行业,可靠性消息处理具备天然的优势。
3.5MQTT协议
MQTT消息队列遥测传输时IBM开发的一个即时通讯协议,物联网系统架构中最重要的部分组成。
特性
轻量、结构简单、传输快、没有事务支持、没有持久化相关设计
应用场景
适用于计算能力有限、低宽带、网络不稳定的场景。
3.6Open Message协议
OpenMessaging 是近一两年由阿里发起,与雅虎、滴滴出行、Streamlio等公司共同参与创立的分布式消息中间件、流处理发起的分布式消息领域国际标准
特性
结构简单、解析快、有事务设计、有持久化设计
3.7Kafka协议
kafka协议是基于TCP二进制协议。消息内部是通过长度来分隔,由一些基本数据类型组成。
特性
结构简单、解析快、无事务设计、有持久话设计
3.8常用的消息中间件分发策略
3.9高可用机制
高可用性是指产品在规定和规范的时刻或时间区间内处于可执行规定功能状态的能力。
当业务量大时,一台消息中间件服务器可能无法满足需求,所以需要消息中间件能够集群部署,来达到高可用的目的。
3.10部署方式
3.10.1Master-Slave主从共享数据的部署方式
3.10.2 Master-Slave主从同步部署方式
3.10.3Broker-Cluster多主集群转发部署方式
3.11、高可靠性是什么
高可靠性是指系统可以无故障地持续运行。比如一个系统从来不崩溃、报错,或者崩溃报错地几率较低,那就是高可靠。
在高并发业务场景下,如果不能保证系统地可靠性,那造成地损失将会非常严重。
保证消息中间件地高可靠性们可以从以下几方面考虑
消息传输可靠:通过协议来保证系统间数据解析的正确性。
消息存储可靠:通过持久化来保证消息的存储可靠性。