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 文件里设置它的 CopyToOutputDirectoryPreserveNewest,否则发布后找不到这个文件。

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 的负载均衡和限流配置,这两个在生产环境里几乎是必用的。到时候我会结合一个真实的压测场景来演示,敬请期待。