溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

RocketMQ ACL的原理和使用

發(fā)布時間:2021-06-28 15:36:47 來源:億速云 閱讀:188 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“RocketMQ ACL的原理和使用”,在日常操作中,相信很多人在RocketMQ ACL的原理和使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”RocketMQ ACL的原理和使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1、什么是ACL?

ACL是access control list的簡稱,俗稱訪問控制列表。訪問控制,基本上會涉及到用戶、資源、權限、角色等概念,那在RocketMQ中上述會對應哪些對象呢?

  • 用戶 用戶是訪問控制的基礎要素,也不難理解,RocketMQ ACL必然也會引入用戶的概念,即支持用戶名、密碼。

  • 資源 資源,需要保護的對象,在RocketMQ中,消息發(fā)送涉及的Topic、消息消費涉及的消費組,應該進行保護,故可以抽象成資源。

  • 權限 針對資源,能進行的操作,

  • 角色 RocketMQ中,只定義兩種角色:是否是管理員。

另外,RocketMQ還支持按照客戶端IP進行白名單設置。

2、ACL基本流程圖

在講解如何使用ACL之前,我們先簡單看一下RocketMQ ACL的請求流程: RocketMQ ACL的原理和使用

對于上述具體的實現(xiàn),將在后續(xù)文章中重點講解,本文的目的只是希望給讀者一個大概的了解。

3、如何配置ACL

3.1 acl配置文件

acl默認的配置文件名:plain_acl.yml,需要放在${ROCKETMQ_HOME}/store/config目錄下。下面對其配置項一一介紹。

3.1.1 globalWhiteRemoteAddresses

全局白名單,其類型為數(shù)組,即支持多個配置。其支持的配置格式如下:

  • 空 表示不設置白名單,該條規(guī)則默認返回false。

  • "*" 表示全部匹配,該條規(guī)則直接返回true,將會阻斷其他規(guī)則的判斷,請慎重使用。

  • 192.168.0.{100,101} 多地址配置模式,ip地址的最后一組,使用{},大括號中多個ip地址,用英文逗號(,)隔開。

  • 192.168.1.100,192.168.2.100 直接使用,分隔,配置多個ip地址。

  • 192.168.*.或192.168.100-200.10-20 每個IP段使用 "" 或"-"表示范圍。

3.1.2 accounts

配置用戶信息,該類型為數(shù)組類型。擁有accessKey、secretKey、whiteRemoteAddress、admin、defaultTopicPerm、defaultGroupPerm、topicPerms、groupPerms子元素。

3.1.2.1 accessKey

登錄用戶名,長度必須大于6個字符。

3.1.2.2 secretKey

登錄密碼。長度必須大于6個字符。

3.1.2.3 whiteRemoteAddress

用戶級別的IP地址白名單。其類型為一個字符串,其配置規(guī)則與globalWhiteRemoteAddresses,但只能配置一條規(guī)則。

3.1.2.4 admin

boolean類型,設置是否是admin。如下權限只有admin=true時才有權限執(zhí)行。

  • UPDATE_AND_CREATE_TOPIC 更新或創(chuàng)建主題。

  • UPDATE_BROKER_CONFIG 更新Broker配置。

  • DELETE_TOPIC_IN_BROKER 刪除主題。

  • UPDATE_AND_CREATE_SUBSCRIPTIONGROUP 更新或創(chuàng)建訂閱組信息。

  • DELETE_SUBSCRIPTIONGROUP 刪除訂閱組信息。

3.1.2.5 defaultTopicPerm

默認topic權限。該值默認為DENY(拒絕)。

3.1.2.6 defaultGroupPerm

默認消費組權限,該值默認為DENY(拒絕),建議值為SUB。

3.1.2.7 topicPerms

設置topic的權限。其類型為數(shù)組,其可選擇值在下節(jié)介紹。

3.1.2.8 groupPerms

設置消費組的權限。其類型為數(shù)組,其可選擇值在下節(jié)介紹。可以為每一消費組配置不一樣的權限。

3.2 RocketMQ ACL權限可選值

  • DENY 拒絕。

  • PUB 擁有發(fā)送權限。

  • SUB 擁有訂閱權限。

3.3、權限驗證流程

上面定義了全局白名單、用戶級別的白名單,用戶級別的權限,為了更好的配置ACL權限規(guī)則,下面給出權限匹配邏輯。 RocketMQ ACL的原理和使用

4、使用示例

4.1 Broker端安裝

首先,需要在broker.conf文件中,增加參數(shù)aclEnable=true。并拷貝distribution/conf/plain_acl.yml文件到${ROCKETMQ_HOME}/conf目錄。

broker.conf的配置文件如下:

brokerClusterName = DefaultCluster
brokerName = broker-b
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
listenPort=10915
storePathRootDir=E:/SH2019/tmp/rocketmq_home/rocketmq4.5MB/store
storePathCommitLog=E:/SH2019/tmp/rocketmq_home/rocketmq4.5MB/store/commitlog
namesrvAddr=127.0.0.1:9876
autoCreateTopicEnable=false
aclEnable=true

plain_acl.yml文件內(nèi)容如下:

globalWhiteRemoteAddresses:

accounts:
- accessKey: RocketMQ
  secretKey: 12345678
  whiteRemoteAddress:
  admin: false
  defaultTopicPerm: DENY
  defaultGroupPerm: SUB
  topicPerms:
  - TopicTest=PUB
  groupPerms:
  # the group should convert to retry topic
  - oms_consumer_group=DENY

- accessKey: admin
  secretKey: 12345678
  whiteRemoteAddress:
  # if it is admin, it could access all resources
  admin: true

從上面的配置可知,用戶RocketMQ只能發(fā)送TopicTest的消息,其他topic無權限發(fā)送;拒絕oms_consumer_group消費組的消息消費,其他消費組默認可消費。

4.2 消息發(fā)送端示例

public class AclProducer {
    public static void main(String[] args) throws MQClientException, InterruptedException {
        DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name", getAclRPCHook());
        producer.setNamesrvAddr("127.0.0.1:9876");
        producer.start();
        for (int i = 0; i < 1; i++) {
            try {
                Message msg = new Message("TopicTest3" ,"TagA" , ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
                SendResult sendResult = producer.send(msg);
                System.out.printf("%s%n", sendResult);
            } catch (Exception e) {
                e.printStackTrace();
                Thread.sleep(1000);
            }
        }
        producer.shutdown();
    }

    static RPCHook getAclRPCHook() {
        return new AclClientRPCHook(new SessionCredentials("rocketmq","12345678"));
    }
}

運行效果如圖所示: RocketMQ ACL的原理和使用

4.3 消息消費端示例

public class AclConsumer {

    public static void main(String[] args) throws InterruptedException, MQClientException {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4", getAclRPCHook(),new AllocateMessageQueueAveragely());
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        consumer.subscribe("TopicTest", "*");
        consumer.setNamesrvAddr("127.0.0.1:9876");
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            [@Override](https://my.oschina.net/u/1162528)
            public ConsumeConcurrentlyStatus consumeMessage(List<messageext> msgs,
                ConsumeConcurrentlyContext context) {
                System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();
        System.out.printf("Consumer Started.%n");
    }

    static RPCHook getAclRPCHook() {
        return new AclClientRPCHook(new SessionCredentials("rocketmq","12345678"));
    }
}

發(fā)現(xiàn)并不沒有消費消息,符合預期。

到此,關于“RocketMQ ACL的原理和使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI