ActiveMQ 配置分析及使用详解

  目录结构:

  在Windows或Linux下查看AactiveMQ的目录结构,在5.15.3版本下,目录结构如下:
在这里插入图片描述

  bin:bin目录包含ActiveMQ启动脚本,包括Windows和Linux版本。

  conf:conf目录包含ActiveMQ服务、安全、账号、日志等配置。

  data:data目录存储ActiveMQ持久化数据以及日志文件,ActiveMQ使用Kahadb存储持久化消息。

  docs:docs目录包含一份ActiveMQ简单的使用说明文档。

  examples:examples目录是官方提供的示例,包括基于amqp、openwire、stomp等协议,java、python等语言的多协议多语言示例。

  lib:lib目录提供ActiveMQ在几种应用场景下所需jar依赖。

  webapps:webapps是ActiveMQ管理端Web实现,使用Jetty容器运行。

  webapps-demo:webapps-demo是ActiveMQ Demo样例。

  配置详解:

  AactiveMQ的配置文件基本都集中在conf目录下,里面包含很多方面的配置,接下来一一对配置文件进行解释:

  activemq.xml:

  activemq.xml是消息中间件通信主要配置文件,打开配置文件,下面显示的是已经删除相关注释的内容以及配置块解释:

<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
  	<!-- 加载credentials.properties文件,此文件中包含鉴权信息 -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>file:${activemq.conf}/credentials.properties</value>
        </property>
    </bean>
    <!-- 审计日志 -->
    <bean id="logQuery" class="io.fabric8.insight.log.log4j.Log4jLogQuery"
          lazy-init="false" scope="singleton"
          init-method="start" destroy-method="stop">
    </bean>
    <!-- ActiveMQ代理配置 -->
    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
        <destinationPolicy>
            <policyMap>
              <policyEntries>
                <policyEntry topic=">" >
                  <pendingMessageLimitStrategy>
                  	<!-- 内存中至多存储1000条消息,其余将会被删除或保存在temp store中 -->
                    <constantPendingMessageLimitStrategy limit="1000"/>
                  </pendingMessageLimitStrategy>
                </policyEntry>
              </policyEntries>
            </policyMap>
        </destinationPolicy>
        <!-- 针对JMX进行配置 -->
        <managementContext>
            <managementContext createConnector="false"/>
        </managementContext>
        <!-- 持久化适配器,使用Kahdb进行消息持久化存储 -->
        <persistenceAdapter>
            <kahaDB directory="${activemq.data}/kahadb"/>
        </persistenceAdapter>
        <!-- 系统使用情况 -->
        <systemUsage>
          <systemUsage>
              <memoryUsage>
              	  <!-- 内存使用情况 -->
                  <memoryUsage percentOfJvmHeap="70" />
              </memoryUsage>
              <storeUsage>
              	  <!-- 存储最大可用. -->
                  <storeUsage limit="100 gb"/>
              </storeUsage>
              <tempUsage>
              	  <!-- 临时存储可用大小 -->
                  <tempUsage limit="50 gb"/>
               </tempUsage>
            </systemUsage>
        </systemUsage>
        <transportConnectors>
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        </transportConnectors>

        <!-- destroy the spring context on shutdown to stop jetty -->
        <shutdownHooks>
            <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
        </shutdownHooks>

    </broker>
    <import resource="jetty.xml"/>

</beans>

  **Prefetch机制:**constantPendingMessageLimitStrategy标签相关,ActiveMQ通过Prefetch机制来提高性能,通过消息消费者端缓存消息来加速处理,如果消息消费者达到设置上限,则不会再接收消息,除非消息消费者主动对消息进行确认,再重新接收消息。

  **transportConnectors:**该标签配置了ActiveMQ的传输链接,接下来一一介绍几种传输链接配置:

  TCP协议:

  ActiveMQ的Broker和Client之间,为了保证高稳定性的通信,可以使用TCP协议实现:

  · 默认配置 tcp://hostname:port?key=value&key=value,默认端口61616

  · 使用wire protocol进行序列化,ActiveMQ将wire protocol命名为OpenWire。

  · 使用TCP,通过字节流方式传输保证高效性、应用广泛、支持任意平台、保证数据传输可靠性。

​  NIO协议:

  NIO是JDK1.4引入的新一代IO,相较于传统的BIO,NIO提供了同步非阻塞解决方案,可以为服务端带来更大的吞吐量,并提高服务端可用性。

  · 配置格式nio://hostname:port?key=value。

  · 大量客户端连接到Broker时,NIO协议可以比TCP需要更少的线程,进而减轻Broker服务压力。

  · NIO比TCP提供更好的性能,减少Broker服务延迟。

  UDP协议:

  UDP与TCP的区别:

  · TCP面向连接,UDP无需连接。

  · TCP提供可靠服务,保证数据传输无差错、不丢失、不重复,不乱序,UDP尽力保证交付,但不保证可靠性。

  · TCP面向字节流,UDP面向报文。

  · TCP通信是点对点,UDP支持一对一、一对多、多对一和多对多等交互。

  · TCP的逻辑通信信道是全双工的可靠信道,UDP的逻辑信号是不可靠信道。

  尽管在可靠性方面相比,TCP更加可靠,但是UDP亦可在很多场景中得到引用,ActiveMQ集成了UDP协议:

  · 配置格式 udp://hostname:port?key=value。

  · 穿透防火墙、减少传递延迟、快速传递数据时,可以使用UDP协议。

  HTTP协议:

  随着Web2.0的崛起,HTTP随着Web应用的推广,应用也随着变的越来越广泛,ActiveMQ可以很方便的集成HTTP协议。

  · 配置格式 http://hostname:port?key=value。

  · 基于http协议的Broker可以穿透防火墙。

  SSL协议:

  SSL协议构建在TCP协议之上,属于应用层协议,在HTTP协议外部提供安全可靠的通信管道,在对安全传输要求比较场合,可以使用基于SSL协议的ActiveMQ。

  · 配置格式 ssl://hostname:port?key=value

  · 除了配置协议链接外,需要配置SSL协议的证书

<sslContext>
  <sslContext 
          keyStore="file:${activemq.base}/conf/sslcert.ks"
	      keyStorePassword="sslpwd"
	      trustStore="file:${activemq.base}/conf/sslcert.ks"
	      trustStorePassword="sslpwd"
	      />
</sslContext>

  VM协议:

  ActiveMQ Broker可以内嵌到应用程序中,此时引用程序可以通过VM协议与Broker进行通信,此时通讯无需经过你网络,因而可以达到最高的性能。

  · 配置格式 vm://brokerName?transportOptions

  · 第一个创建VM连接的客户端会启动一个embed VM broker,之后所有使用相同broker name的VM连接都会使用这个broker。

  · broker上所以连接都关闭时,broker亦会随之关闭。

​  AMQP协议:

  AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是在JMS协议之上提出的工业级的消息中间件解决方案,ActiveMQ亦支持基于AMQP协议的消息处理。

  · 配置格式 amqp://hostname:port?key=value,默认端口5672。

  · 基于AMQP协议,遵循协议相关、实现无关性,可以轻易实现跨语言、跨平台。

  STOMP协议:

  STOMP(Streaming Text Orientated Message Protocol,流文本定向消息协议),提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单,基于开发客户端,因此应用较广泛。

  STOMP协议的前身是TTMP协议,一个简单的基于文本的协议,转为消息中间件设计。

​  配置格式 stomp://hostname:port?key=value,默认端口61613。

  STOMP协议简单,服务端实现复杂,但客户端实现简单,集成简约、方便。

  MQTT协议:

​  MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使得其应用较为广泛。

​ · 配置格式 mqtt://hostname:port?key=value,默认端口1883。

WS协议:

 WS协议是一种在单个TCP连接上进行全双工通信的协议,WS使得客户端和服务器之间的数据交换变得更加简单,允许服务器主动向客户端推送数据。

  · 配置格式 ws://hostname:port?key=value,默认端口61614。

  credentials.properties、credentials-enc.properties、users.properties、groups.properties:

  credentials.properties保存着客户端建立连接需要的账号密码信息,使用这个信息前,需要在activemq.xml中broker节点内新增节点。

  credentials.properties内容:

activemq.username=system
activemq.password=manager
guest.password=password

  activemq.xml中broker内新增节点:

<plugins> 
   <simpleAuthenticationPlugin> 
		<users> 
			<authenticationUser 
				username="{activemq.username}" 
              	password="{activemq.password}" groups="users,admins"/> 
         </users> 
   </simpleAuthenticationPlugin> 
</plugins>

  {activemq.username}和{activemq.password}引用的值即为credentials.properties中对应的值。

  credentials-enc.properties内为credentials.properties内容的密文形式。

  users.properties规定了ActiveMQ的当前账号。

  groups.properties规定了ActiveMQ的当前账号角色。

  jetty.xml、jetty-realm.properties:

  jetty.xml和jetty-realm.properties是管理端页面Web容器Jetty的服务配置,作为ActiveMQ的辅助功能,只需简单了解即可。jetty-realm.properties保存着jetty账户密码信息。

  jetty.xml中只需了解服务端口配置:

<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>

  jmx.access、jmx.password:

  JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。通过使用JMX可以监控ActiveMQ的运行状态和管理系统某些功能,比如清除缓存等。jmx.access定义了用户的使用权限,jmx.password定义了客户端使用JMX的账号密码。

  log4j.properties、logging.properties:

  log4j.properties和logging.properties是关于运行时ActiveMQ的日志配置。

  以上就是ActiveMQ的主要配置,其中activemq.xml是最主要的配置,而transportConnectors则是activemq.xml中的重点。需要深入了解transportConnectors下各种链接协议的应用场景以及配置方式。

猜你喜欢

转载自blog.csdn.net/securitit/article/details/106653507