安装zookeeper
kafka需要用到zookeeper,所以需要先安装zookeeper(kafka也集成了zookeeper,可以不单独下载)
- 到官网下载最新版zookeeper,http://www.apache.org/dyn/closer.cgi/zookeeper/
- 解压到指定路径
- 复制conf目录下zoo_sample.cfg,粘贴改名为zoo.cfg,修改zoo.cfg中的dataDir的值为你的安装目录,并添加一行dataLogDir,值为你想存放 日志文件的路径
- 修改系统环境变量,在Path后添加 安装目录
- 运行cmd命令窗口,输入zkServer回车,启动
安装kafka
- 到官网下载最新版kafka,http://kafka.apache.org/downloads
- 解压到指定路径,切记目录不能有空格,不然后面运行服务会【找不到或无法加载主类】的报错
- 修改E:\kafka_2.12-0.10.2.0\config目录下的server.properties中 log.dirs的值,该目录是kafka服务的本地存储路径,相关消息、主题之类的持久化存储依赖于此。
- 添加系统环境变量,在Path后添加kafka根目录下bin\windows的路径,如:D:\JAVA\kafka_2.11-2.3.0\bin\windows
- 如果之前未下载zookeeper,可直接在kafka根目录执行zookeeper-server-start ./config/zookeeper.properties启动zookeeper服务,配置文件日志路径需要调整
- 启动kafka,在cmd命令行用cd命令切换到kafka根目录,输入命令
kafka-server-start .\config\server.properties
出现started (kafka.server.KafkaServer)字样表示启动成功 - 运行cmd命令行,创建一个topic,命令如下:
kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test - 再打开一个cmd,创建一个Producer,命令如下:
kafka-console-producer.bat --broker-list localhost:9092 --topic test - 再打开一个cmd,创建一个Customer,命令如下:
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test
较早的版本可能是kafka-console-consumer.bat --zookeeper localhost:2181 --topic test - 在Producer窗口下输入信息进行测试 ,每输入一行回车后消息马上就会出现在Customer中,表明kafka已经安装测试成功(注意:jdk32位时会报错)
基于.Net Confluent.Kafka 0.11.6.0的客户端简单收发demo
public partial class KafkaTastForm : Form
{
private Consumer<Ignore, string> consumer;
private Producer<Null, string> producer;
int times = 0;
const int mode = 4;//partition的数量
public KafkaTastForm()
{
InitializeComponent();
}
private void KafkaTastForm_Load(object sender, EventArgs e)
{
Consumer();
Produce();
Thread thread = new Thread(OnReceivedMsg);
thread.IsBackground = true;
thread.Start();
}
/// <summary>
/// 消费者
/// </summary>
public void Consumer()
{
Dictionary<string, object> config = new Dictionary<string, object>();
config.Add("group.id", new Guid().ToString());//不可重复
config.Add("bootstrap.servers", "127.0.0.1:9092");
consumer = new Consumer<Ignore, string>(config, null, new StringDeserializer(Encoding.UTF8));
订阅topic
consumer.Subscribe("test");
错误日志监视
consumer.OnError += (_, msg) => { Console.WriteLine($"Consumer_Error信息:Code:{msg.Code};Reason:{msg.Reason};IsError:{msg.IsLocalError}"); };
}
/// <summary>
/// 生产者
/// </summary>
public void Produce()
{
Dictionary<string, object> config = new Dictionary<string, object>();
config.Add("bootstrap.servers", "127.0.0.1:9092");
producer = new Producer<Null, string>(config, null, new StringSerializer(Encoding.UTF8));
// 错误日志监视
producer.OnError += (_, msg) => { Console.WriteLine($"Producer_Erro信息:Code:{msg.Code};Reason:{msg.Reason};IsError:{msg.IsBrokerError}"); };
}
private void BtnProduce_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(tbTopic.Text))
return;
// 异步发送消息到主题
producer.ProduceAsync(tbTopic.Text, null, tbProducer.Lines.Last(), times%mode);
times++;
// Flush到磁盘
producer.Flush(TimeSpan.FromSeconds(3));
}
private void BtnSubscribe_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(tbTopic.Text))
return;
consumer.Unsubscribe();
consumer.Subscribe(tbTopic.Text);
}
private void OnReceivedMsg()
{
while (true)
{
try
{
Message<Ignore, string> receiveMsg;
if (consumer.Consume(out receiveMsg, 1000))
Invoke(new Action(()=>{ tbConsumer.AppendText($">>'{receiveMsg.Topic}:{receiveMsg.Value}'."+Environment.NewLine); }));
}
catch (Exception e)
{
Console.WriteLine($"Consumer_Error occured: {e.Message}");
}
}
}
}