Posts

.NET 10 使用 Microsoft.AspNetCore.OpenApi 实现 API 版本管理

为什么 API 版本管理如此重要? API 版本管理的核心目标是:在不破坏现有用户的前提下,持续迭代和改进 API。通过版本管理,我们可以: 引入新功能:在新版本中添加字段、接口等,而不影响旧版本的用户。 修复 bug:在新版本中修复问题,而不冒破坏旧版本的风险。 逐步淘汰:在新版本中移除过时的功能,给用户足够的时间迁移。 常见的版本策略有这几种: URL 路径版本:/api/v1/users,直 …

.NET 中 .Result 避坑指南:不同框架下的死锁与线程池饥饿

这篇只讲一个知识点:在 .NET 代码里用 .Result(或 GetAwaiter().GetResult())同步阻塞异步任务,为什么在不同框架下会触发不同类型的事故。 问题背景 同样一行代码,在两个系统里出现了完全不同的故障: 老系统(ASP.NET MVC 5)请求直接卡死,不返回 新系统(ASP.NET Core)不是直接死锁,而是高峰期吞吐突然掉到很低,请求排队超时 两边都有这段写法: …

.NET 内存性能优化实战:Span<T>、ArrayPool、GC 与 LOH 控制

很多服务在压测里吞吐不错,一上生产就抖。根因常常不是业务逻辑,而是内存分配模式不健康。 典型表现: GC 频率偏高 P99 周期性尖峰 单机吞吐不稳定 这篇文章重点讲“如何减少无意义分配”,并把优化控制在团队可维护范围内。 问题背景 真实现场:一次常规版本上线后,接口平均耗时变化不大,但 P99 从 120ms 拉到 380ms,最后定位到的是字符串拼接和临时数组在高峰时段触发了更频繁的 GC。 …

ASP.NET Core 内存缓存实战:一篇搞懂该怎么配、怎么避坑

引言 这篇文章我们来聊一聊 asp.net core 的内存缓存。asp.net core 内存缓存(IMemoryCache)是一个轻量级的缓存方案,适用于单实例应用或者分布式环境中的本地缓存。它提供了简单的 API 来存储和检索数据,同时支持过期策略、优先级设置等功能。 什么是缓存 从用户请求到数据库返回数据,这是一个漫长的过程(夸张了点,通常也就是几十毫秒到几百毫秒)。可是又不止一个用户在访 …

ASP.NET Core 外部依赖调用治理实战:HttpClientFactory、Polly 与幂等边界

订单服务最容易出现的稳定性问题,不是业务代码写错,而是下游支付、库存、短信网关一抖,整个接口成功率跟着雪崩。看起来只是一次超时,实际上会引发重试风暴、线程池占满、数据库回写积压。今天这篇就只做一件事:把外部依赖调用链路收敛到可控、可观测、可恢复的状态。 1. 问题背景:服务没挂,为什么成功率先掉 线上经常出现这种现象: API 进程还活着,CPU 占用也不高,可能只有40%(举个例子,非真实数 …

ASP.NET Core 认证与授权实战:JWT、Policy 与权限边界落地

这篇文章不讨论完整身份平台建设,只聚焦 ASP.NET Core 里最常见、也最容易出错的一段:JWT 认证、Policy 授权,以及资源级权限边界该怎么落到代码里。 问题背景 真实现场:一个后台退款接口原本只允许财务角色调用,但线上排查发现,普通运营账号只要拿到有效 token,也能调用成功。 根因并不复杂: 接口加了 [Authorize] 系统只校验“是否登录” 没有继续校验角色、权限和资源 …

C# 异步编程实战:Task、ValueTask、线程池饥饿与背压设计

接口慢,不一定是数据库慢。很多系统在高峰期的核心问题,是异步链路写法导致线程池被慢慢耗空。 这类问题最麻烦的地方在于: CPU 不一定打满 错误日志不一定明显 本地压测可能复现不出来 这篇文章围绕一个目标展开:让异步代码在高并发下“稳态运行”,而不是“平时很快,高峰崩盘”。 1. 问题背景:为什么会出现线程池饥饿 常见触发方式: 在 ASP.NET Core 请求中使用 .Result / …

EF Core 事务实战:SaveChanges、ExecutionStrategy、Outbox 与一致性边界

“事务加上了,这可不就问了嘛”。真正到线上一跑,问题就冒出来了: 数据库提交成功了,但消息没发出去 外部调用成功了,但本地事务回滚了 SQL 重试机制打开后,一段代码被重复执行了两次 同一个请求里明明都写在一起,最终状态还是不一致 这篇文章不讲抽象理论,直接回答一个工程问题:在 EF Core 里,事务边界到底该怎么画,哪些事情能靠数据库事务兜住,哪些事情必须换一种设计。 问题背景:为什么“写成功 …

EF Core 写入链路实战:从 ChangeTracker 到 SQL Batch 的性能诊断与优化

这篇文章讨论一个问题:一次写入请求从实体变更到数据库落盘,中间到底发生了什么,哪里最容易慢,以及应该怎么定位。 问题背景 真实场景:订单系统在白天吞吐稳定,凌晨高峰出现周期性尖峰。接口平均耗时变化不大,但 P95 从 80ms 抬到 420ms,数据库 CPU 也出现波峰。 排查后发现: 应用层每次批量处理 2000 条数据 循环中频繁触发变更检测 每条数据都单独 SaveChanges 最终生成 …

EF Core 原生 SQL 实战:FromSql、SqlQuery 与对象映射边界

做 EF Core 一段时间后,很多人都会遇到同一个节点:常规 LINQ 能覆盖大多数查询,但一到复杂报表、视图或者历史 SQL 复用场景,就会开始考虑原生 SQL。问题不在于“能不能写 SQL”,而在于怎么写得可维护、可观测、还能和 EF Core 的映射体系配合好。这篇文章讲解 FromSql、SqlQuery 的使用边界和对象映射的一些坑。 1. 问题背景:为什么原生 SQL 常常能跑但难以 …