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 ...
随机推荐
- Linux基础命令---mysqladmin数据库管理工具
mysqladmin mysqladmin是mysql数据库的管理工具,可以控制.查看.修改数据库服务器的配置和状态. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedor ...
- EBS 抓trace 文件
如果要对FORM的操作做TRACE操作,可以使用 帮助->诊断->跟踪 中启用跟踪功能来实现. 但是如果要实现对并发请求的trace,需要在 系统管理员->并发->方案-> ...
- Linux基础命令---ftp
ftp ftp指令可以用来登录远程ftp服务器. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 ftp [ ...
- zabbix之主动模式和proxy的主动模式
#:找一台新主机配置上agent,注意版本要和server端保持一样 #:官网地址:https://www.zabbix.com/documentation/4.0/zh/manual/install ...
- When does compiler create default and copy constructors in C++?
In C++, compiler creates a default constructor if we don't define our own constructor (See this). Co ...
- 使用mybatis更新数据时 时间字段的值自动更新
1.debug打印出来执行的sql语句发现并没有修改时间的字段,最后发现是设计表时勾选了根据当前时间戳更新..... 去掉该字段的根据当前时间戳更新语句: alter table tableName ...
- table表格数据无缝循环滚动
分享一个好看的表格无缝滚动:(实战用起来很舒服) 直接copy代码到你的程序中: 1.HTML <div class="tablebox"> ...
- Mysql报错合集
目录 一.链接报错 客户端连接mysql出错 链接客户端出错 交互登陆mysql出现warning警告Using a password 导入数据到数据库报错ERROR 1050 登陆数据库提示-bas ...
- 车载以太网第二弹 | 测试之实锤-IOP测试实践
前言 上一期"物理层PMA测试实践",咱们从环境设备组成.被测对象组成再到测试过程和测试结果,将完整的PMA测试过程做了一个经验分享. 由下层开始逐层"披沙沥金" ...
- pf4j及pf4j-spring
什么是PF4J 一个插件框架,用于实现插件的动态加载,支持的插件格式(zip.jar). 核心组件 Plugin:是所有插件类型的基类.每个插件都被加载到一个单独的类加载器中以避免冲突. Plugin ...