activemq代理
JMS代理(如ActiveMQ broker)的主要作用是为客户端程序提供一种通信机制.为此,ActiveMQ提供一种连接机制,这种连接机制使用传输连接器(transport connector)实现客户端与代理(client-to-broker)之间的通信;使用网络连接器(network connector)实现代理与代理之间的通信.代理可以简单的看出启动了一个socket监听,一个jms中间件可以启动多个通信监听。另外activemq本身是通过java实现的,我们也可以通过编程方式,在代码中启动activemq的代理器。连接机制使用传输连接器(transport connector)实现客户端与代理(client-to-broker)之间的通信;使用网络连接器(network connector)实现代理与代理之间的通信,网络连接起在做集群的时候可能要用到的。
连接配置
文件conf/activemq-demo.xml提供的示例有一段内容
<!--
The transport connectors expose ActiveMQ over a given protocol to
clients and other brokers. For more information, see:
http://activemq.apache.org/configuring-transports.html
-->
<transportConnectors>
<!-- Create a TCP transport that is advertised on via an IP multicast
group named default. -->
<transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/>
<!-- Create a SSL transport. Make sure to configure the SSL options
via the system properties or the sslContext element. -->
<transportConnector name="ssl" uri="ssl://localhost:61617"/>
<!-- Create a STOMP transport for STOMP clients. -->
<transportConnector name="stomp" uri="stomp://localhost:61613"/>
<!-- Create a Websocket transport for the websocket dmeo -->
<transportConnector name="ws" uri="ws://localhost:61614/" />
</transportConnectors>
可以看出,一个transportConnectors可以包含多个transportConnector ,他们的name和uri是唯一的。discoveryUri 是可选的。如上,定义了4个连接器。
ActiveMq支持的网络协议
协议 | 描述 |
---|---|
TCP | 默认的协议,性能相对可以 |
NIO | 基于TCP协议之上的,进行了扩展和优化,具有更好的扩展性 |
UDP | 性能比TCP更好,但是不具有可靠性 |
SSL | 安全链接 |
HTTP(S) | 基于HTTP或者HTTPS |
VM | VM本身不是协议,当客户端和代理在同一个Java虚拟机(VM)中运行时,他们之间需要通信,但不想占用网络通道,而是直接通信,可以使用该方式 |
TCP
是ActiveMQ默认的协议,访问方式是
tcp://hostname:port?key=value&key=value
配置示例
<transportConnectors>
<transportConnector name="tcp" uri="tcp://localhost:61616?trace=true"/>
</transportConnectors>
其中trace是active提供的参数,用于打开日志,记录每次的通过该链接通道的命令。
NIO
非阻塞方式的IO访问,基于TCP,但是提供了更好的性能,对于大访问量时,可以考虑
访问及配置
nio://hostname:port?key=value
<transportConnectors>
<transportConnector name="tcp" uri="tcp://localhost:61616?trace=true" />
<transportConnector name="nio" uri="nio:localhost:61618?trace=true" />
</transportConnectors>
UDP
并不保证数据有效性,如在线游戏等情况。
udp://hostname:port?key=value
<transportConnectors>
<transportConnector name="tcp" uri="tcp://localhost:61616?trace=true"/>
<transportConnector name="udp" uri="udp://localhost:61618?trace=true" />
</transportConnectors>
SSL
ssl://hostname:port?key=value
<transportConnectors>
<transportConnector name="ssl" uri="ssl://localhost:61617?trace=true" />
</transportConnectors>
默认的安全证书位于conf的broker.ts,和broker.ks文件该证书为示例证书,如果要使用SSL协议,需要自己生成相应的环境下的证书。
对应的客户端证书是client.ts,和client.ks
在访问SSL链接时,需要指定使用的证书文件(jvm系统属性)
java
-Djavax.net.ssl.keyStore=${ACTIVEMQ_HOME}/conf/client.ks \
-Djavax.net.ssl.keyStorePassword=password \
-Djavax.net.ssl.trustStore=${ACTIVEMQ_HOME}/conf/client.ts \
如果指定使用了其他的证书,在服务端配置部分,需要改成
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.base}/data">
<sslContext keyStore="file:${activemq.base}/conf/mybroker.ks" keyStorePassword="test123"/></sslContext>
<transportConnectors>
<transportConnector name="ssl" uri="ssl://localhost:61617" />
</transportConnectors>
</broker>
启用/禁用 SSL加密套件
ActiveMQ的SSL传输连接器使用的SSL加密套件(SSL cipher suites)由JVM提供.关于加密套件的详细信息
请参考SUN的JSSE文档。每种加密套件的实现等都不一样,从5.4.0版本的ActiveMQ开始支持新的参数transport.enabledCipherSuites
uri=”ssl://localhost:61617?transport.enabledCipherSuites=SSL_RSA_WITH_RC4_128_SHA” />
如上使用的是SSL_RSA_WITH_RC4_128_SHA套件。可以开启多个加密套件,使用逗号分割。
HTTP
http://hostname:port?key=value
<transportConnectors>
<transportConnector name="tcp" uri="tcp://localhost:61616?trace=true"/>
<transportConnector name="http" uri="http://localhost:8080?trace=true" />
</transportConnectors>
http需要添加几个依赖包
commons-httpclient
xstream
xmlpull
虚拟机内部通信
Java应用程序中的VM传输连接器用于启动并连接到一个内嵌的代理.使用VM传输连接器意味着客户端和内嵌带代理之间不需要网络连接,通过直接调用代理对象的方法来实现通信.因为使用VM连接器后不需要网络协议的参与,所以性能显著提高.使用VM协议首次连接到代理时会启动代理,同一个虚拟机中所有后续的VM传输连接都将连接到这个代理.使用VM协议的代理具有标准ActiveMQ代理的所有特性.当所有使用VM传输连接到代理的客户端都关闭连接后,代理自动关闭.
配置VM连接器的URI语法如下: <br /> vm://brokerName?key=value <br /> 如vm://broker1?marshal=false&broker.persistent=false <br /> URI中brokerName配置非常重要,它是代理的唯一标识.例如,你可以通过配置两个不同的broker name创建两个不同的嵌入式代理,必须保证brokerName是唯一的。
还可以嵌入URI的方式
vm:broker:(transportURI,network:networkURI)/brokerName?key=value
如
配置的URI是
vm:broker:(tcp://localhost:6000)?brokerName=embeddedbroker&persistent=false
我们定义了一个名称为embeddedBroker的代理,同时配置了一个TCP连接器在6000端口 <br /> 监听连接,而同一个jvm内运行的程序可以通过vm连接,不同jvm的外部程序,可以通过tcp://localhost:6000连接到这个代理。
通过配置传输选项的brokerConfig参数,在URI中指定activemq.xml作为配置文件, <br /> 可以使用外部配置文件来配置嵌入式代理.下面是配置例子: <br /> vm://localhost?brokerConfig=xbean:activemq.xml <br /> 该实例的配置会在类路径中根据xbean:协议查找activemq.xml文件.通过这种方式,使用XML作为配置文件 <br />可以像配置一个独立的代理那样来配置嵌入式代理.
网络连接器
集群的代理网络,包含了多个MQ实例。默认是单向的,代理只将其收到的消息发送到收消息连接另一头的代理,如A指接受B的代理信息,但A并不会发送消息到B,而只发送到B之外的其他。通常称为转发桥。
另外还有一种是双向的A即会接受来自B的,也会把消息发送给B。
<networkConnectors>
<networkConnector name="default-nc" uri="multicast://default"/>
</networkConnectors>
name和uri是必须的。
侦测.通常,侦测是一种搜寻远程代理 <br /> 服务的过程.通常,客户端希望能够侦测到所有可用的代理.另一方面,代理也希望能够侦测到其他可用的代理, <br />以便可以和他们建立一个代理网络.
静态网络连接器
静态网络连接器用于为一个网络中多个代理创建静态配置.这种配置协议使用了一种复合的URI—即包含其他URI的URI.
下面是静态协议使用的URI语法: <br /> static:(uri1,uri2,uri3,...)?key=value
<networkConnectors>
<networkConnector name="local network" uri="static://(tcp://remotehost1:61616,tcp://remotehost2:61616)"/>
</networkConnectors>
示例
代理B配置
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="BrokerB" dataDirectory="${activemq.base}/data">
<transportConnectors>
<transportConnector name="openwire" uri="tcp://localhost:61617" />
</transportConnectors>
</broker>
启动代理B
${ACTIVEMQ_HOME}/bin/activemq console xbean:src/main/resources/org/apache/activemq/book/ch4/brokerB.xml
代理A配置
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="BrokerA" dataDirectory="${activemq.base}/data">
<transportConnectors>
<transportConnector name="openwire" uri="tcp://localhost:61616" />
</transportConnectors>
<networkConnectors>
<networkConnector uri="static:(tcp://localhost:61617)" />
</networkConnectors>
</broker>
启动代理A
${ACTIVEMQ_HOME}/bin/activemq console \xbean:src/main/resources/org/apache/activemq/book/ch4/brokerA.xml
当消息发送到代理A,代理A会向B也发送消息,消息消费者可以通过代理B接收到消息。
连接失败
失效转移连协议,有两种实现,静态的代理和动态侦测语法,
failover:(uri1,…,uriN)?key=value
或者failover:uri1,…,uriN,如
failover:(tcp://primary:61616,tcp://secondary:61616)?randomize=false
详细查看http://activemq.apache.org/failover-transport-reference.html <br /> 默认情况是先随机选择一个连接器,如果该连接器无效,那么会选择下一个。 <br /> 失效转移 <br /> 连接器URI:是在客户端方面的协议,客户端在链接代理时需要保证链接的可用和可靠。实际上就算客户端只会连接一个代理,也应该使用failover配置通信协议,保证网络中断等问题时会自动重连。
动态网络
这种动态技术可以实现让客户端和代理之间,代理和代理之间实现动态识别,而不是配置静态的IP组。
多点传送协议,代理会广播自己的服务,也会定位其他代理。同理客户端可以通过多点协议来接收广播,识别出代理。
多址传送协议的URI语法如下: <br /> multicast://ipadaddress:port?key=value
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="multicast" dataDirectory="${activemq.base}/data">
<networkConnectors>
<networkConnector name="default-nc" uri="multicast://default"/>
</networkConnectors>
<transportConnectors>
<transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/>
</transportConnectors>
</broker>
在上面的例子中,使用群组名称”default”来替代具体的IP地址.上面的配置代码片段中有两个地方比较重要.首先,transport connector的discoveryUri属性用于暴露这个传输连接器的URI到名称为default的群组中.所有的希望查找可用代理的客户端都可以使用这个代理。
network connector的uri属性用于查找可用的代理并与之建立代理网络.这样配置后,代理就像客户端一样,使用多点传送协议来查找其他代理。
,移除discoveryUri属性,客户端就无法通过多点协议扫描到代理,
用多点传送协议的一个缺点是侦测是自动的.如果你不想把某个代理添加到群组中,你必须十分小心的设置。
客户端的自动侦测,通信语法是 <br /> discovery:(discoveryAgentURI)?key=value, <br />,如discovery:(multicast://default) <br /> 将会自动侦测组名为default的代理。 <br /> 上面的配置<transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/> <br /> 将会被侦测到。
点对点协议
点对点连接器是一种传输连接器网络,是构成点对点的嵌入式代理网络中所有虚拟连接器的集合.
点对点协议的URI语法如下:
peer://peergroup/brokerName?key=value
使用一个点对点协议的RUI启动应用程序会自动启动一个嵌入式代理(就像使用VM协议一样),同时还会配置代理以和相同组名的代理之间建立网络连接.VM也会启动一个内置代理器。
peer://group1 <br /> 如上客户端配置的通信协议如果是这样的话,那么会启动一个内嵌代理,并且客户端会和该内嵌代理通信,而内嵌代理会与组名是group1的代理之间建立网络通信。
FANOUT连接器
Fanout是一种通信器群组,用于使得客户端可以同时连接到多个代理并对这些代理进行相同的操作.
Fanout协议的URI语法如下:
fanout:(fanoutURI)?key=value
fanoutURI值可以使用静态的URI或者多点传送URI.参考下面的示例: <br /> fanout:(static:(tcp://host1:61616,tcp://host2:61616,tcp://host3:61616)) <br /> 客户端将尝试连接掉3个使用静态协议配置的静态代理.
使用动态效果 <br /> fanout:(multicast://default)
此协议的目的是发送消息到多个代理.其次,如果你使用的代理属于同一个代理网络,那么指定的消息消费者可能会接收到重复的消息.因此,通常情况下,fanout协议仅用于发布消息到多个相互之间没有连接在一起的代理.即多个代理之间的独立的。
总结
Protocol Description
协议 描述
Static Used for defining networks of brokers with known addressess
静态协议 用于定义地址已知的代理之间的网络
Failover Used to provide reconnection logic for clients to the network of brokers or a single broker
失效重连协议 用于为客户端提供自动重连逻辑,以便客户端能够重新连接到一个代理网络或者单个代理
Multicast Used for defining dynamic networks of brokers (broker addresses are not statically defined)
多点传送协议 用于定义一个动态的代理网络(代理的地址无需静态指定)
Discovery Used by clients to connect to dynamic network of brokers
自动侦测协议 客户端用来连接到动态网络代理
Peer Used to easily connect multiple embedded brokers
点对点协议 用于方便的连接到多个嵌入式代理
Fanout Used to produce messages to multiple unconnected brokers
扇出协议 用于发送消息到多个未互联的代理