C#.NET YARP 服务发现实战:接入 Consul 和 Kubernetes 动态发现后端服务
摘要:简介 前面几篇已经把 YARP 的基础代理、JWT、CORS、OpenTelemetry 都串起来了。 服务发现是网关实战里很关键的一步: YARP 后端地址不要写死,改成从服务发现系统里动态获取。 普通配置里,后端地址通常写在 appsettings.json: "Destinations": {
阅读全文
posted @
2026-05-29 16:37
我是唐青枫
阅读(5)
推荐(0)
别把登录写散了:C#.NET IdentityServer4 统一认证与 JWT 授权实战
摘要:简介 IdentityServer4 是一个基于 ASP.NET Core 的认证授权框架。 它主要做一件事: 集中处理登录、发放 Token、保护 API。 在单体项目里,登录通常直接写在业务系统里: 用户 -> Web 系统 -> Cookie / Session -> 业务接口 项目一多,问题
阅读全文
posted @
2026-05-25 07:33
我是唐青枫
阅读(9)
推荐(0)
C#.NET YARP + OpenTelemetry:网关链路追踪实战
摘要:简介 微服务项目里,接口慢了、报错了、偶发超时了,最怕的不是失败本身,而是不知道请求到底卡在哪一层。 比如一个很常见的链路: 浏览器 | v YARP Gateway | v ProductService | v OrderService 如果只看普通日志,经常只能看到: Gateway 收到请求
阅读全文
posted @
2026-05-22 07:55
我是唐青枫
阅读(13)
推荐(0)
C#.NET YARP 跨域配置详解:网关统一处理 CORS
摘要:简介 前后端分离项目里,CORS 基本绕不开。 本地开发时经常是这样: 前端:http://localhost:5173 网关:http://localhost:5000 商品服务:http://localhost:5101 订单服务:http://localhost:5201 浏览器页面从 htt
阅读全文
posted @
2026-05-18 16:38
我是唐青枫
阅读(5)
推荐(0)
C#.NET YARP 认证授权实战:在网关层统一接入 JWT
摘要:简介 上一篇文章已经把 YARP 的基础反向代理、路由、负载均衡、健康检查、限流都串了一遍。 这篇继续往下走,专门讲一个网关项目里很常见的能力: 在 YARP Gateway 层统一接入 JWT 认证授权。 也就是说,请求进来以后,先经过网关校验 JWT,校验通过后再转发到后端服务。 请求链路大概是
阅读全文
posted @
2026-05-12 09:58
我是唐青枫
阅读(18)
推荐(0)
C#.NET YARP 详解:用 ASP.NET Core 打造高性能反向代理网关
摘要:简介 YARP 全称是 Yet Another Reverse Proxy,是微软开源的 .NET 反向代理库。 一句话说清楚: YARP 不是一个单独安装的网关软件,而是一个装进 ASP.NET Core 项目里的反向代理组件。 所以它和 Nginx、Envoy 这类独立代理不太一样。YARP 更
阅读全文
posted @
2026-05-09 09:58
我是唐青枫
阅读(139)
推荐(0)
终于不用手搓两级缓存了!C#.NET HybridCache 详解:L1 L2、标签失效与防击穿实战
摘要:简介 很多项目一开始做缓存,通常都是这么写的: 先查 IMemoryCache -> 没有再查 Redis -> 还没有就查数据库 -> 再把结果写回两层缓存 刚开始看起来没什么问题。 但只要项目一复杂,这套逻辑很快就会变得又长又散: 每个地方都在手写两级缓存 本地缓存和 Redis 的过期时间不好
阅读全文
posted @
2026-05-07 07:29
我是唐青枫
阅读(24)
推荐(0)
别再把 Redis 当黑盒了!C#.NET IDistributedCache 详解:官方分布式缓存接口从入门到实战
摘要:简介 很多项目一提到缓存,第一反应就是: 上 Redis 存个字符串 查不到就回数据库 刚开始这样写没什么问题。 但项目一复杂,几个现实问题就会很快冒出来: 多实例部署后,本地缓存各存各的 业务代码里到处散着 Redis key 对象序列化、反序列化重复写了一堆 过期时间全靠手抄 想切换缓存底层实现
阅读全文
posted @
2026-05-06 09:55
我是唐青枫
阅读(19)
推荐(0)
别只会用 MemoryCache!C#.NET CacheManager 详解:多级缓存、Region 与 Redis 实战
摘要:简介 一提到缓存,很多项目里最先出现的通常是这几样东西: IMemoryCache IDistributedCache Redis 手写一套缓存工具类 刚开始看起来都能用。 但项目一复杂,问题就会慢慢冒出来: 有的地方直接查内存缓存 有的地方直接调 Redis 有的地方缓存键命名完全不统一 有的地方
阅读全文
posted @
2026-05-05 16:29
我是唐青枫
阅读(27)
推荐(0)
内存为什么越来越高?C#.NET GC 详解:分代回收、LOH、终结器与性能优化实战
摘要:简介 平时写 C#,很少会主动去碰内存管理。 因为 .NET 已经把最麻烦的一层包掉了: 对象分配不用手动 malloc 对象释放不用手动 free 大部分时候只管写业务,程序也能正常跑 但只要项目一上量,GC 这个词迟早会冒出来: 接口偶尔抖一下,排查看到 Gen2 GC 内存一直涨,不确定是正常
阅读全文
posted @
2026-05-04 10:11
我是唐青枫
阅读(36)
推荐(0)
别再层层传参了!C#.NET AsyncLocal 异步上下文透传实战
摘要:简介 异步代码一多,参数传递很快就会开始变味。 最常见的场景是这样: 入口层拿到了 TraceId 服务层要打日志 仓储层也想拿到同一个 TraceId 调了好几层 await 以后,这个值还得一直跟着走 如果每一层都靠方法参数往下传,代码会越来越啰嗦。 这时候很多人会先想到: 放静态变量里,不行,
阅读全文
posted @
2026-05-01 11:59
我是唐青枫
阅读(19)
推荐(0)
别再把增删改查写成一锅粥!C#.NET CQRS 从原理到实战
摘要:简介 很多业务系统刚开始都差不多: 一个 Service 里面既有新增、修改、删除 也有列表、详情、统计、搜索 前期这样写很顺手。 但只要项目稍微复杂一点,问题就会慢慢冒出来: 读逻辑和写逻辑揉在一起 一个接口改动,连带影响一堆查询 写入要走校验、事务、领域规则 查询却只想尽快把数据拿出来 列表页、
阅读全文
posted @
2026-04-30 07:28
我是唐青枫
阅读(20)
推荐(0)
C#.NET ThreadLocal 深入解析:线程独享数据、性能收益与实战边界
摘要:简介 多线程代码里最麻烦的一个点,不是“怎么开线程”,而是“数据到底该不该共享”。 很多并发问题,本质上都不是线程太多,而是: 好几个线程同时改同一份数据 于是开始加锁 锁一多,性能又掉下去 这时候就会发现,有些数据其实根本没必要共享。 比如: 每个线程自己的计数器 每个线程自己的 Random 每
阅读全文
posted @
2026-04-29 21:20
我是唐青枫
阅读(21)
推荐(0)
C#.NET MediatR 深入解析:进程内消息分发、CQRS、通知事件与管道行为实战
摘要:简介 MediatR 是 .NET 里很常见的进程内消息分发库。 它做的事情不复杂: 调用方发出一个请求,MediatR 找到对应的处理器执行。 这听起来像“多绕了一层”,但在业务代码越来越复杂时,这一层很有用。 没有 MediatR 时,控制器、服务类里经常会堆很多依赖: public class
阅读全文
posted @
2026-04-28 07:51
我是唐青枫
阅读(16)
推荐(0)
C#.NET MemoryMarshal 深入解析:零拷贝内存重解释、二进制读写与使用边界
摘要:简介 在 .NET 高性能内存编程里,Span<T> 解决了一个很实际的问题: 不复制数据,也能操作一段连续内存。 但 Span<T> 本身还是比较“规矩”的。 比如: Span<byte> 就是按字节看; Span<int> 就是按整数看; ReadOnlyMemory<T> 背后到底是不是数组,
阅读全文
posted @
2026-04-27 07:27
我是唐青枫
阅读(34)
推荐(0)
C#.NET TaskCompletionSource 深入解析:手动控制 Task、桥接回调事件与实战避坑
摘要:简介 在 .NET 异步编程里,Task 大多数时候都是“自动完成”的。 比如: async 方法执行完了,返回的 Task 自动完成; HttpClient.GetAsync 底层 I/O 完成了,Task 自动完成; Task.Run 里的委托跑完了,Task 自动完成。 但还有一类场景,不是“
阅读全文
posted @
2026-04-22 09:35
我是唐青枫
阅读(39)
推荐(0)
C#.NET Task 与 async await 深入解析:底层原理、执行流程与实战误区
摘要:简介 Task 和 async/await 是 C# 异步编程的核心,也是最容易被表面化理解的一组概念。 开发中常见的说法往往是: Task 就是线程; await 会新开一个线程; 只要用了 async,方法就变快了; 代码卡了,包一层 Task.Run 就行。 这些说法并不完全错误,但都不够准确
阅读全文
posted @
2026-04-21 09:34
我是唐青枫
阅读(30)
推荐(0)
C#.NET ValueTaskSource 深入解析:零分配异步、ManualResetValueTaskSourceCore 与使用边界
摘要:简介 在 .NET 异步里,如果你顺着这条线往下学: Task ValueTask IValueTaskSource 会发现难度是明显跳跃的。 Task 还是大多数业务代码的默认答案。 ValueTask 已经开始涉及“减少分配、减少状态对象”的优化。 到了 ValueTaskSource,就基本进
阅读全文
posted @
2026-04-17 09:36
我是唐青枫
阅读(10)
推荐(0)
C#.NET ObjectPool 深入解析:对象复用、池化策略与使用边界
摘要:简介 在 .NET 里做性能优化时,很多人第一反应是: 少分配 少 GC 少临时对象 这个方向本身没有问题。 但问题在于,优化一旦开始,很容易走偏成另外一种极端: 看到对象创建就想池化 觉得池化一定比 new 更快 把对象池当成一种“万能缓存” ObjectPool 这类工具,真正值钱的地方不是“把
阅读全文
posted @
2026-04-16 21:36
我是唐青枫
阅读(24)
推荐(0)
C#.NET Mapperly 深入解析:源生成映射、安装使用与工程化取舍
摘要:简介 在 .NET 项目里,只要分层稍微清晰一点,就绕不开这类代码: Entity -> Dto Request -> Command Command -> Aggregate Grpc Message -> Application Model 一开始大家通常是手写: var dto = new U
阅读全文
posted @
2026-04-15 11:05
我是唐青枫
阅读(54)
推荐(0)