kitlau
kitlau

kitlau's blog

.NET .NET


C# 3 年前的 record 你现在用上了吗?

这篇博客主要讨论了C#中的record类型,它是一种不可变的引用类型,具有值语义,主要适用于表示不可变的数据结构。文章首先通过深入解析record类型的代码实现,揭示了其内部工作原理。接着,文章对比了record、class和struct三种类型的主要区别,包括不可变性、引用类型与值类型、值语义、继承、构造函数和析构函数以及解构等方面。然后,文章从内存层面探讨了这三种类型的差异,包括引用类型与值类型的表现、垃圾回收行为以及装箱与拆箱操作等。文章还探讨了为何record类型鲜有应用,认为这反映出了对代码质量的忽视。最后,文章呼吁开发者重视代码质量,充分利用record类型的优势,编写更高质量的代码。然而,随着AI编程工具的发展,未来编程实践可能会发生巨大变革,这是否意味着我们应该重新考虑我们对代码质量的关注和record类型的应用呢?--GPT 4

.NET

微服务生产环境故障难调试?OpenTelemetry 了解一下?

本篇博客详细介绍了OpenTelemetry在.NET中的应用以及如何使用OpenTelemetry和Jaeger对微服务系统进行仪表化,收集和展示遥测数据。文章通过一个运行在k8s中的微服务系统作为实战案例,演示了如何实现分布式追踪,并通过Jaeger UI查看和分析Trace信息。此外,还讨论了OpenTelemetry如何解决微服务系统中的一些业务问题,包括快速定位线上问题的根源、分析系统的性能瓶颈和优化点、监控系统的运行状态和健康度等。同时,文章还探讨了OpenTelemetry Logs如何解决传统日志在分布式系统中的一些痛点问题,例如难以监控复杂多变的系统状态和行为、难以实现跨平台、跨语言、跨组件的日志集成等。最后,作者提醒读者,如果想要深入探索可观测性相关的内容,可以阅读官方文档或等待他的后续文章。那么,你是否已经对如何在.NET中使用OpenTelemetry有了一定的了解呢?你觉得OpenTelemetry能否解决你当前面临的问题呢?--GPT 4

.NET OpenTelemetry

为什么我的接口,慢得跟蜗牛一样啊?- 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