1.zookeeper简单介绍

1.1作用

zookeeper的作用是存储kafka的服务器信息,topic信息,和cunsumer信息。如下图:

而zookeeper是个什么东西呢?简单来说就是一个具有通知机制的文件系统,引用网路上的一张图

可以看出来zookeeper是一个树形的文件结构,我们可以自定义node与node的值,并对node进行监视,当node的结构或者值变化时,我们可以收到通知。

1.2node类型

1)PERSISTENT-持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在
2)PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
3)EPHEMERAL-临时目录节点
客户端与zookeeper断开连接后,该节点被删除
4)EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

2.zookeeper命令操作

连接zookeeper

[root@iz2zei2y693gtrgwlibzlwz ~]# zkCli.sh -server ip:

查看zookeeper的所有节点

ls /

查看某个节点的子节点

ls /brokers

创建节点

 create /testaa dataaaa

获取节点的值

get /testaa

设置节点值

 set /testaa aaabbb

删除节点

 delete /testaa

这么看来实际上zookeeper跟数据库类似也是CURD操作,我们再来看看zookeeper的安全控制ACL

3.zookeeper的ACL

3.1ZK的节点有5种操作权限:

CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)

3.2身份的认证有4种方式:

world:默认方式,相当于全世界都能访问
auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
digest:即用户名:密码这种方式认证,这也是业务系统中最常用的
ip:使用Ip地址认证

3.3ACL实例

默认创建的时world方式,任何人都能访问,我们新建一个测试node节点
[zk: :(CONNECTED) ] create /cys cys

访问一一下

[zk: :(CONNECTED) ] get /cys

查看一下Acl

[zk: :(CONNECTED) ] getAcl /cys

下面我们设置一下他的用户

命令为:

1)增加一个认证用户
addauth digest 用户名:密码明文
eg. addauth digest user1:password1
2)设置权限
setAcl /path auth:用户名:密码明文:权限
eg. setAcl /test auth:user1:password1:cdrwa
3)查看Acl设置
getAcl /path

具体操作如下:

addauth digest cys:
setAcl /cys auth:cys::crwda

我们ctrl+c退出zkCli,重新连接一下,然后查询

get /cys

结果如下:

提示我们认证失败,我们登陆一下

addauth digest cys:

结果如下:

我们在查看一下/cys节点的Acl

可以看出来用户cys对应的密码(加密后的)和权限cdrwa

4..net core 操作

4.1新建server项目,引入ZookeeperNetEx这个nuget包

Server端代码

using org.apache.zookeeper;
using org.apache.zookeeper.data; using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("输入path");
var path = Console.ReadLine();
string address = "39.**.**.**:2181";
ZooKeeper _zooKeeper = new ZooKeeper(address, * , null);
ZooKeeper.States states = _zooKeeper.getState();
//是否存在
Task<org.apache.zookeeper.data.Stat> stat = _zooKeeper.existsAsync(path);
stat.Wait();
if (stat.Result != null && stat.Status.ToString().ToLower() == "RanToCompletion".ToLower())
{
//已存在
Console.WriteLine($"{path}已存在");
}
else
{
Console.WriteLine("输入data");
var data = Console.ReadLine();
//创建
Task<string> task = _zooKeeper.createAsync(path, System.Text.Encoding.UTF8.GetBytes(data), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
task.Wait();
if (!string.IsNullOrEmpty(task.Result) && task.Status.ToString().ToLower() == "RanToCompletion".ToLower())
{
Console.WriteLine($"{path}创建成功");
}
}
Console.WriteLine("输入set data");
var dataA = Console.ReadLine();
//set值
Task<org.apache.zookeeper.data.Stat> statA = _zooKeeper.setDataAsync(path, System.Text.Encoding.UTF8.GetBytes(dataA));
statA.Wait();
if (statA.Result != null && statA.Status.ToString().ToLower() == "RanToCompletion".ToLower())
{
Console.WriteLine("set 成功");
} Console.WriteLine("输入子path");
var childpath = Console.ReadLine(); Console.WriteLine("输入子data");
var childdata = Console.ReadLine();
Task<string> childtask = _zooKeeper.createAsync(childpath, System.Text.Encoding.UTF8.GetBytes(childdata), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
childtask.Wait();
if (!string.IsNullOrEmpty(childtask.Result) && childtask.Status.ToString().ToLower() == "RanToCompletion".ToLower())
{
Console.WriteLine($"{childpath}创建成功");
} Console.ReadLine();
_zooKeeper.closeAsync().Wait();
}
////删除
//Console.WriteLine("输入delete path");
//var pathB = Console.ReadLine();
//Task taskA = _zooKeeper.deleteAsync(pathB);
//taskA.Wait();
//if (taskA.Status.ToString().ToLower() == "RanToCompletion".ToLower())
//{
// Console.WriteLine("delete 成功");
//} ////获取数据
//Task<DataResult> dataResult = _zooKeeper.getDataAsync(path, new NodeWatcher());
//dataResult.Wait();
//if (dataResult.Result != null && dataResult.Status.ToString().ToLower() == "RanToCompletion".ToLower())
//{
// Console.WriteLine(Encoding.UTF8.GetString(dataResult.Result.Data));
//}
}
} }

4.2新建client项目,引入ZookeeperNetEx这个nuget包

客户端代码

using org.apache.zookeeper;
using org.apache.zookeeper.data;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks; namespace Client
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("输入path");
var path = Console.ReadLine();
string address = "39.**.**.**:2181";
ZooKeeper _zooKeeper = new ZooKeeper(address, * , new DefaultWatcher());
       //用户登陆
_zooKeeper.addAuthInfo("digest", System.Text.Encoding.Default.GetBytes("cys:123456"));
//获取child
var getresult = _zooKeeper.getChildrenAsync(path, true);
getresult.Wait(); //获取数据
Task<DataResult> dataResult = _zooKeeper.getDataAsync(path,true);
dataResult.Wait();
Thread.Sleep();
}
} public class DefaultWatcher : Watcher
{
internal static readonly Task CompletedTask = Task.FromResult();         /// <summary>
        /// 接收通知
        /// </summary>
        /// <param name="event"></param>
        /// <returns></returns>
        public override Task process(WatchedEvent @event)
{
Console.WriteLine(string.Format("接收到ZooKeeper服务端的通知,State是:{0},EventType是:{1},Path是:{2}", @event.getState(), @event.get_Type(), @event.getPath() ?? string.Empty));
return CompletedTask;
}
}
}

这样当server端操作的时候,client端会通过watcher收到通知

Kafka与.net core(二)zookeeper的更多相关文章

  1. 【原创】kafka server源代码分析(二)

    十四.AbstractFetcherManager.scala 该scala定义了两个case类和一个抽象类.两个case类很简单: 1. BrokerAndFectherId:封装了一个broker ...

  2. Kafka设计解析(二)Kafka High Availability (上)

    转载自 技术世界,原文链接 Kafka设计解析(二)- Kafka High Availability (上) Kafka从0.8版本开始提供High Availability机制,从而提高了系统可用 ...

  3. 初试kafka消息队列中间件二(采用java代码收发消息)

    初试kafka消息队列中间件二(采用java代码收发消息) 上一篇 初试kafka消息队列中间件一 今天的案例主要是将采用命令行收发信息改成使用java代码实现,根据上一篇的接着写: 先启动Zooke ...

  4. Apache Kafka简介与安装(二)

    Kafka在Windows环境上安装与运行 简介 Apache kafka 是一个分布式的基于push-subscribe的消息系统,它具备快速.可扩展.可持久化的特点.它现在是Apache旗下的一个 ...

  5. Kafka学习之(二)Centos下安装Kafka

    环境:Centos6.4,官方下载地址:http://kafka.apache.org/downloads  ,前提是还需要安装了Java环境,本博客http://www.cnblogs.com/wt ...

  6. Kafka设计解析(二十)Apache Flink Kafka consumer

    转载自 huxihx,原文链接 Apache Flink Kafka consumer Flink提供了Kafka connector用于消费/生产Apache Kafka topic的数据.Flin ...

  7. 【Spark】Spark Streaming + Kafka direct 的 offset 存入Zookeeper并重用

    Spark Streaming + Kafka direct 的 offset 存入Zookeeper并重用 streaming offset设置_百度搜索 将 Spark Streaming + K ...

  8. ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    ExpandoObject与DynamicObject的使用   using ImpromptuInterface; using System; using System.Dynamic; names ...

  9. Docker + .NET Core(二)

    原文:Docker + .NET Core(二) 前言: 环境:centos7.5 64 位 正文: 首先我们在宿主机上安装 .NET Core SDK sudo rpm --import https ...

  10. CentOS-Docker搭建Kafka(单点,含:zookeeper、kafka-manager)

    Docker搭建Kafka(单点,含:zookeeper.kafka-manager) 下载相关容器 $ docker pull wurstmeister/zookeeper $ docker pul ...

随机推荐

  1. PyQt5系列教程(一)Mac OS X下搭建Python3.5.1+PyQt5开发环境

    软硬件环境 OS X EI Capitan Python 3.5.1 PyQt 5.5.1 PyCharm 5.0.1 前言 Qt是一个开源的跨平台的GUI框架,为很多计算机语言提供了应用程序开发接口 ...

  2. tensorflow-eagerAPI

    调用该API可以不通过 tensorflow.Session.run()调用 定义的张量constant tensor,可以直接print # -*- coding: utf-8 -*- from _ ...

  3. 深入了解 JPA

    转载自:http://www.cnblogs.com/crawl/p/7703679.html 前言:谈起操作数据库,大致可以分为几个阶段:首先是 JDBC 阶段,初学 JDBC 可能会使用原生的 J ...

  4. MyBait 符号大于 小于理解

    EQ 就是 EQUAL等于 NQ 就是 NOT EQUAL不等于 GT 就是 GREATER THAN大于 LT 就是 LESS THAN小于 GE 就是 GREATER THAN OR EQUAL ...

  5. c# 之Web.config

    Web.config文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式), 它可以出现在应用程序的每一个目录 ...

  6. 【转】从Mac/OS和iOS开放源码浅谈UNIX家谱

    阅读数:1245 苹果公司在各类开源项目中长期贡献着自己的力量,但其UNIX系统技术一直都属于闭源阵营(这一点可以从NUX OS阵营和家谱图中得到答案).然而,以封闭闻名的苹果公司,2017年国庆期间 ...

  7. cas 退出后跳转指定页面

    退出连接 https://localhost:8888/cas/logout?service=https://localhost:8080/cas-client/login 修改cas-server配 ...

  8. java基础一(阅读Head First Java记录)

    写在前面的话 在实际应用java中,因为没有系统去看过书或者学习过,所以基础薄弱,刚好这本书是比较入门级的一些书,记录一下下面的一些基本概念,以方便自己来学习.当然如果对大家有帮助也是很好的. 因为书 ...

  9. LinuxC编程怎么MakeFile

    在linux下我们都知道可以利用命令gcc hello.c -o hello 命令来变异c语言程序.其中gcc hello.c -o hello中 hello是给这个编译后生成的可执行文件取个别名 再 ...

  10. C#【Thread】Interlocked 轻量级锁

    什么说它是轻量级呢?因为它仅对整形数据(即int类型,long也行)进行同步. 具体使用如下表: Interlocked.Increment(ref value) 数值加一(原子性操作) Interl ...