在前面的“Kafka配置1~Kafka配置6”文章中,我们详细的介绍了Kafka的安装、集群、SASL、SSL和账户权限的配置。该篇文章主要介绍使用C#向Kafka中生产和消费消息。
在C#中,我们使用Confluent.Kafka库作为连接Kafka服务的“桥梁”,可自行在NuGet中下载,这里我们只做在C#中使用SASL+SSL的使用例子,更详细的使用方法可参考官网https://github.com/confluentinc/confluent-kafka-dotnet/。
1、使用VS创建一个解决方案,名称如Quber.Test.Kafka,然后分别创建生产者项目(Quber.Test.KafkaProducer,Windows应用程序)和消费者项目(Quber.Test.KafkaConsumer,控制台应用程序)用于测试,项目结构如下所示:
2、生产者
在Quber.Test.KafkaProducer项目中新建一个生产窗体FrmMain,窗体中增加一个输入框和发送按钮,然后在发送按钮事件中实现生产消息的逻辑,代码如下所示:
/// <summary>
/// 生产消息事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btnSend_Click(object sender, EventArgs e)
{
var msg = txtMain.Text.Trim();
if (string.IsNullOrWhiteSpace(msg))
{
MessageBox.Show("发送内容不能为空!", "提示信息");
txtMain.Focus();
return;
}
//生产的主题
var topicName = "TestTopic1";
var config = new ProducerConfig
{
BootstrapServers = "192.168.3.200:9092,192.168.3.200:9093,192.168.3.200:9094",
SecurityProtocol = SecurityProtocol.SaslSsl,
SaslMechanism = SaslMechanism.Plain,
SaslUsername = "quber2", //SASL账户
SaslPassword = "quber123456", //SASL密码
SslCaLocation = @"D:\Net_Program\Net_Kafka\04_SSL\ca-cert" //SSL证书
};
using (var p = new ProducerBuilder<Null, string>(config).Build())
{
try
{
//异步生产消息
var dr = await p.ProduceAsync(topicName, new Message<Null, string> { Value = msg });
}
catch (ProduceException<Null, string> pe)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(pe.Error.Reason);
}
}
}
说明:上述代码中的quber2账户就是前面文章中提到的具有“写”权限的账户
3、消费者
在Quber.Test.KafkaConsumer项目的Main函数中实现如下消费信息的代码逻辑即可:
static void Main(string[] args)
{
//消费的主题
var topicName = "TestTopic1";
var conf = new ConsumerConfig
{
GroupId = "TestGroup2", //消费的分组
BootstrapServers = "192.168.3.200:9092,192.168.3.200:9093,192.168.3.200:9094",
SecurityProtocol = SecurityProtocol.SaslSsl,
SaslMechanism = SaslMechanism.Plain,
AutoOffsetReset = AutoOffsetReset.Earliest,
EnableAutoCommit = false,
SaslUsername = "quber1", //SASL账户
SaslPassword = "quber123456", //SASL密码
SslCaLocation = @"D:\Net_Program\Net_Kafka\04_SSL\ca-cert" //SSL证书
};
using (var c = new ConsumerBuilder<Ignore, string>(conf)
.SetErrorHandler((_, e) =>
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("连接出错:" + e.Reason);
})
.Build())
{
c.Subscribe(topicName);
CancellationTokenSource cts = new CancellationTokenSource();
Console.CancelKeyPress += (_, e) =>
{
e.Cancel = true;
cts.Cancel();
};
try
{
while (true)
{
try
{
var cr = c.Consume(cts.Token);
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("收取成功:" + cr.Value);
}
catch (ConsumeException e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("收取失败:" + e.Error.Reason);
}
}
}
catch (OperationCanceledException e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("收取失败:" + e.Message);
c.Close();
}
}
}
说明:上述代码中的quber1账户就是前面文章中提到的具有“读”权限的账户
4、测试
在之前介绍的配置文章中,我们配置了3个账号(quber[读和写]、quber1[读]、quber2[写]),为了方便测试,后续我们又增加了1个账号(quber3[读]),这样就相当于有3个账号具有消费信息的权限(quber、quber1和quber3),然后我们分别设置这3个具有读权限的账户去消费消息,并编译消费者项目,将编译好的文件分别复制到3个不同的文件夹中,然后双击打开文件夹中的Quber.Test.KafkaConsumer.exe文件,此时运行生产者客户端,发送几条测试的数据,具体演示效果如下图所示:
说明:
上述代码中的SslCaLocation = @"D:\Net_Program\Net_Kafka\04_SSL\ca-cert"就是前面文章Kafka配置4--Windows下配置Kafka的SSL证书中提到的证书生成的地址。