kafka_2.11 安装 教程 主要是测试环境 单zookeeper 单kafka .net Core 测试

环境: linux centos 7.7  本机ip地址: 192.168.37.128

kafka 安装包 地址:https://download.csdn.net/download/kesshei/12003563

zookeeper 安装地址:https://download.csdn.net/download/kesshei/12003567

kafkatools: https://download.csdn.net/download/kesshei/12003609

首先查看jdk版本

我这个默认版本是 1.8的 已经有了,所以,就不用安装了。

安装完jdk,接下来先安装zookeeper,它主要是来实现kafka集群的,所以必须得安装。

把kafka和zookeeper 解压到 /etc/opt/目录下。

然后新建一些日志文件

在 Zookeeper 目录下

mkdir zkdata                  创建存放快照日志命令

mkdir zkdatalog              创建存放事物日志命令

在kafka 目录下

 mkdir kafkalogs    #主要存放kafka消息

然后是搞定配置文件

其中 Zookeeper 配置文件 路径为: /etc/opt/zookeeper/conf 下

把 zoo_sample.cfg 复制一份 修改为 zoo.cfg (这个才是最终启动的配置文件)

其中zoo.cfg内容如下

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/etc/opt/zookeeper/zkdata
dataLogDir=/etc/opt/zookeeper/zkdatalog
clientPort=2181
auto.purgeIntarval=360
auto.snapRetainCount=66
server.1=192.168.37.128:2888:3888

接下来,配置 kafka配置信息  地址为:/etc/opt/kafka/config/server.properties

broker.id=1    
port=9092
listeners=PLAINTEXT://192.168.37.128:9092
advertised.listeners=PLAINTEXT://192.168.37.128:9092
host.name=192.168.37.128  
num.network.threads=3  
num.io.threads=8   
log.dirs=/opt/kafka/kafkalogs/    
socket.send.buffer.bytes=102400   
socket.receive.buffer.bytes=102400   
socket.request.max.bytes=104857600 
num.partitions=1  
log.retention.hours=168  
message.max.byte=5242880   
default.replication.factor=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
num.recovery.threads.per.data.dir=1
replica.fetch.max.bytes=5242880  
log.segment.bytes=1073741824  
log.retention.check.interval.ms=300000  
log.cleaner.enable=false  
zookeeper.connect=192.168.37.128:2181 

配置完毕

接下来进行,启动服务

先运行 zookeeper  进入到 /etc/opt/zookeeper/bin 目录 

启动: 

./zkServer.sh start

停止:

./zkServer.sh stop

有如下信息,证明 服务已经运行起来了

接下来运行 kafka  进入到 /etc/opt/kafka 目录 

开始:

bin/kafka-server-start.sh config/server.properties

停止:

bin/kafka-server-stop.sh

查看,服务是否已经都开启了

netstat -tunlp|egrep "(2181|9092)"

 如图,证明都开启了

也可以用 Kafka Tools工具

增加后,可以进行 增加主题和增加消息

 

增加主题和增加 消息

然后,点击增加,即可,增加一条可以被消费的消息

同时,在linux 打开命令窗口,实现 消息的消费

./kafka-console-consumer.sh  --bootstrap-server 192.168.37.128:9092 --topic TEST --from-beginning

--from-beginning 参数可以不带,表示,不从第一条开始消费,从当前时间,开始消费.

至此  kafka  linux 环境已经部署成功。

 

接下来就是.net core 2.2 开发环境

Nuget 安装 Confluent.Kafka 

主程序

  class Program
    {
        static void Main(string[] args)
        {
            string topic = "TEST";
            string ip = "192.168.37.128:9092";

            //消费者开始消费
            Task.Run(() =>
            {
                KafkaConsumer.Consume(topic, ip);
            });
            //生产者生产
            for (int i = 0; i < 10; i++)
            {
                KafkaProduce.Produce(topic, i.ToString(), ip);
            }
            Console.WriteLine("kafka 生产者生产完毕!");
            Console.ReadLine();
        }
    }

生产者

    /// <summary>
    /// Kafka消息生产者
    /// </summary>
    public class KafkaProduce
    {
        public static  void Produce(string Topic,string value,string servers = "192.168.37.128:9092")
        {
            var config = new ProducerConfig { BootstrapServers = servers };

            using (var p = new ProducerBuilder<Null, string>(config).Build())
            {
                try
                {
                    var dr =  p.ProduceAsync(Topic, new Message<Null, string> { Value = value }).GetAwaiter().GetResult();
                    Console.WriteLine($"Delivered '{dr.Value}' to '{dr.TopicPartitionOffset}'");
                }
                catch (ProduceException<Null, string> e)
                {
                    Console.WriteLine($"Delivery failed: {e.Error.Reason}");
                }
            }
        }

消费者

    /// <summary>
    /// 消费者
    /// </summary>
    public class KafkaConsumer
    {
        public static void Consume(string topic, string BootstrapServers = "192.168.37.128:9092")
        {
            var conf = new ConsumerConfig
            {
                GroupId = "test-consumer-group",
                BootstrapServers = BootstrapServers,
                //消费未消费的数据
                AutoOffsetReset = AutoOffsetReset.Earliest,
                //即使消费者没有订阅该组,也可以将分区偏移量提交给一个组。 在这个例子中,自动提交被禁用以防止发生这种情况。
                EnableAutoCommit = false
            };

            using (var c = new ConsumerBuilder<Ignore, string>(conf).Build())
            {
                c.Subscribe(topic);
                c.Assign(new TopicPartitionOffset(topic, 0, Offset.Beginning));

                CancellationTokenSource cts = new CancellationTokenSource();
                var cancelled = false;
                Console.CancelKeyPress += (_, e) =>
                {
                    e.Cancel = true; // 防止进程退出
                    cts.Cancel();
                    cancelled = true;
                };

                try
                {
                    while (!cancelled)
                    {
                        try
                        {
                            var cr = c.Consume(cts.Token);
                            var committedOffsets = c.Commit();
                            Console.WriteLine($"Consumed message '{cr.Value}' at: '{cr.TopicPartitionOffset}'.");
                        }
                        catch (ConsumeException e)
                        {
                            Console.WriteLine($"Error occured: {e.Error.Reason}");
                        }
                    }
                }
                catch (OperationCanceledException)
                {
                    c.Close();
                }
            }
        }
    }

程序完整

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章