4、Ocelot 入门:Ocelot 简介、安装与配置、第一个路由转发示例
4.1 Ocelot 到底是什么?
先说说 Ocelot 是什么吧。
它是一个基于 .NET Core 的轻量级 API 网关。说白了,就是放在你所有微服务前面的一道「大门」。所有客户端请求先打到 Ocelot,再由它转发给后端的各个服务。
我最早接触 Ocelot 是在 2018 年,那时候公司刚把单体应用拆成十几个微服务。前端调用后端接口时,要记住一堆不同的地址和端口,维护起来特别痛苦。后来引入了 Ocelot,前端只需要知道网关的地址就行了。嗯,这个体验提升还是很明显的。
核心能力一览:
- 路由转发:把请求按规则转发到下游服务
- 负载均衡:支持轮询、最少连接等策略
- 限流:防止某个服务被突发流量打垮
- 认证鉴权:统一校验 JWT Token
- 请求聚合:把多个服务的返回结果合并成一个
你可能会问:为什么不用 Nginx 或者 Kong?我的看法是,如果你团队的技术栈全是 .NET,Ocelot 的集成成本最低。配置是 JSON 文件,改起来方便,而且可以跟 .NET 的中间件无缝配合。
4.2 安装与配置
安装 Ocelot 非常简单。创建一个空的 ASP.NET Core Web 项目,然后通过 NuGet 安装包:
dotnet add package Ocelot
或者你在 Visual Studio 的包管理器里搜索「Ocelot」直接安装也行。我个人习惯用命令行,因为快。
安装完成后,需要在 Program.cs 里注册 Ocelot 服务:
using Ocelot.DependencyInjection;
using Ocelot.Middleware;
var builder = WebApplication.CreateBuilder(args);
// 添加 Ocelot 服务
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);
builder.Services.AddOcelot(builder.Configuration);
var app = builder.Build();
// 使用 Ocelot 中间件
await app.UseOcelot();
app.Run();
这里有个细节要注意:AddJsonFile("ocelot.json") 这行代码,我建议加上 reloadOnChange: true。这样你修改了 ocelot.json 文件后,不需要重启应用就能生效。我在生产环境里用过这个特性,确实省了不少事。
注意:Ocelot 的配置文件默认不包含在项目模板里。你需要手动在项目根目录下创建一个 ocelot.json 文件,并且记得在 .csproj 文件里设置它的 CopyToOutputDirectory 为 PreserveNewest,否则发布后找不到这个文件。
4.3 第一个路由转发示例
好,现在我们来写第一个路由规则。假设你有一个用户服务,跑在 http://localhost:5001 上,暴露了一个 /api/users 的接口。我们希望客户端通过网关的 /users 路径来访问它。
在 ocelot.json 里这样配置:
{
"Routes": [
{
"DownstreamPathTemplate": "/api/users",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5001
}
],
"UpstreamPathTemplate": "/users",
"UpstreamHttpMethod": [ "GET" ]
}
],
"GlobalConfiguration": {
"BaseUrl": "http://localhost:5000"
}
}
解释一下这几个关键字段:
| 字段 | 含义 |
|---|---|
| DownstreamPathTemplate | 下游服务的实际路径 |
| DownstreamScheme | 下游服务的协议(http/https) |
| DownstreamHostAndPorts | 下游服务的主机和端口 |
| UpstreamPathTemplate | 网关对外暴露的路径 |
| UpstreamHttpMethod | 允许的 HTTP 方法 |
| GlobalConfiguration.BaseUrl | 网关自身的地址 |
配置好之后,启动网关应用(假设端口是 5000)。然后你在浏览器里访问 http://localhost:5000/users,Ocelot 就会把请求转发到 http://localhost:5001/api/users。
是不是很简单?
小技巧:如果你下游服务有多个实例,可以在 DownstreamHostAndPorts 里配置多个地址。Ocelot 默认使用轮询策略来分发请求。我曾经帮一个客户做过压测,单网关每秒能处理 2000+ 的请求转发,性能完全够用。
4.4 避坑指南
讲几个我踩过的坑吧。
第一个坑:路径匹配问题。 如果你下游服务的路径是 /api/users/{id},那么 DownstreamPathTemplate 要写成 /api/users/{id},UpstreamPathTemplate 也要写成 /users/{id}。占位符的名称必须一致,否则匹配不上。
第二个坑:大小写敏感。 Ocelot 默认对路径是大小写不敏感的,但如果你下游服务对大小写敏感,记得在 GlobalConfiguration 里设置 "RouteIsCaseSensitive": true。
第三个坑:配置文件格式。 我见过有人把 JSON 写成了多行注释或者末尾多了逗号,导致 Ocelot 启动时报错。建议用 VS Code 或者 Visual Studio 的 JSON 校验功能检查一下。
4.5 小结
这一章我们走通了 Ocelot 的入门流程。从安装、配置到第一个路由转发,其实核心就是理解 ocelot.json 里的那几个字段。你想想看,网关的本质就是一张「路由表」,告诉请求该往哪里走。
下一章我会讲 Ocelot 的负载均衡和限流配置,这两个在生产环境里几乎是必用的。到时候我会结合一个真实的压测场景来演示,敬请期待。