基于apollo代理的MQTT协议使用方法

Apollo 1.7.1用户手册

创建一个代理

       代理实例是包含所有配置和运行时数据(如与代理进程关联的日志和数据文件)的目录。 建议您不要在安装Apollo发行版的目录下创建实例目录。

       在unix系统上,将这种运行时数据存储在/ var / lib目录下是一种常见惯例。 例如,要在'/ var / lib / mybroker'创建实例,请运行:

cd /var/lib
apollo create mybroker

代理实例目录将包含以下子目录:

        bin:保存与此实例关联的执行脚本。

        etc:保存实例配置文件。

        data:保存用于存储持久性消息的数据文件。

        log:保存轮转日志的文件。

        tmp:保存在代理运行之间安全删除的临时文件。

此时您可能需要调整位于etc目录中的默认配置。

代理配置

        可以通过编辑以下文件之一来调整和配置每个代理实例。

bin/apollo-broker:您可以更新启动脚本来控制JVM(java虚拟机)级别配置选项,如JVM内存大小调整。

etc/apollo.xml:代理的主要配置文件。 它控制打开的端口,队列,安全性,虚拟主机设置等等。

etc/log4j.properties:这是控制代理记录的标准log4j配置文件。

etc/keystore:用于保存加密安全密钥和证书的Java密钥存储区。 只需要代理使用SSL。

etc/login.conf用于定义代理可用的JAAS(java验证和授权API)认证域的标准JAAS [login.conf]配置文件。

etc/users.properties:保存可以访问代理的用户的用户名/密码映射。 由etc / login.conf文件引用。

etc/groups.properties:将组保存到用户映射,以便通过使用组来简化访问控制列表(ACL),而不是列出单个用户。

black-list.txt:禁止连接到代理的IP地址列表。    

自动配置重新加载

       代理启动后,您可以编辑etc目录中的任何配置文件,并且您的更改将自动重新加载。 配置更新将以尽可能不中断的方式应用。 例如,如果您删除了连接器,则连接器正在侦听的端口将被释放,并且不会接受任何新连接。 之前由该连接器接受的连接将继续正常运行。

调整JVM设置

您可以在bin / apollo-broker启动脚本中定义以下环境变量来自定义JVM设置:

        JAVACMD :要使用的java可执行文件的路径。

        JVM_FLAGS:传递了第一个JVM标志。 默认为-server -Xmx1G,您可能希望根据实际使用情况降低或提高最大内存。

        APOLLO_OPTS:您可以添加的其他JVM选项。

        APOLLO_DEBUG:设置为true以在端口5005上启用调试。

        APOLLO_PROFILE:设置为true以实现基于YourKit(性能分析软件)的分析。

        JMX_OPTS:使用的JMX JVM选项默认为-Dcom.sun.management.jmxremote

确保在apollo-broker脚本执行apollo之前定义变量,并且在unix脚本的情况下导出变量。

了解apollo.xml文件

        有许多支持XSD的XML编辑器可以使编辑XML配置文件的错误更少。 如果您使用其中一种编辑器,则可以将其配置为使用此apollo.xsd文件。

        最简单有效的apollo.xml定义了一个虚拟主机和一个连接器。



  
    localhost
    
  

  

        代理,虚拟主机和连接器都分配了一个ID,REST基于管理控制台用于识别相应的运行时资源。 由于虚拟主机正在使用null_store,因此它不会持续发送给它的任何消息。

        代理可以配置多个虚拟主机和连接器。

        当代理首次启动时,它将根据XSD模式验证配置文件并报告找到的任何错误/警告,但它会继续启动代理,即使它发现问题。 如果在模式验证中发现任何问题,您应该让代理中止启动,您应该将代理元素的验证属性设置为严格。 例:


  ...

        如果您希望代理定期自动触发Java堆垃圾回收(GC)循环,请在代理元素中添加一个auto_gc元素。 GC循环会在需要时自动启动,但如果您的监控代理使用外部监控工具堆积使用,那么定期强制执行GC循环可能会更好,因为您的监控工具可以更精确地跟踪实际的堆使用情况。 将auto_gc的interval属性设置为强制GC循环之间的秒数。 如果间隔未设置,则默认为30。例如:


  ...
  
  ...

连接器

代理连接器用于接受与代理的新连接。 连接器元素可以使用以下属性进行配置:

        enabled:如果设置为false,则连接器主机将被禁用。

        bind:连接器将侦听的传输,它包括它将绑定到的IP地址和端口。 传输是使用URI语法指定的。

        connection_limit:此连接器在停止接受其他连接之前将接受的最大同时打开连接数。 如果没有设置,那么没有限制。

        protocol :  默认为任何代理的支持协议都可以通过此传输进行连接。

        receive_buffer_size_auto_tune:设置是否自动调整内部套接字接收缓冲区(又称套接字的SO_RCVBUF)。 自动调整每1秒发生一次。 默认值是true。

        send_buffer_size_auto_tune:设置是否自动调整内部套接字发送缓冲区(又称套接字的SO_SNDBUF)。 自动调整每1秒发生一次。 默认值是true。

      默认情况下,代理会根据过去5分钟内针对代理建立的最大连接数和JVM堆的大小,将连接器的传输“自动调整”到“64k”和“2k”之间。 将receive_buffer_size_auto_tune和send_buffer_size_auto_tune设置为false以禁用此自动调谐。

        此外,连接器元素可以包含协议特定的配置元素。 例如,要让代理将消息的user_id标头设置为发送消息的用户的标识,可以使用以下配置:


  

        如果您使用的是任何协议,那么将通过检查客户端的初始请求来检测正在使用的实际协议。 您可以使用连接器元素中的检测元素来配置协议检测设置。 detect元素支持以下属性:

        timeout:协议检测允许的最大时间量(以毫秒为单位)。 默认为5000毫秒。 如果客户端在超时过期之前未发送初始请求,则连接将关闭。

        如何将协议检测超时设置为30秒的示例:


  

TCP传输

TCP传输使用tcp:// URI方案。 它使用URI主机和端口来确定绑定哪些本地接口。 例如:

        tcp://0.0.0.0:61613绑定到端口61613上的所有IPv4接口。

        tcp:// [::]:61613绑定到端口61613上的所有IPv4和IPv6接口。

        tcp://127.0.0.1:0绑定到动态端口上的环回接口。

TCP URI还支持多个查询参数,以便在创建时微调套接字上使用的设置。 支持的参数是:

        backlog : 设置监听积压大小。 默认为100。

        keep_alive:启用或禁用SO_KEEPALIVE套接字选项(也就是设置套接字的SO_KEEPALIVE)。 默认为true。

        traffic_class:设置IP头中的流量类别或服务类型字节,用于从传输器发送的数据包(也称为设置套接字的IP_TOS)。默认为8,这意味着流量应该针对吞吐量进行优化。

       max_read_rate:设置此传输将在其每秒接收数据的最大字节数。 此设置限制读取,以便不超过速率。 默认为0,禁用限制。

        max_write_rate:设置此传输器将在每秒发送数据的最大字节数。 此设置会限制写入操作,以便不会超出速率。 默认为0,禁用限制。

        receive_buffer_size:设置内部套接字接收缓冲区的初始大小(也就是设置套接字的SO_RCVBUF)。

        send_buffer_size:设置内部套接字发送缓冲区的初始大小(也就是设置套接字的SO_SNDBUF)。

使用几个选项的示例:

一定要注意
&

        用于分隔选项值,而不是仅仅因为URI位于XML文件中。 在URI字符串中,我们指定了创建套接字时应该使用的缓冲区大小,但是如果启用自动调整,则它们的值可能会更改。

WebSocket传输

        HTML 5引入了WebSockets,作为从网页与服务器异步通信的标准化方式。 这是在网页中实现异步消息传递的理想渠道。 它可以用来封装像STOMP这样的其他协议,并且避免了使用长轮询等Comet技术向浏览器传递数据的需要。 此外,由于JavaScript可以轻松处理文本和JSON格式的数据,因此STOMP协议是通过WebSocket使用消息传递协议的自然选择。

        WebSocket传输使用ws:// URI方案,安全WebSocket传输使用wss:// URI方案。 与TCP传输一样,此传输使用URI主机和端口来确定绑定到哪些本地接口。 例如:

        ws://0.0.0.0:61623绑定到端口61623上的所有IPv4接口。

        ws:// [::]:61623绑定到端口61623上的所有IPv4和IPv6接口。

        wss://127.0.0.1:0绑定到动态端口上的环回接口。

WebSocket URI还支持以下查询参数来微调套接字上使用的设置:

        binary_transfers:是否应将数据作为二进制blob发送到客户端。 目前并非所有浏览器都支持二进制WebSocket数据。 默认为false。

        cors_origin:指定跨源资源共享限制,包括*全部或单独的服务器名称
        max_text_message_size:指定websocket连接器可以处理的文本消息的大小
        max_binary_message_size:指定websocket连接器可以处理的二进制消息的大小

        max_idle_time:基础websocket套接字的超时限制

配置示例:


        值得注意的一件事是,Web套接字(就像Ajax)实现相同的源策略,所以默认情况下,您只能访问与网页源自的主机相同的主机上运行的代理。

        如果您希望允许不同主机使用WebSocket连接器的跨源资源共享(CORS),则应该将cors_origin查询参数添加到绑定URI,并使用允许访问WebSocket连接器的公共分离列表进行分离。 使用*允许从任何域进行访问。 例:

WebSocket客户端

您可以使用以下JavaScript库之一通过WebSockets访问代理:

        Stomple

        stomp-websocket

Apollo发行版在以下发行版目录中包含一些基于WebSocket的简单聊天示例:

    examples/stomp/websocket

    examples/mqtt/websocket

UDP传输

UDP传输使用udp:// URI方案。 它使用URI主机和端口来确定绑定哪些本地接口。 例如:

        udp://0.0.0.0:61615绑定到端口61615上的所有IPv4接口。
        udp:// [::]:61615绑定到端口61615上的所有IPv4和IPv6接口。

        udp://127.0.0.1:0绑定到动态端口上的环回接口。

UDP传输必须配置为使用UDP特定的协议处理程序。 这是通过在连接器元素上设置协议属性来完成的。例如:

支持的协议可以与udp传输一起使用:

udp:获取接收到的UDP数据报中的所有数据,并将其作为二进制消息转发给配置的主题。 该协议可以通过在连接器元素中嵌套udp元素进行配置。 udp元素支持的选项有:
        topic:发送消息的主题名称。 默认为udp。
        buffer_size:用于在套接字和主题端点之间进行缓冲的内存量。 默认为640k。

stomp-udp:期望接收到的UDP数据报包含一个STOMP帧。 STOMP帧的处理和路由就像将在TCP传输中接收到的任何STOMP帧一样。 该协议可以通过在连接器元素中嵌套一个stomp元素进行配置。 有关更多详细信息,请参阅Stomp协议选项部分。

虚拟主机

        虚拟主机允许Apollo支持多租户风格配置。 每个虚拟主机都高度隔离,每个虚拟主机都有自己的持久性,安全性和运行时约束配置。

        像STOMP 1.1这样的协议,通知代理客户端正试图连接哪个主机。 代理将搜索其虚拟主机列表以查找具有匹配的已配置host_name的第一个主机。 不支持虚拟主机的协议将只连接到配置文件中定义的第一个虚拟主机。

        host_name:虚拟主机被认为是的主机名。 如果主机有许多主机名,则该元素应重复多次。
虚拟主机元素可以使用以下属性进行配置:
        enabled:如果设置为false,则虚拟主机将被禁用。

        purge_on_startup:如果设置为true,代理启动时将清除代理的持久状态。

        虚拟主机还可以定义多个主题,队列和dsub元素来保护或调整消息传递对不同主题或队列的工作方式。 如果没有定义,则使用敏感的默认设置,允许目标在被应用程序访问时自动创建。最后,virtual_host配置还应该包含一个消息存储配置元素,以启用虚拟主机上的消息持久性。

队列

在代理中首次创建新队列时,其配置将由与正在创建的队列相匹配的第一个队列元素确定。 匹配的属性是:

        id:队列的名称,可以使用通配符匹配多个或不设置为匹配所有队列。

如果队列定义在id中没有使用通配符,那么将在代理首次启动时创建队列。队列元素可以使用以下属性进行配置:

        mirrored:如果设置为true,如果设置为true,那么一旦创建了队列,则发送到队列的所有消息都将镜像到同名的主题,并且发送到该主题的所有消息都将镜像到队列中。 有关更多详细信息,请参阅镜像队列文档。 默认为false。

        tail_buffer:分配用于保存新入队消息的内存缓冲区空间量。 默认为640k。

        persistent:如果设置为false,那么队列将不会持久存储其消息。 默认为true。

        message_group_graceful_handoff:设置为true时,队列会将消息的消息组消耗程序排空,然后允许将新消息分派给由于重新平衡而移动到其他使用者的消息组。 默认为true。

        round_robin:目标应该使用循环分配策略将消息分发给消费者吗? 默认为true。 如果设置为false,则消息将分派给第一个连接的消费者,直到这些消费者开始限制代理。

        swap:如果设置为false,那么队列不会交换消息内存。 默认为true。

        swap_range_size:每次从商店加载的刷新队列条目数量的最大数量。 请注意,Flushed entires只是引用实际消息的指针。 未加载时,该批被引用为序列范围以节省内存。 默认为10000。

        quota:队列允许增长的最大磁盘空间量。 如果设置为-1,那么没有限制。 您可以使用如下设置值:500mb或1g,只是像1024000这样的普通字节数。一旦配额被超过,生产者将会阻塞,直到使用量减少。 默认没有限制。

        quota_messages:消息队列的最大数量允许增长到。如果没有设置,那么没有限制。默认没有限制。

        auto_delete_after:如果未设置为0,那么一旦没有使用者,生产者或消息达到配置的秒数,队列就会自动删除。如果未设置,则默认为30。

        fast_delivery_rate:消息传递速率(以字节/秒为单位)如果消费者位于队列的尾部,队列就足够快地考虑消费者开始减慢入队率以匹配消费率。默认为1M。

         catchup_enqueue_rate:当队列消费者被认为速度很快时,生产者将被限制的速率。这允许消费者赶上并到达队列尾部。如果未设置,则计算为当前消费者交付率的1/2。

        max_enqueue_rate:队列的最大入队率。一旦这个入队率达到,生产者将被流量控制。如果没有设置,则它被禁用。

        dlq:是否为目标配置了死信队列。死信队列用于存储未被消费者处理的消息。如果没有设置,则无法处理的消息将被丢弃。如果名称中出现'*',它将被替换为队列的ID。

        nak_limit:消息一旦被配置,消息的配置次数将被视为毒害消息,并且如果配置或丢弃,则会移至死信队列。如果设置为小于1,则该消息永远不会被认为是毒害消息。默认为零。

        dlq_expired:应该过期的邮件发送到死信队列?默认为false。

        full_policy:一旦队列已满,full_policy控制队列在额外消息尝试入队到队列时的行为方式。

您可以将其设置为以下选项之一:

        block:生产者阻止,直到有些空间释放。

        drop tail:删除队列中排队的新消息。

        drop head:丢弃队列前面的旧消息。

如果队列是永久性的,那么当达到最大配额大小时,它将被视为已满。 如果队列不是持久的,那么一旦tail_buffer填满,队列就被视为已满。 如果未指定,则默认为'block'。配置示例:


    ...
    
    ...
  

主题

在代理中首次创建新主题时,其配置将由与正在创建的主题相匹配的第一个主题元素确定。 匹配的属性是:

        id:主题的名称,可以使用通配符与多个匹配,也可以不匹配所有主题。

如果主题定义没有在ID中使用通配符,那么将在代理首次启动时创建主题。主题元素可以使用以下属性进行配置:

        slow_consumer_policy:有效值是块和队列。 默认为阻止。 此设置定义了如何处理主题订阅,从而影响缓慢的用户方案。 如果设置为队列,那么每个订阅都会得到一个临时队列,当消费缓慢时可以将消息交换到磁盘,以便产品不会减慢到最慢消费者的速度。 如果设置为阻止,生产者阻止慢速消费者,这使得生产者只能像最慢的消费者那样快速。

        auto_delete_after:如果未设置为0,那么一旦没有使用者或生产者达到配置的秒数,该主题就会自动删除。 如果未设置,则默认为30。

        将slow_consumer_policy设置为队列的主题可以通过添加嵌套订阅元素来自定义每个订阅队列的设置。 订阅元素支持队列元素的以下配置属性:tail_buffer,persistent,swap swap_range_size,quota,full_policy,fast_delivery_rate,catchup_enqueue_rate,max_enqueue_rate,dlq,nak_limit。 例:


    ...
    
      
    
    ...
  

持久订阅

当代理中首次创建新的持久订阅时,其配置将由与正在创建的持久订阅匹配的第一个dsub元素确定。 匹配的属性是:
        id:订阅的名称。
        id_regex:用于匹配订阅ID的正则表达式
如果要在代理第一次启动时创建持久预订,则必须设置topic属性和可选的selector属性。
        topic:持久订阅将订阅的主题。
        selector:筛选出消息的选择器表达式
可以使用队列元素上的所有可用属性来配置dsub元素。

镜像队列

        镜像队列一旦创建,将把发送到队列的所有消息复制到同名的主题,相反,队列将收到发送到该主题的所有消息的副本。
镜像队列可用于在一个逻辑目标上混合队列和主题行为。例如,我们假设foo被配置为镜像目标,并且在foo队列上有2个订阅者,而在主题foo上有2个订阅者。在生产者方面,发布者可以发送队列或主题并获得相同的结果。在消费者方面,2个消费者队列foo将获得队列语义,来自队列的消息将在2个消费者之间进行负载平衡。关于foo主题的两位消费者将分别获得发送的每条消息的副本。您甚至可以在主题上创建持久订阅,然后有效地成为镜像原始队列的队列。
        重要的是要注意,在队列创建之前,镜像不会启动,通常情况下,您首先会向队列发送消息或订阅消息。

消息存储

        消息存储用于实现可靠的消息传递和消息交换,它们都是可选功能,如果在虚拟主机上未配置消息存储,则该功能将被禁用。 如果没有配置消息存储,则所有消息路由都会在内存中执行,并且当消费者速度较慢或无消费者时,队列将快速“填满”,因为消息无法交换到磁盘。Apollo支持多种消息存储实现。 目前支持的实现是:

        LevelDB Store:是一个基于文件的消息存储库,它使用Google的LevelDB库实现,以将索引保存到包含消息的日志文件中。 这是使用的默认实现。
        BDB Store:是使用Sleepycat BDB库实现的基于文件的消息存储库。 这个实现应该在所有平台上都能很好地工作,因为它是纯Java实现。

LevelDB商店

        LevelDB商店是新创建的Broker实例将使用的默认商店。当你的virtual_host元素包含一个leveldb_store元素时,它被启用。
 
    ...
    
    ..
  

leveldb_store元素可以使用以下属性进行配置:

        directory :商店用来保存其数据文件的目录。如果商店不存在,商店将创建该目录。

        flush_delay:刷新延迟是商店将延迟保留邮件工作单元的时间量(以毫秒为单位),希望其后不久会被另一个工作单元无效,从而使操作无效。默认为500。

        read_threads:允许的并发IO读取次数。该值默认为10。

        sync:如果设置为false,则存储不会将日志记录操作同步到磁盘。该值默认为true。

        log_size:发生日志文件旋转之前每个数据日志文件的最大大小(以字节为单位)。该值默认为104857600(100 MB)。

        log_write_buffer_size:写入文件系统之前建立的最大日志数据量。该值默认为4194304(4 MB)。

        verify_checksums:如果设置为true,则强制校验和验证代表特定读取从文件系统读取的所有数据。默认情况下,不进行此类验证。

        paranoid_checks:如果检测到内部损坏,则尽快将存储错误排除。该值默认为false。

        index_max_open_files:索引可以使用的打开文件的数量。该值默认为1000。

        index_block_restart_interval:密钥增量编码的重新启动点之间的数字键。该值默认为16。

        index_write_buffer_size:转换为已排序的磁盘文件之前在内存中建立的索引数据量。该值默认为4194304(4 MB)。

        index_block_size:每个块打包的索引数据的大小。该值默认为4096(4 K)。

        index_cache_size:用于缓存索引块的最大内存量。该值默认为268435456(256 MB)。

        index_compression:应用于索引块的压缩类型。可以很快或没有。该值默认为快速。

        log_compression:应用于日志记录的压缩类型。可以很快或没有。该值默认为快速。

        auto_compaction_ratio:此比率用于确定何时压缩leveldb索引。当您将leveldb索引使用的磁盘空间与数量队列条目的比率超过配置的auto_compaction_ratio时,则会计划leveldb索引进行压缩。如果设置为0,则禁用自动压缩。该值默认为100。

支持平台

LevelDB商店在Linux,OS X和受支持的Windows版本上使用JNI驱动程序,但可以回到其他平台上的实验性纯Java驱动程序。受支持的Windows版本是安装了MS VC ++ 2010 Redistributable软件包的Vista,Server 2008和更高版本:

        如果您运行的是32位JVM,请安装:Microsoft Visual C ++ 2010 Redistributable Package(x86)

        如果您运行的是64位JVM,请安装:Microsoft Visual C ++ 2010 Redistributable Package(x64)

BDB商店

        由于许可条款的限制,Apache无法重新分配BDB库,但您可以直接从Oracle直接获得免费副本。 在开始使用BDB Store之前,您必须先在je-5.0.34.jar中从Oracle下载它,然后将其复制到$ {APOLLO_HOME} / lib目录中。

对于那些安装了curl的人,你可以运行:

curl http://download.oracle.com/maven/com/sleepycat/je/5.0.34/je-5.0.34.jar > ${APOLLO_HOME}/lib/je-5.0.34.jar

一旦完成,您可以通过在虚拟主机中添加一个bdb_store元素来启用存储。 例如:


    ...
    
    ..
  
可以使用以下属性配置bdb_store元素:

        directory :商店用来保存其数据文件的目录。 如果商店不存在,商店将创建该目录。

        flush_delay:刷新延迟是商店将延迟保留邮件工作单元的时间量(以毫秒为单位),希望其后不久会被另一个工作单元无效,从而使操作无效。 默认为500。

        read_threads:访问存储时使用的并发读取线程数。 该值默认为10。

安全

解决Java 7 SSL漏洞问题

        正如APLO-287号问题所指出的,似乎有些版本的Java 7在SSL会话方面存在问题,需要使用Diffie-Hellman密码套件。 如果遇到此问题,只需将Bouncy Castle bcprov-jdk15on-148.jar复制到Apollo的lib目录并重新启动代理。

SSL / TLS传输

        Apollo支持SSL / TLS传输级别的安全性,以避免第三方监听代理与客户之间的通信。 要启用它,只需添加一个连接器,该连接器使用安全传输(如ssl://)进行绑定。 它还需要在代理下有一个key_storage配置元素来配置加密密钥和证书的存储位置。例如:



  
连接器元素的bind属性控制服务器使用哪个安全传输算法。 支持的值是:
        ssl:// - 使用SSL算法的JVM默认版本。
        sslv *:// - 使用特定的SSL版本,其中*是JVM支持的版本。 例如:sslv3
        tls:// - 使用JVM默认版本的TLS算法。

        tlsv *:// - 使用特定的TLS版本,其中*是JVM支持的版本。 例如:tlsv1.1

您可以在key_storage元素上配置的属性是:
        file:密钥存储区所在的路径。
        password:密钥存储区密码
        key_alias:要使用的私钥的别名。 默认为密钥存储区中的第一个密钥。
        key_password:密钥存储区中密钥的密码。
        store_type:密钥存储的类型,默认为JKS。
        trust_algorithm:信任管理算法,默认为SunX509。

        key_algorithm:密钥管理算法,默认为SunX509。

SSL / TLS传输是TCP传输的扩展,因此它支持TCP传输支持的所有相同的URI选项以及以下内容:

        client_auth:可以设置为以下其中一项:需要,不需要。 默认需要。 如果设置为需要,则如果客户端未提供密钥存储所信任的证书,则SSL连接将不被接受。 如果设置为无,那么我们不会要求客户发送他的证书。 如果设置为想要,那么我们将请求客户发送他的证书,但是即使没有任何信任的证书,也允许连接继续。

认证

        保护代理的第一步是对用户进行身份验证。 默认的Apollo配置使用基于文件的认证。 身份验证是使用JAAS执行的,他的配置文件位于etc / login.conf下的实例目录中。 JAAS配置文件可以定义多个指定的认证域。 代理元素和虚拟主机元素可以配置为针对这些域进行身份验证。

        在代理级别定义的认证元素将用于认证代理级别的管理功能,并对任何未定义认证元素的虚拟主机进行认证。 如果要禁用虚拟主机中的身份验证,请将enable属性设置为false。


  

  
    
    wine.com
  

  
    internal.wine.com
  

  
    
    cheeze.com
  

  

        以上示例使用2个JAAS域,内部和外部。 Broker wine.com主机将使用外部域,internal.wine.com主机将使用内部域,并且测试主机不会对用户进行身份验证。

使用自定义登录模块

        Apollo使用JAAS来控制用户认证的系统。默认Apollo配置使用基于文件的身份验证,但对JAAS配置进行简单更改,则可以对本地UNIX帐户或LDAP进行身份验证。请参阅JAAS文档以获取有关如何编辑etc / login.conf文件的更多详细信息。

        由于不同的JAAS登录模块会生成不同类别的主体,因此您可能需要配置哪些类别类型以识别为用户主体和用于匹配访问控制列表(ACL)的主体。
        所识别的默认用户主体类是org.apache.activemq.jaas.UserPrincipal和javax.security.auth.x500.X500Principal。您可以通过在认证元素下添加user_principal_kind元素来更改默认值。第一个主要谁的类型匹配这个列表将被选为用户的身份信息的目的。
      同样,默认的acl主体类是org.apache.activemq.jaas.GroupPrincipal。您可以通过在theauthentication`元素下添加acl_principal_kinds元素来配置它。没有明确类型的ACL条目将默认使用此处列出的种类。

自定义使用的主要类型的示例:

...
  
    com.sun.security.auth.UnixPrincipal
    com.sun.security.auth.LdapPrincipal
    com.sun.security.auth.UnixPrincipal
    com.sun.security.auth.LdapPrincipal
  
  ...

授权

        代理资源的用户授权通过使用代理中的access_rule元素或虚拟主机元素配置访问控制规则来完成。 这些规则定义了哪些主体被允许或拒绝访问对服务器资源执行操作。 下面显示了一个规则列表:


  
  
  
        allow和deny属性定义允许或拒绝访问的主体。如果设置为“+”,那么它与所有校长匹配,但至少需要一个校长。如果设置为“*”,它匹配所有校长,甚至匹配没有校长与主题相关的情况。

允许或拒绝必须定义。您可以选择定义一个或多个以下属性,以便在规则匹配授权检查时进一步缩小范围:

        separator:如果设置,则允许和拒绝字段将被解释为由分隔符值分隔的原则列表。
        principal_kind:空格分隔的类名称列表将与原则类型匹配。如果设置为*,则它匹配所有主体类。默认为代理或虚拟主机上配置的默认主体类型。
        action:与规则匹配的空格分隔的操作列表。示例'创建销毁'。您可以使用*来匹配所有操作。默认为*。
        kind:与此规则匹配的空间分隔的代理资源类型列表。您可以使用*来匹配所有密钥。示例值“代理队列”。默认为*。
        id:与此规则匹配的资源的标识符。您可以使用*来匹配所有资源。如果种类设置为队列或主题,则可以使用目标通配符与目标ID进行匹配。默认为*
        id_regex:要应用于资源ID的正则表达式。

        connector:用户必须连接的连接器的ID,以使规则匹配。您可以使用*来匹配所有连接器。默认为*。

如果没有访问规则匹配授权检查,则访问被拒绝。

订购

        规则的定义顺序非常重要。 匹配的第一个条目决定他是否有权访问。 例如,假设用户是组“蓝色”和“红色”,并且您符合以下规则:


        然后,由于拒绝规则首先匹配,所以用户将不被允许发送。 如果ACL列表中的顺序颠倒了,如下所示:


        然后允许用户访问资源,因为允许规则首先匹配。 当单个规则定义允许和拒绝属性并且它们都匹配时,则该操作被拒绝。

资源操作

您可以使用以下一个或多个值配置访问规则的操作属性:

        admin:使用管理Web界面
        monitor:只读使用管理Web界面
        config:使用管理Web界面访问和更改代理配置。
        connect :允许连接到连接器或虚拟主机
        create:允许创建
        destroy:允许销毁
        send:允许用户发送到目的地
        receive:允许用户发送以从目的地进行非破坏性读取
        consume:允许用户对目标进行破坏性读取

        *:所有操作

资源种类

        您可以使用以下一个或多个值配置访问规则的kind属性:代理,连接器,虚拟主机,主题,队列,dsub或*。 *匹配所有资源种类。

        代理和连接器类型只能在代理元素中定义的规则中配置。

在配置中加密密码

        etc / apollo.xml文件支持使用$ {}样式语法。 您可以使用任何系统属性,并且如果存在etc / apollo.xml.properties文件,则可以使用其中定义的任何属性。 通过使用apollo encrypt命令,可以将etc / apollo.xml.properties中的任何属性值替换为加密版本。

        假设您当前的key_storage包含需要用加密版本替换的纯文本密码:

        我们先来看看密码的加密版本是什么。 Apollo使用存储在APOLLO_ENCRYPTION_PASSWORD环境变量中的密码对值进行加密和解密。

以下是如何加密以前密码的示例:

$ export APOLLO_ENCRYPTION_PASSWORD='keepmesafe'
$ apollo encrypt open
ENC(6r7HKCib0H8S+OuSfV+muQ==)
$ apollo encrypt sesame
ENC(FP+H2FIg++sSaOxg/ISknw==)

获得加密密码后,可以将它们添加到etc / apollo.xml.properties文件中。 例如:

store.pass=ENC(6r7HKCib0H8S+OuSfV+muQ==)
key.pass=ENC(FP+H2FIg++sSaOxg/ISknw==)

最后,确保配置的最后一步是将纯文本密码替换为对相应属性名称的变量引用:

 ...
  
  ...

在配置中使用加密密码时,必须确保在启动代理之前将APOLLO ENCRYPTION PASSWORD环境变量设置为适当的值。

基于Web的管理

        Apollo在http://127.0.0.1:61680和https://127.0.0.1:61681默认启动基于Web的管理界面。 请注意,它绑定到回送接口,以便只有本地Web浏览器才能访问该接口。

        如果代理启用了身份验证并定义了配置代理管理员的ACL,则Web界面将执行基本身份验证,并仅授予访问管理ACL中的那些用户的权限。
        如果你想禁用网页界面,那么你应该删除web_admin配置元素。 如果要允许远程管理,则应更新配置,以便绑定0.0.0.0或[::]地址。

        例如:


  ...
  
  
  ...

web_admin元素可以使用以下属性进行配置:

        bind:以URL语法绑定Web界面的地址和端口。

如果您想允许Web管理API的跨源资源共享(CORS),那么您应该将cors_origin查询参数添加到绑定URI,并使用允许访问Web管理API的域的公共分离列表。 使用*允许从任何域进行访问。 例:


  ...
  
  
  ...

管理代理

        本节的其余部分假定您已经在/ var / lib / mybroker目录或c:\ mybroker目录下创建了代理实例(如果您在Windows上)。

在前台运行代理实例

要在前台启动代理实例,只需执行bin / apollo-broker run。 例:

/var/lib/mybroker/bin/apollo-broker run

要停止它,请按Ctrl-C将终止信号发送到进程。

管理后台代理实例

在Linux / Unix上

        如果您使用的是Unix,则可以使用bin / apollo-broker-service脚本来管理代理服务。 该脚本与大多数Unix / Linux系统用来控制后台服务的/etc/init.d样式脚本兼容。

在Ubuntu操作系统上,您可以安装该服务,并通过运行以启动它:

sudo ln -s /var/lib/mybroker/bin/apollo-broker-service /etc/init.d/apollo
sudo update-rc.d apollo defaults

在Redhat操作系统上,您可以安装该服务,并在运行时启动该服务:

sudo ln -s /var/lib/mybroker/bin/apollo-broker-service /etc/init.d/apollo
sudo chkconfig apollo --add

在其他Unix上,您可以安装该服务,并在运行时启动该服务:

sudo ln -s /var/lib/mybroker/bin/apollo-broker-service /etc/init.d/apollo
sudo ln -s /etc/init.d/apollo /etc/rc0.d/K80apollo
sudo ln -s /etc/init.d/apollo /etc/rc1.d/K80apollo
sudo ln -s /etc/init.d/apollo /etc/rc3.d/S20apollo
sudo ln -s /etc/init.d/apollo /etc/rc5.d/S20apollo
sudo ln -s /etc/init.d/apollo /etc/rc6.d/K80apollo

您可以直接使用该脚本执行以下功能:

        starting:apollo-broker-service开始
        stopping:阿波罗经纪人服务站
        restarting:apollo-broker-service restart
        checking the status:apollo-broker-service状态

        当代理程序在后台启动时,它会创建一个data / apollo.pid文件,其中包含执行代理程序的进程的进程ID。 该文件通常用于与Monit等外部看门狗进程集成。

在Windows系统上

        Windows用户可以使用bin \ apollo-broker-service可执行文件将代理安装为后台服务。

要作为后台服务安装,您需要执行:

c:\mybroker\bin\apollo-broker-service install

卸载服务使用:

c:\mybroker\bin\apollo-broker-service uninstall

您现在可以使用标准的Windows服务工具来控制代理的启动和停止,也可以使用相同的可执行文件来执行以下操作:

        启动服务:apollo-broker-service启动
        停止服务:apollo-broker-service停止

        检查状态:apollo-broker-service restart

        如果您想自定义JVM选项来启动后台服务,则需要编辑bin \ apollo-broker-service.xml文件。 后台服务执行的所有服务控制台和事件日志都存储在log \ apollo-broker-service。*下。

查看代理状态

        Apollo为管理员提供了基于Web的界面,以检查Broker的运行时状态。 如果您在本地计算机上运行代理,只需打开Web浏览器即可访问http:// localhost:61680或https:// localhost:61681。
        Web界面将显示连接器的状态并显示连接的连接。 它还将允许您深入到每个配置的虚拟主机并查看正在使用的主题和队列。

        有关如何将基于Web的界面用作RESTful API的更多信息,请参阅Management API文档。

导出/导入存储

        导出会将虚拟主机的消息存储中的所有数据压缩到zip存档中。 导入反转导出过程并将导出的数据恢复到虚拟主机的消息存储库。 导出/导入通常用于:

        1.备份消息存储
        2.在不同的消息存储实现之间迁移
支持出口和进口的商店有:
        1.BDB商店
        2.LevelDB商店

代理必须在使用导入或导出命令之前停止。 导入存档时要小心,因为它将首先清除任何数据的消息存储区!

使用apollo-broker store-export命令导出数据。 例如:

/var/lib/mybroker/bin/apollo-broker store-export myarchive.tgz
        上述命令将加载mybroker的配置并将第一个虚拟主机的消息存储导出到myarchive.tgz。 您可以使用--virtual-host命令行选项更具体地指定要导出的虚拟主机。

使用apollo-broker store-import命令导入数据。 例如:

/var/lib/mybroker/bin/apollo-broker store-import myarchive.tgz
        就像存储导出命令一样,它将加载mybroker的配置并将存档导入第一个虚拟主机的消息存储库。

你可能感兴趣的:(MQTT)