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