ActiveMq的传输连接器
1.1理解连接URLS(统一资源定位符)
基础的url是这样的字符格式:<scheme>:<scheme-specific-part>
例如:tcp://localhost:61616代表建议一个和localhost的61616端口的tcp连接.
容错传输直接自动重连或者连接到集群的另外一个节点的能力(static:(tcp://host1:61616,tcp://host2:61616)中间不能加空格).
1.2传输连接器
为了交换数据,生产者和消费者需要连接到broker,这种客户端和broker之间的连接就是通过传输连接器的.
1.2.1 配置传输连接器(/conf/activemq.xml)
在xml文件中有以下这么一段节点,这里可以配置直接的协议以及对应的端口和一些定制化参数.
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/>
<transportConnector name="nio" uri="nio:localhost:61618?trace=true" />
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
启动bat脚本就可以看到某些连接协议被绑定了.
最常用的方案就是把activemq当做一个单独的java应用来运行.这意味着客户端需要某些网络协议去连接activemq.以下是所有用于连接的网络协议以及概述
1.3.1 TCP(Transmission Control Protocol传输控制协议)
TCP作为一种被最广泛应用的因特网协议,同时也被大范围的用于底层的网络协议.所以TCP传输连接器也作为ActiveMq中最常用的连接器.
RFC 793 :传输控制协议(TCP)的目的是作为一个高度可靠的在主机和主机之间进行数据包交换的协议.
在网络之间交换数据之前,我们需要把数据序列化成合适的格式.数据使用我们所知的总线协议来吧数据序列化和反序列化成字节序列在总线中传输.在ActiveMq中使用的默认总线协议是OpenWire.它的主要用途就是为了更有效更快的传输数据.
<transportConnectors>
<transportConnector name="tcp" uri="tcp://localhost:61616?trace=true"/>
</transportConnectors>
1.3.2 NIO(new I/O API PROTOCOL)
nio传输连接器和tcp连接器区别不大.它也是用tcp作为网络协议,openwire作为总线协议作为底层实现.唯一的区别是传输的实现nio使用了NIO api.这使得它更使用以下几种情况
<!--[if !supportLists]-->· <!--[endif]-->有大量客户端需要连接到broker ----能连接到broker的数量受限于操作系统的支持的线程数量.Nio 连接器可以比tcp连接器开启更少的线程对于每个client.
<!--[if !supportLists]-->· <!--[endif]-->传输的流量非常巨大 ----nio连接器提供比tcp更好的体验(在broker方使用更少的资源)
nio的配置可以加入如下节点,你可以使用tcp和nio (发送/接收)
<transportConnectors>
<transportConnector
name="nio" uri="nio://localhost:61618?trace=true" />
</transportConnectors>
1.3.3 UDP协议
tcp是面向流的协议,传输的数据是有序的,不会出现重复发送,UDP传输的数据是无序的,数据有可能被多次传输.tcp保证在传输过程中不会丢包,这是靠着在发送者和接受者之间建立连接来保证的.UDP是无连接的协议,所以它不是可靠的.
udp使用场景:
udp适用哪些需要快速数据传输,以及能处理丢包问题的应用.
有时候broker被置于防火墙之后,你只能通过UDP端口去访问它,
<transportConnectors>
<transportConnector
name="udp" uri="udp://localhost:61618?trace=true" />
</transportConnectors>
1.3.4 SSL协议(后续会将)
1.3.5 HTTP/HTTPS协议
它使用tcp作为底层网络协议并增加了一些自己的逻辑.ActiveMq实现了http传输协议,可以使用http协议用xml来交换数据.这允许Activemq绕过防火墙
http配置可以加入如下节点
<transportConnectors>
<transportConnector name="http"
uri="http://localhost:8080?trace=true" />
</transportConnectors>
为了使用http传输协议,需要加入以下依赖.
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-optional</artifactId>
<version>5.4.1</version>
</dependency>
实际上就是加入以下jar包
$ACTIVEMQ_HOME/lib/optional/activemq-optional-<version>.jar
$ACTIVEMQ_HOME/lib/optional/commons-httpclient-<version>.jar
$ACTIVEMQ_HOME/lib/optional/xstream-<version>.jar
$ACTIVEMQ_HOME/lib/optional/xmlpull-<version>.jar
使用http传输协议对于总体性能来说不是很好(相对于tCP),如果性能很重要,请慎重使用http传输协议.
1.4在虚拟机中连接到ActiveMq
Vm传输连接器是一种内嵌式的broker.使用它意味着不需要额外的网络连接,只需要通过直接方法调用.当第一个被Vm协议创建的连接被建立的时候broker启动.所有之后的连接将会自动连接到这个broker.
你可以使用这种形式的url作为brokerUrl
vm:broker:(tcp://localhost:6000)?brokerName=embeddedbroker&persistent=false
我们定义了一个内嵌的名为embeddedBroker的broker,配置了一个监听6000端口的tcp连接传输器.和内嵌broker处于同一虚拟机的应用通过vm传输连接到broker,外部的应用通过tcp来连接.
你同样可以使用以下方式的url作为brokerUrl:
vm://localhost?brokerConfig=xbean:activemq.xml