Kafka开发--C#生产和消费消息

812 阅读3分钟

在前面的“Kafka配置1~Kafka配置6”文章中,我们详细的介绍了Kafka的安装、集群、SASL、SSL和账户权限的配置。该篇文章主要介绍使用C#向Kafka中生产和消费消息。

在C#中,我们使用Confluent.Kafka库作为连接Kafka服务的“桥梁”,可自行在NuGet中下载,这里我们只做在C#中使用SASL+SSL的使用例子,更详细的使用方法可参考官网github.com/confluentin…

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证书中提到的证书生成的地址。