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();
                }
            }
        }
    }

程序完整

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