Ответ 1
ACL в Apache Curator предназначены для контроля доступа. Поэтому ZooKeeper не предоставляет никакого механизма аутентификации, например, clients who don't have correct password cannot connect to ZooKeeper or cannot create ZNodes
. Он может сделать это, не позволяя несанкционированным клиентам получать доступ к определенным Znode/ZNodes. Для этого вам необходимо настроить экземпляр CuratorFramework, как я описал ниже. Помните, что это гарантирует, что создание ZNode с данным ACL может быть снова доступно одним клиентом или клиентом, представляющим ту же информацию аутентификации.
Сначала вы должны создать CuratorFramework
instane следующим образом. Здесь connectString
означает разделенный запятыми список комбинаций ip and port
серверов zookeeper в вашем ансамбле.
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
укажите тип node, который вы хотите создать. Доступные типы PERSISTENT,EPHEMERAL,EPHEMERAL_SEQUENTIAL,PERSISTENT_SEQUENTIAL,CONTAINER
. Java 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-клиент (более чем с кураторскими рецептами), которые используют Apache Zookeeper
в фоновом режиме и скрывают краевые случаи и сложности Zookeeper. В Zookeeper они используют концепцию ZNodes
для хранения данных. Вы можете рассматривать его как структуру каталогов Linux. Все ZNodePaths
должны начинаться с /
(root), и вы можете продолжать указывать каталог, такой как ZNodePaths, как вам нравится. Пример: /someName/another/test/sample
.
Как показано на приведенной выше диаграмме, ZNode организованы в древовидную структуру. Каждый ZNode
может хранить до 1 МБ данных. Поэтому, если вы хотите получить данные, хранящиеся в ZNode, вам нужно знать путь к этому ZNode. (Так же, как вы должны знать таблицу и столбец базы данных, чтобы извлекать данные).
Если вы хотите получить данные по заданному пути,
client.getData().forPath("/path/to/ZNode");
Это все, что вам нужно знать, когда вы хотите работать с куратором.
Еще одна вещь
ACL в Apache Curator предназначены для контроля доступа. То есть, если вы установите 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.
Короче говоря, если вы хотите, чтобы другие не вмешивались в ваши ZNodes, вы можете установить ACLProvider для возврата CREATOR_ALL_ACL
и установить авторизацию на digest
, как показано выше. Только экземпляры CuratorFramework, использующие одну и ту же строку авторизации ("username:password"
), смогут получить доступ к этим ZNodes. Но это не помешает другим создавать ZNodes по пути, которые не мешают вам.
Надеюсь, вы нашли то, что хотите: -)