直接用Ocelot而非手写网关因其已稳定支持.NET Core/.NET 5+微服务,深度集成ASP.NET Core生命周期,避免自行实现路由、JWT、限流等高容错成本逻辑。

为什么直接用 Ocelot 而不是自己手写网关
因为 API 网关的核心逻辑(路由匹配、请求转发、JWT 验证、限流、熔断)在生产环境里容错成本极高,Ocelot 已经稳定支撑 .NET Core/.NET 5+ 的微服务多年,且与 ASP.NET Core 生命周期深度集成。自己实现容易在 HttpContext 复制、响应体流重放、超时控制、下游连接池复用等环节出问题。
Ocelot 配置文件里 Routes 怎么写才不 404
常见错误是路径匹配规则和下游服务地址没对齐,或者忽略了 DownstreamPathTemplate 的占位符替换逻辑。
-
UpstreamPathTemplate是客户端访问的路径,支持通配符如/api/users/{id},但必须带前导/ -
DownstreamPathTemplate是转发给下游服务的真实路径,如果下游本身也带/api前缀,这里就得写成/api/users/{id};若下游是根路径服务,就写成/users/{id} -
DownstreamScheme必须明确写http或https,漏写会导致Unable to create route错误 - 负载均衡需同时配置
LoadBalancerOptions和ServiceDiscoveryProvider,否则RoundRobin不生效
示例最小可运行路由:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
{
"Routes": [{
"UpstreamPathTemplate": "/svc1/{everything}",
"DownstreamPathTemplate": "/{everything}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{ "Host": "localhost", "Port": 5001 },
{ "Host": "localhost", "Port": 5002 }
],
"LoadBalancerOptions": { "Type": "RoundRobin" }
}]
}
.NET 6+ 中如何让 Ocelot 支持 JWT 验证并透传用户信息
Ocelot 本身不做鉴权,它把认证交给上游中间件(如 AddAuthentication),但需要显式开启 AuthenticationOptions 并透传 ClaimsPrincipal 到下游。
- 必须在
Program.cs中调用services.AddAuthentication().AddJwtBearer(...),且顺序要在AddOcelot()之前 - 在
ocelot.json的Routes下添加"AuthenticationOptions": { "AuthenticationProviderKey": "Bearer" },其中Bearer要和AddAuthentication().AddJwtBearer("Bearer", ...)的 key 一致 - 下游服务要能接收
X-User-Id、X-User-Roles这类头,Ocelot 默认不自动透传 Claims,得靠GlobalConfiguration的BaseUrl或自定义DelegatingHandler补充——更简单的方式是在下游用HttpContext.User直接读,只要 Ocelot 没改Authorizationheader 就行
本地调试时 Ocelot 报 Connection refused 怎么快速定位
这不是 Ocelot 的 bug,而是下游服务根本没起来、端口被占、或 Docker 网络隔离导致的连不通。别急着查路由配置。
- 先用
curl -v http://localhost:5001/health手动测下游服务是否响应,确认DownstreamHostAndPorts的 host/port 能直连 - Docker 场景下,Ocelot 容器里不能用
localhost指向宿主机服务,得换成host.docker.internal(Windows/macOS)或宿主机内网 IP(Linux) - 检查下游服务是否监听了
0.0.0.0:5001而非127.0.0.1:5001,后者容器无法访问 - Ocelot 日志级别设为
Debug,看日志里实际构造的 downstream URL 是什么,比配置文件更真实
真正难搞的是跨服务链路追踪上下文透传和动态路由热更新,这两块 Ocelot 原生支持弱,得自己 hook IOcelotConfigurationRepository 或集成 SkyWalking。


















