Kafka基础教程(四):.net core集成使用Kafka消息队列
.net core使用Kafka可以像上一篇介绍的封装那样使用(Kafka基础教程(三):C#使用Kafka消息队列),但是我还是觉得再做一层封装比较好,同时还能使用它做一个日志收集的功能。
因为代码比较多,所有就直接放到码云(Gitee)上去了,地址:https://gitee.com/shanfeng1000/dotnetcore-demo/tree/master/Kafka(为什么不是github,因为github太慢了-_-!!)
感兴趣的可以克隆下来再按照自己的需求修改,这里简单介绍一下使用的Demo(Demo基于.net core3.1的版本,其他版本可能需要自行测试)
生产者(AspNetCore.WebApi.Producer)
首选需要在ConfigureServices中添加相关依赖项:
public void ConfigureServices(IServiceCollection services)
{
var hosts = new string[] { "192.168.209.133:9092", "192.168.209.134:9092", "192.168.209.135:9092" }; #region 日志记录 services.AddLogging(builder =>
{
builder.SetMinimumLevel(LogLevel.Trace);
});
services.AddKafkaLogger(options =>
{
options.BootstrapServers = hosts;
options.Category = "Home";
options.InitializeCount = 10;
options.Key = "log";
options.MinLevel = LogLevel.Trace;
options.Topic = "topic.logger";
options.ApplicationName = "AspNetCore.WebApi.Producer";
}); #endregion #region Kafka services.AddKafkaProducer(options =>
{
options.BootstrapServers = hosts;
options.InitializeCount = 3;
options.Key = "kafka";
options.Topic = "topic.kafka";
}); #endregion ......
}
AddKafkaLogger是添加日志的相关依赖服务配置,之后使用.net core的ILogger对象记录消息时就可以直接将消息发布到Kafka了。
AddKafkaProducer是添加Kafka发布者的相关配置,可以指定一个名称,使用时使用IKafkaProducerFactory接口注入即可,比如在Home控制器中使用:
[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{
IKafkaProducerFactory kafkaProducerFactory;
ILoggerFactory loggerFactory; public HomeController(IKafkaProducerFactory kafkaProducerFactory, ILoggerFactory loggerFactory)
{
this.kafkaProducerFactory = kafkaProducerFactory;
this.loggerFactory = loggerFactory;
} /// <summary>
/// 发布消息
/// </summary>
/// <param name="message">消息</param>
/// <returns>success</returns>
[HttpGet("Kafka")]
public string Kafka(string message)
{
message = message ?? "";
var producer = kafkaProducerFactory.Create();
producer.Publish(message); return "success";
}
/// <summary>
/// 日志
/// </summary>
/// <param name="message">消息</param>
/// <returns>success</returns>
[HttpGet("Logger")]
public string Logger(string message)
{
var logger1 = loggerFactory.CreateLogger("logger");
logger1.LogTrace($"logger1(LogTrace):{message}");
logger1.LogDebug($"logger1(LogDebug):{message}");
logger1.LogInformation($"logger1(LogInformation):{message}");
logger1.LogWarning($"logger1(LogWarning):{message}");
logger1.LogError($"logger1(LogError):{message}");
logger1.LogCritical($"logger1(LogCritical):{message}"); var logger2 = loggerFactory.CreateLogger("123456");
logger2.LogTrace($"logger2(LogTrace):{message}");
logger2.LogDebug($"logger2(LogDebug):{message}");
logger2.LogInformation($"logger2(LogInformation):{message}");
logger2.LogWarning($"logger2(LogWarning):{message}");
logger2.LogError($"logger2(LogError):{message}");
logger2.LogCritical($"logger2(LogCritical):{message}"); return "success";
}
}
消费者(AspNetCore.WebApi.Consumer)
首选需要在ConfigureServices中添加相关依赖项:
public void ConfigureServices(IServiceCollection services)
{
var hosts = new string[] { "192.168.209.133:9092", "192.168.209.134:9092", "192.168.209.135:9092" }; #region 日志记录 services.AddKafkaConsumer(options =>
{
options.BootstrapServers = hosts;
options.EnableAutoCommit = true;//自动提交
options.GroupId = "group.1";
options.Subscribers = KafkaSubscriber.From("topic.logger"); }).AddListener(result =>
{
Console.WriteLine("Message From topic.logger:" + result.Message);
}); #endregion #region Kafka services.AddKafkaConsumer(options =>
{
options.BootstrapServers = hosts;
options.EnableAutoCommit = false;
options.GroupId = "group.2";
options.Subscribers = KafkaSubscriber.From("topic.kafka"); }).AddListener(result =>//直接在lambda表达式中完成消费逻辑
{
Console.WriteLine("Message From topic.kafka:" + result.Message);
result.Commit();
}).AddListener<KafkaConsumerListener>();//实现IKafkaConsumerListener接口完成消费逻辑 #endregion ......
}
无论是日志的消息消费还是自定义的消息消费,都是先使用AddKafkaConsumer方法声明Kafka消费者的配置,然后使用AddListener方法添加消息消费的处理程序,AddListener有几个委托,可以接受一个lambda表达式,可以使用一个实现了IKafkaConsumerListener接口的类,就比如上面的KafkaConsumerListener类:
public class KafkaConsumerListener : IKafkaConsumerListener
{
public Task ConsumeAsync(RecieveResult recieveResult)
{
Console.WriteLine("KafkaConsumerListener:" + recieveResult.Message);
recieveResult.Commit();
return Task.CompletedTask;
}
}
Kafka基础教程(四):.net core集成使用Kafka消息队列的更多相关文章
- ActiveMQ基础教程(四):.net core集成使用ActiveMQ消息队列
接上一篇:ActiveMQ基础教程(三):C#连接使用ActiveMQ消息队列 这里继续说下.net core集成使用ActiveMQ.因为代码比较多,所以放到gitee上:https://gitee ...
- Kafka基础教程(一):认识Kafka
Kafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,吞吐速率非常快,可以作为Hadoop的日志收集.Kafka是一个完全的分布式系统,这一点依赖于Zookeeper ...
- Qt零基础教程(四) QWidget详解篇
在博客园里面转载我自己写的关于Qt的基础教程,没次写一篇我会在这里更新一下目录: Qt零基础教程(四) QWidget详解(1):创建一个窗口 Qt零基础教程(四) QWidget详解(2):QWid ...
- Qt零基础教程(四)QWidget详解(3):QWidget的几何结构
Qt零基础教程(四) QWidget详解(3):QWidget的几何结构 这篇文章里面分析了QWidget中常用的几种几何结构 下图是Qt提供的分析QWidget几何结构的一幅图,在帮助的 Wind ...
- ASP.NET Core 基础教程 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 基础教程 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 是对 ASP.NET 有重大意义的一次重新设计.本章节我们将介绍 A ...
- Kafka基础教程(二):Kafka安装
因为kafka是基于Zookeeper的,而Zookeeper一般都是一个分布式的集群,尽管kafka有自带Zookeeper,但是一般不使用自带的,都是使用外部安装的,所以首先我们需要安装Zooke ...
- SpringCloud2.0 Ribbon 服务发现 基础教程(四)
1.启动[服务中心]集群,即 Eureka Server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) 2.启动[服务提供者]集群,即 Eureka Cli ...
- Kafka基础教程(三):C#使用Kafka消息队列
接上篇Kafka的安装,我安装的Kafka集群地址:192.168.209.133:9092,192.168.209.134:9092,192.168.209.135:9092,所以这里直接使用这个集 ...
- GStreamer基础教程11 - 与QT集成
摘要 通常我们的播放引擎需要和GUI进行集成,在使用GStreamer时,GStreamre会负责媒体的播放及控制,GUI会负责处理用户的交互操作以及创建显示的窗口.本例中我们将结合QT介绍如何指定G ...
随机推荐
- Spring的事务传播机制(通俗易懂)
概述 Spring的事务传播机制有7种,在枚举Propagation中有定义. 1.REQUIRED PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就 ...
- Thymeleaf标准表达式
Thymeleaf的官网为: http://www.thymeleaf.org/ 一.变量表达式${-} 使用${-}括起来的表达式,称为变量表达式.该表达式的内容会显示在HTML标签体文本处. 该表 ...
- 全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(二)资源的获取和释放
上期的<全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(一)AQS基础>中介绍了什么是AQS,以及AQS的基本结构.有了这些概念做铺垫之后,我们就可以正 ...
- Kerberos认证
http://www.cnblogs.com/artech/archive/2011/01/24/kerberos.html 最近一段时间都在折腾安全(Security)方面的东西,比如Windows ...
- HCNP Routing&Switching之组播技术-组播协议IGMP
前文我们了解了组播地址相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15616740.html:今天我们来聊一聊组播协议中IGMP协议相关话题: 组播 ...
- Go - 如何编写 ProtoBuf 插件(二)?
目录 前言 定义插件 使用插件 获取自定义选项 小结 推荐阅读 前言 上篇文章<Go - 如何编写 ProtoBuf 插件 (一) >,分享了使用 proto3 的 自定义选项 可以实现插 ...
- Office365与Office2016差异汇总
以下很多链接来自原来的博客,如果有哪篇"被色情"的,请留言联系我,谢谢! 2020-8-29更新 通用 图片透明度:http://blog.sina.com.cn/s/blog_5 ...
- 爆款预订,2022 年最值得关注的后台框架 —— Fantastic-admin
前言 如果 2021 年你还没有听说过 Fantastic-admin ,那即将到来的 2022 年可不要再错过了. Fantastic-admin 做为一款开箱即用的 Vue 中后台管理系统框架,距 ...
- java 输入输出IO流 字节流| 字符流 的缓冲流:BufferedInputStream;BufferedOutputStream;BufferedReader(Reader in);BufferedWriter(Writer out)
什么是缓冲流: 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率. 图解: 1.字节缓冲流BufferedInputStr ...
- PSpiceAA-高级分析例程
一.高级分析应用例程 1.1.例程电路原理图(同向放大电路) 器件模型使用PSpice-ELEM库中的模型. 1..1.1.仿真测试波形图 1.2.灵敏度分析 1.2.1菜单选择:PSpice-> ...