ActiveMQ连接协议说明

1  概述

ActiveMQ提供一种连接机制,这种连接机制使用传输连接器(transport connector)实现客户端与代理(client-to-broker)之间的通信;

ActiveMQbroker的主要作用是为客户端程序提供一种通信机制;

使用网络连接器(network connector)实现代理与代理之间的通信.代理可以简单的看出启动了一个socket监听,

一个jms中间件可以启动多个通信监听。另外activemq本身是通过java实现的,我们也可以通过编程方式,在代码中启动activemq的代理器。

连接机制使用传输连接器(transport connector)实现客户端与代理(client-to-broker)之间的通信;

使用网络连接器(network connector)实现代理与代理之间的通信,网络连接起在做集群的时候可能要用到的。

 

 

 

2  连接协议分类

ActiveMq支持的网络协议 

2.1  TCP协议

是ActiveMQ默认的协议,访问方式是 
tcp://hostname:port?key=value&key=value 

配置示例 


Xml代码  

<transportConnectors>  
<transportConnector name="tcp"  
uri="tcp://localhost:61616?trace=true"/>  
</transportConnectors>  

其中trace是active提供的参数,用于打开日志,记录每次的通过该链接通道的命令。 

 

 

2.2  NIO协议

非阻塞方式的IO访问,基于TCP,但是提供了更好的性能,对于大访问量时,可以考虑 

访问及配置 
nio://hostname:port?key=value 


Xml代码  

 <transportConnectors>  
 <transportConnector  
 name="tcp"  
 uri="tcp://localhost:61616?trace=true" />  
 <transportConnector  
 name="nio"  
 uri="nio:localhost:61618?trace=true" />  
 </transportConnectors>  

 

 

2.3     UDP协议

并不保证数据有效性,如在线游戏等情况。 

udp://hostname:port?key=value 


Xml代码  

<transportConnectors>  
<transportConnector  
name="tcp"  
uri="tcp://localhost:61616?trace=true"/>  
<transportConnector  
name="udp"  
uri="udp://localhost:61618?trace=true" />  
</transportConnectors>  

 

2.4     SSH协议

ssl://hostname:port?key=value 


Xml代码  

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

如果指定使用了其他的证书,在服务端配置部分,需要改成 

Xml代码  

<broker xmlns="http://activemq.apache.org/schema/core"  
brokerName="localhost"  
dataDirectory="${activemq.base}/data">  
[b]<sslContext  
keyStore="file:${activemq.base}/conf/mybroker.ks"  
keyStorePassword="test123"/>[/b]  
</sslContext>  
<transportConnectors>  
<transportConnector name="ssl"  
uri="ssl://localhost:61617" />  
</transportConnectors>  
</broker>  

 

启用/禁用 SSL加密套件 

ActiveMQ的SSL传输连接器使用的SSL加密套件(SSLcipher suites)由JVM提供.关于加密套件的详细信息 
请参考SUN的JSSE文档。每种加密套件的实现等都不一样,从5.4.0版本的ActiveMQ开始支持新的参数transport.enabledCipherSuites 

<transportConnectors> 
<transportConnector 
name="ssl" 
uri="ssl://localhost:61617?transport.enabledCipherSuites=SSL_RSA_WITH_RC4_128_SHA"/> 
</transportConnectors>

 
如上使用的是SSL_RSA_WITH_RC4_128_SHA套件。可以开启多个加密套件,使用逗号分割。 
 

 

 

2.5     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 
 

 

 

2.6     VM协议

Java应用程序中的VM传输连接器用于启动并连接到一个内嵌的代理.使用VM传输连接器意味着客户端和内嵌带代理之间不需要网络连接,通过直接调用代理对象的方法来实现通信.因为使用VM连接器后不需要网络协议的参与,所以性能显著提高.使用VM协议首次连接到代理时会启动代理,同一个虚拟机中所有后续的VM传输连接都将连接到这个代理.使用VM协议的代理具有标准ActiveMQ代理的所有特性.当所有使用VM传输连接到代理的客户端都关闭连接后,代理自动关闭. 

配置VM连接器的URI语法如下: 
vm://brokerName?key=value 
如vm://broker1?marshal=false&broker.persistent=false 
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端口 
监听连接,而同一个jvm内运行的程序可以通过vm连接,不同jvm的外部程序,可以通过tcp://localhost:6000连接到这个代理。 

通过配置传输选项的brokerConfig参数,在URI中指定activemq.xml作为配置文件, 
可以使用外部配置文件来配置嵌入式代理.下面是配置例子: 
vm://localhost?brokerConfig=xbean:activemq.xml 
该实例的配置会在类路径中根据xbean:协议查找activemq.xml文件.通过这种方式,使用XML作为配置文件 
可以像配置一个独立的代理那样来配置嵌入式代理. 

3       各连接器说明
 
3.1     网络连接器

集群的代理网络,包含了多个MQ实例。默认是单向的,代理只将其收到的消息发送到收消息连接另一头的代理,如A指接受B的代理信息,但A并不会发送消息到B,而只发送到B之外的其他。通常称为转发桥。 
另外还有一种是双向的A即会接受来自B的,也会把消息发送给B。 


Xml代码  

<networkConnectors>  
<networkConnector name="default-nc" uri="multicast://default"/>  
</networkConnectors>  

name和uri是必须的。 

侦测.通常,侦测是一种搜寻远程代理 
服务的过程.通常,客户端希望能够侦测到所有可用的代理.另一方面,代理也希望能够侦测到其他可用的代理, 
以便可以和他们建立一个代理网络. 

 

 

 

3.2     网络连接器协议分类

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 asingle broker 
失效重连协议   用于为客户端提供自动重连逻辑,以便客户端能够重新连接到一个代理网络或者单个代理 

Multicast      Used for defining dynamic networks of brokers (broker addresses are notstatically 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 
扇出协议       用于发送消息到多个未互联的代理

 

 

 

3.2.1    静态网络连接器

静态网络连接器用于为一个网络中多个代理创建静态配置.这种配置协议使用了一种复合的URI--即包含其他URI的URI. 

下面是静态协议使用的URI语法: 
static:(uri1,uri2,uri3,...)?key=value 

Xml代码  

<networkConnectors>  
<networkConnector name="local network" uri="static://(tcp://remotehost1:61616,tcp://remotehost2:61616)"/>  
</networkConnectors>  

示例 
代理B配置 


Xml代码  

<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 consolexbean:src/main/resources/org/apache/activemq/book/ch4/brokerB.xml 

代理A配置 

Xml代码   

<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接收到消息。 

 

 

 

3.2.2    动态网络连接器

这种动态技术可以实现让客户端和代理之间,代理和代理之间实现动态识别,而不是配置静态的IP组。 

多点传送协议,代理会广播自己的服务,也会定位其他代理。同理客户端可以通过多点协议来接收广播,识别出代理。 

多址传送协议的URI语法如下: 
multicast://ipadaddress:port?key=value 


Xml代码  

 <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属性,客户端就无法通过多点协议扫描到代理, 

用多点传送协议的一个缺点是侦测是自动的.如果你不想把某个代理添加到群组中,你必须十分小心的设置。 

客户端的自动侦测,通信语法是 
discovery:(discoveryAgentURI)?key=value, 
,如discovery:(multicast://default) 
将会自动侦测组名为default的代理。 
上面的配置<transportConnectorname="openwire" uri="tcp://localhost:61616"discoveryUri="multicast://default"/> 
将会被侦测到。 

 

 

 

3.2.3    连接失效转移

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 
默认情况是先随机选择一个连接器,如果该连接器无效,那么会选择下一个。 
失效转移 
连接器URI:是在客户端方面的协议,客户端在链接代理时需要保证链接的可用和可靠。实际上就算客户端只会连接一个代理,也应该使用failover配置通信协议,保证网络中断等问题时会自动重连。 

 

3.2.4    点对点协议

点对点连接器是一种传输连接器网络,是构成点对点的嵌入式代理网络中所有虚拟连接器的集合. 
点对点协议的URI语法如下: 
peer://peergroup/brokerName?key=value 

使用一个点对点协议的RUI启动应用程序会自动启动一个嵌入式代理(就像使用VM协议一样),同时还会配置代理以和相同组名的代理之间建立网络连接.VM也会启动一个内置代理器。 

peer://group1 
如上客户端配置的通信协议如果是这样的话,那么会启动一个内嵌代理,并且客户端会和该内嵌代理通信,而内嵌代理会与组名是group1的代理之间建立网络通信。 

 

 

 

3.2.5    FanOut连接器

Fanout是一种通信器群组,用于使得客户端可以同时连接到多个代理并对这些代理进行相同的操作. 
Fanout协议的URI语法如下: 
fanout:(fanoutURI)?key=value 

fanoutURI值可以使用静态的URI或者多点传送URI.参考下面的示例: 
fanout:(static:(tcp://host1:61616,tcp://host2:61616,tcp://host3:61616)) 
客户端将尝试连接掉3个使用静态协议配置的静态代理. 

使用动态效果 
fanout:(multicast://default) 

此协议的目的是发送消息到多个代理.其次,如果你使用的代理属于同一个代理网络,那么指定的消息消费者可能会接收到重复的消息.因此,通常情况下,fanout协议仅用于发布消息到多个相互之间没有连接在一起的代理.即多个代理之间的独立的。 
————————————————
版权声明:本文为CSDN博主「yuyecsdn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yuyecsdn/article/details/90746766

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值