kitlau
kitlau

kitlau's blog

All Posts


为什么我的接口,慢得跟蜗牛一样啊?- 3. Seq 中心化结构化日志服务

本文是“为什么我的接口,慢得跟蜗牛一样啊?”系列文章的第三篇,主要介绍了如何使用 Seq 中心化结构化日志服务进行性能优化。文章首先介绍了 Seq 的特点和优势,包括其轻量级、易于安装和配置、专注于日志的实时记录和查询等。然后,文章详细介绍了如何使用 Docker 运行 Seq,包括如何设置初始密码、如何将主机机器上的数据挂载到容器中的目录等操作。接着,文章介绍了如何使用 Serilog 往 Seq 中记录日志,只需引入 `Serilog.Sinks.Seq` 这个 NuGet 包,然后修改配置文件即可。最后,文章介绍了如何在 Seq 中查看和分析日志,例如如何根据条件查询日志、如何过滤出耗时超过 1000ms 的日志等。通过这些日志,我们可以轻松查到接口慢在哪一步操作上,这样对老板对客户都至少有一个交代,遇到了问题也不用再全都靠猜了。这个系列还没有完结,打算再介绍一点 Tracing 相关的东西。你是否已经开始思考如何使用 Seq 来优化你的接口性能了?--GPT 4

.NET Performance

为什么我的接口,慢得跟蜗牛一样啊?- 2. Serilog 记录计时和诊断日志

这篇博客文章提供了详细的步骤和代码示例,帮助读者理解如何使用Serilog库来记录计时和诊断日志,以优化Web API的性能。文章首先解释了如何使用Serilog来记录和分析操作的耗时,然后介绍了如何记录HttpRequest日志以及如何自定义HttpRequest日志的消息模板。接下来,文章展示了如何记录诊断日志,以便追踪每个用户的请求。最后,文章总结了Serilog的主要功能,并预告了下一篇文章的主题——如何收集多个实例的日志并进行高效的日志分析和诊断。那么,你是否已经准备好优化你的Web API了呢?你会如何利用这些技术来提升你的软件服务水平呢?--GPT 4

.NET Performance

为什么我的接口,慢得跟蜗牛一样啊?- 1. 使用 Serilog 结构化日志

本文详细介绍了如何使用Serilog进行结构化日志记录。首先,我们在ASP.NET Core的Host上配置Serilog,接管默认的日志功能。然后,我们在WeatherForecastController中的接口输出一条日志。此外,我们还了解了如何在应用程序启动阶段或运行时记录日志,即在Program.cs文件中使用Serilog的全局静态Log类记录日志。文章还展示了如何查看结构化日志,我们可以在项目下的logs文件夹中发现记录的日志,日志是JSON格式的结构化日志,包含了用于追踪的必要数据,如ActionId、RequestId、RequestPath等。最后,我们还讨论了将结构化日志记录到文件、文档数据库、关系型数据库或云服务中的方法。那么,如何根据团队的情况和需求选择合适的日志记录方式呢?如何使用流行的服务器进行日志分析呢?这些问题将在后续文章中解答。--GPT 4

.NET Performance

.NET 性能技巧:为什么你应该避免使用终结器 Finalizer?

本篇博客的主题是.NET性能优化技巧,具体探讨了为何应避免使用终结器(Finalizer)。终结器在对象被垃圾回收器回收前执行的代码,用于释放非托管资源,但同时会延迟对象的回收,增加内存占用和垃圾回收时间。博客通过Benchmark测试终结器的性能,结果显示实现终结器的对象创建和释放所需的时间是没有实现终结器的对象的18.86倍,证明了终结器带来的巨大开销。此外,终结器的执行时间不可控,可能导致程序行为不稳定或不可预测,也可能引发内存泄漏。因此,建议尽量避免使用终结器,而选择更可控和更可预测的方式,如使用IDisposable接口或最新的异步资源释放API(IAsyncDisposable)来释放资源。那么,你是否已经意识到终结器可能带来的问题?你会选择哪种方式来释放资源?--GPT 4

.NET Performance

你真的需要 Autofac 吗?Scrutor:更轻量的容器伴侣

这篇博客主要探讨了ServiceLocator反模式,以及如何使用轻量级的依赖注入扩展库Scrutor来取代Autofac。文章首先介绍了什么是ServiceLocator反模式,然后详细讲解了如何使用Scrutor的多种方法,包括如何通过“扫描”或“匹配”来注册服务,如何以“接口,实现”的方式注册,如何限制只注册某些命名空间中的服务,如何修改默认的生命周期,如何为每一对服务和接口都指定不同的生命周期,以及如何使用Attribute标记方式。文章还特别指出,许多人选择Autofac,是为了使用它的装饰器模式,如果你是因为这个原因而选择了Autofac,那么Scrutor是你取代Autofac的不二之选。最后,文章提出了一个引人深思的问题:你的项目真的有必要引入Autofac吗?如果你的项目只是为了扫描程序集来批量注册,或者为了实现装饰器模式,那么你完全可以使用Scrutor来取代它。--GPT 4

.NET DependencyInjection

谁是你的菜?IEnumerable、IQueryable 和 ICollection 选择指南

本篇博客深入探讨了在C#编程中如何选择IEnumerable、IQueryable和ICollection接口。首先,作者通过一个实例展示了对IEnumerable的误用可能导致的问题,然后对这三种接口进行了简单的比较。文章指出,IEnumerable是最常用且灵活的接口,可以表示任何类型的集合;IQueryable在IEnumerable的基础上,可以在数据源上执行LINQ操作以提高效率,特别适用于使用ORM框架的场景;ICollection除了拥有IEnumerable的特性外,还支持添加或删除集合中的元素。文章还讨论了在方法返回集合类型时如何选择,以及“抽象泄露”的概念。最后,作者提出了一套选择集合类型的规则,包括考虑集合类型的功能和可维护性等因素。这篇博客对于理解和选择C#中的集合类型有很大帮助,但是,这些规则是否适用于你的情况呢?或许你可以通过阅读全文来找出答案。--GPT 4

.NET

Welcome to MoongladePure

This blog post introduces MoongladePure, a new development that eliminates certain dependencies from the original Moonglade. The primary advantage of this innovation is that it allows for a complete on-premise deployment, negating the need for any specific cloud coupling. This opens up new possibilities in terms of data security and customization, as businesses can now manage their data in-house without relying on third-party cloud services. The blog post further explores the technical aspects of this development, offering insights into how MoongladePure works and how it differs from its predecessor. It raises intriguing questions about the future of data management and the potential benefits of on-premise deployment. How might this change the way businesses handle their data? What other innovations could stem from this development? Dive into the post to find out more.--GPT 4