使用CuratorFramework,有人可以解释我该如何做:

  • 创建新路径
  • 设置此路径的数据
  • 获取此路径

  • 使用用户名foo和密码bar吗?那些不知道该用户/通行证的人将无能为力。

    对于这个问题,我不在乎通过纯文本发送SSL或密码。

    最佳答案

    Apache Curator中的ACL用于访问控制。因此,ZooKeeper不提供任何身份验证机制,例如clients who don't have correct password cannot connect to ZooKeeper or cannot create ZNodes。它可以做的是防止未经授权的客户端访问特定的Znode/ZNode。为了做到这一点,您必须设置我下面描述的CuratorFramework实例。请记住,这将确保使用给定ACL创建的ZNode可以被同一客户端或提供相同身份验证信息的客户端再次访问。

    首先,您应该按照以下方式构建CuratorFramework实例。在这里,connectString表示以逗号分隔的集合中Zookeeper服务器的ip and port组合列表。

    CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder()
                    .connectString(connectString)
                    .retryPolicy(new ExponentialBackoffRetry(retryInitialWaitMs, maxRetryCount))
                    .connectionTimeoutMs(connectionTimeoutMs)
                    .sessionTimeoutMs(sessionTimeoutMs);
        /*
         * If authorization information is available, those will be added to the client. NOTE: These auth info are
         * for access control, therefore no authentication will happen when the client is being started. These
         * info will only be required whenever a client is accessing an already create ZNode. For another client of
         * another node to make use of a ZNode created by this node, it should also provide the same auth info.
         */
        if (zkUsername != null && zkPassword != null) {
            String authenticationString = zkUsername + ":" + zkPassword;
            builder.authorization("digest", authenticationString.getBytes())
                    .aclProvider(new ACLProvider() {
                        @Override
                        public List<ACL> getDefaultAcl() {
                            return ZooDefs.Ids.CREATOR_ALL_ACL;
                        }
    
                        @Override
                        public List<ACL> getAclForPath(String path) {
                            return ZooDefs.Ids.CREATOR_ALL_ACL;
                        }
                    });
        }
    
    CuratorFramework client = builder.build();
    

    现在您必须启动它。
    client.start();
    

    创建路径。
    client.create().withMode(CreateMode.PERSISTENT).forPath("/your/ZNode/path");
    

    在这里,CreateMode指定要创建的节点类型。可用的类型为PERSISTENT,EPHEMERAL,EPHEMERAL_SEQUENTIAL,PERSISTENT_SEQUENTIAL,CONTAINERJava Docs

    如果不确定到/your/ZNode的路径是否已经存在,也可以创建它们。
    client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/your/ZNode/path");
    

    设置数据

    您可以在创建ZNode或更高版本时设置数据。如果在创建时设置数据,请将数据作为byte数组作为第二个参数传递给forPath()方法。
    client.create().withMode(CreateMode.PERSISTENT).forPath("/your/ZNode/path","your data as String".getBytes());
    

    如果稍后再做,(数据应以字节数组形式给出)
    client.setData().forPath("/your/ZNode/path",data);
    

    最后

    我不明白get this path是什么意思。 Apache Curator是一个Java客户端(比Curator Recipes更多),它在后台使用Apache Zookeeper并隐藏了Zookeeper的极端情况和复杂性。在Zookeeper中,他们使用ZNodes的概念来存储数据。您可以将其视为Linux目录结构。所有ZNodePaths应该以/(根)开头,并且您可以继续指定ZNodePaths之类的目录。例如:/someName/another/test/sample

    java - 与Curator一起使用ACL-LMLPHP

    如上图所示,ZNode以树结构组织。每个ZNode最多可以存储1MB的数据。因此,如果要检索存储在ZNode中的数据,则需要知道该ZNode的路径。 (就像您应该知道数据库的表和列以便检索数据一样)。

    如果您要检索给定路径中的数据,
    client.getData().forPath("/path/to/ZNode");
    

    这就是您想与Curator合作的全部内容。

    还有一件事

    Apache Curator中的ACL用于访问控制。也就是说,如果您将ACLProvider设置如下,
    new ACLProvider() {
        @Override
        public List<ACL> getDefaultAcl () {
            return ZooDefs.Ids.CREATOR_ALL_ACL;
        }
    
        @Override
        public List<ACL> getAclForPath (String path){
            return ZooDefs.Ids.CREATOR_ALL_ACL;
        }
    }
    

    稍后,只有具有与创建者相同的凭据的客户端才可以访问相应的ZNode。认证的详细信息设置如下(请参阅客户端构建示例)。还有其他ACL模式可用,例如OPEN_ACL_UNSAFE,如果将其设置为ACLProvider,则不执行任何访问控制。
    authorization("digest", authorizationString.getBytes())
    

    它们将在以后用于控制对给定ZNode的访问。

    简而言之,如果要防止其他人干扰您的ZNode,可以将ACLProvider设置为返回CREATOR_ALL_ACL,并将授权设置为digest,如上所示。只有使用相同授权字符串("username:password")的CuratorFramework实例才能访问这些ZNode。但这不会阻止其他人在不干扰您的路径中创建ZNode。

    希望你找到了想要的东西:-)

    关于java - 与Curator一起使用ACL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40427700/

    10-12 22:37