環境: 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();
}
}
}
}
程序完整