首页 > 其他分享 >[.NET] API网关选择:YARP还是Ocelot?

[.NET] API网关选择:YARP还是Ocelot?

时间:2025-01-06 16:36:12浏览次数:1  
标签:网关 http options YARP API Ocelot 限流

API网关选择:YARP还是Ocelot?

摘要

随着微服务架构的流行,API网关在系统架构中扮演着越来越重要的角色。在.NET生态中,YARP(Yet Another Reverse Proxy)和Ocelot是两种常用的API网关解决方案。那么,在实际应用中,我们该如何选择?本文将从易用性、文档、负载均衡、限流、身份验证、授权和性能等多个方面,对YARP和Ocelot进行详细对比,并附上具体的代码示例,帮助大家更好地理解和选择适合的API网关。

概述

YARP

YARP(Yet Another Reverse Proxy)是由微软维护的一个反向代理库,专为构建高度自定义的反向代理而设计。尽管它是一个较新的项目,但在GitHub上已经获得了超过8.7k的星标。YARP的优势在于其高性能、灵活的配置和丰富的文档支持。

GitHub地址:https://github.com/microsoft/reverse-proxy

Ocelot

Ocelot也是一个流行的API网关解决方案,已经存在了相当长的时间,积累了丰富的功能和社区支持。在GitHub上,Ocelot拥有超过8.4k的星标。尽管曾经有一段时间维护不积极,但近期又重新活跃起来。Ocelot提供了开箱即用的服务发现、请求聚合等功能。

GitHub地址:https://github.com/ThreeMammals/Ocelot

功能对比

负载均衡

两者都支持负载均衡,且配置方式相似。都可以通过配置多个下游服务,实现请求的负载均衡,并支持多种负载均衡策略,如轮询、随机等。

限流

YARP

YARP利用ASP.NET Core内置的限流中间件,提供了灵活的限流策略。支持固定窗口、滑动窗口、令牌桶、并发限制等多种算法。此外,YARP还支持自定义限流算法,满足特殊需求。

Ocelot

Ocelot也提供了限流功能,但在灵活性上略逊一筹。Ocelot的限流主要基于固定窗口,配置相对简单,但自定义能力有限。

身份验证与授权

YARP

YARP支持与ASP.NET Core的身份验证和授权机制集成。可以定义自定义的授权策略,支持基于声明、角色等多种方式的授权。配置灵活,能够满足复杂的安全需求。

Ocelot

Ocelot也支持身份验证和授权,但主要以基于声明的授权为主。相比之下,Ocelot的授权配置较为简单,灵活性不如YARP。

性能

在性能测试中,YARP显著优于Ocelot。在相同的测试条件下,YARP每秒处理的请求数比Ocelot高出约25%。对于高负载、高并发的应用场景,YARP的性能优势更加明显。

实践示例

接下来,我们通过具体的代码示例,展示如何使用YARP和Ocelot构建API网关,并实现负载均衡、限流等功能。

项目结构

我们使用基架自带的weatherforecastAPI。我们的目标是将该API置于API网关之后,使用YARP和Ocelot分别实现。

使用YARP构建API网关

1. 创建YARP网关项目

新建一个空的ASP.NET Core Web应用程序,命名为YarpGateway

2. 安装YARP包

YarpGateway项目中,安装YARP的NuGet包:

Install-Package Yarp.ReverseProxy

3. 配置Program.cs

Program.cs中,添加YARP所需的服务和中间件:

var builder = WebApplication.CreateBuilder(args);

// 添加YARP反向代理服务,并加载配置
builder.Services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));

var app = builder.Build();

// 配置YARP中间件
app.MapReverseProxy();

app.Run();

4. 配置appsettings.json

appsettings.json中,添加ReverseProxy配置节:

{
  "ReverseProxy": {
    "Routes": {
      "forecast-routes": {
        "ClusterId": "forecastCluster",
        "Match": {
          "Path": "/forecast/{**catch-all}"
        }
      }
    },
    "Clusters": {
      "forecastCluster": {
        "Destinations": {
          "destination1": {
            "Address": "http://localhost:5001/"
          },
          "destination2": {
            "Address": "http://localhost:5002/"
          }
        },
        "LoadBalancingPolicy": "RoundRobin"
      }
    }
  }
}

说明:

  • Routes:定义了请求匹配规则,将匹配到/forecast/*的请求路由到forecastCluster
  • Clusters:定义了下游服务的集合,这里配置了两个目标地址,用于负载均衡。
  • LoadBalancingPolicy:设置负载均衡策略为RoundRobin(轮询)。

5. 添加限流

在YARP中,可以利用ASP.NET Core的限流中间件进行配置。

首先,在Program.cs中添加限流服务:

builder.Services.AddRateLimiter(_ => 
{
    _.AddFixedWindowLimiter("fixed", options =>
    {
        options.Window = TimeSpan.FromSeconds(10);
        options.PermitLimit = 10;
        options.QueueLimit = 0;
        options.QueueProcessingOrder = System.Threading.RateLimiting.QueueProcessingOrder.OldestFirst;
    });
});

然后,在YARP的路由配置中,添加限流策略:

{
  "ReverseProxy": {
    "Routes": {
      "forecast-routes": {
        "ClusterId": "forecastCluster",
        "Match": {
          "Path": "/forecast/{**catch-all}"
        },
        "RateLimiterPolicy": "fixed"
      }
    },
    // 其他配置
  }
}

最后,在Program.cs中添加限流中间件:

app.UseRateLimiter();

6. 配置身份验证与授权

假设需要对/products路由进行授权,我们可以在YARP的路由配置中添加AuthorizationPolicy

{
  "AuthorizationPolicy": "RequireAuthenticatedUser"
}

Program.cs中,添加身份验证和授权服务,这里以JWT Scheme为例:

builder.Services.AddAuthentication("Bearer")
    .AddJwtBearer("Bearer", options =>
    {
        options.Authority = "https://your-auth-server";
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateAudience = false
        };
    });

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("RequireAuthenticatedUser", policy =>
    {
        policy.RequireAuthenticatedUser();
    });
});

并添加中间件:

app.UseAuthentication();
app.UseAuthorization();

使用Ocelot构建API网关

1. 创建Ocelot网关项目

新建一个空的ASP.NET Core Web应用程序,命名为OcelotGateway

2. 安装Ocelot包

OcelotGateway项目中,安装Ocelot的NuGet包:

Install-Package Ocelot

3. 配置Program.cs

Program.cs中,添加Ocelot所需的服务和中间件:

var builder = WebApplication.CreateBuilder(args);

// 添加Ocelot服务
builder.Services.AddOcelot();

// 加载Ocelot配置文件
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);

var app = builder.Build();

// 配置Ocelot中间件,要加一个await还挺奇怪的
await app.UseOcelot();

app.Run();

4. 创建ocelot.json

在项目根目录下,添加ocelot.json配置文件:

{
  "Routes": [
    {
      "DownstreamPathTemplate": "/forecast/{everything}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5001
        },
        {
          "Host": "localhost",
          "Port": 5002
        }
      ],
      "UpstreamPathTemplate": "/forecast/{everything}",
      "UpstreamHttpMethod": [ "GET", "POST", "PUT", "DELETE" ],
      "LoadBalancerOptions": {
        "Type": "RoundRobin"
      }
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "http://localhost:4000"
  }
}

说明:

  • Routes:定义了请求的上游和下游路径模板,以及支持的HTTP方法。
  • DownstreamHostAndPorts:配置了下游服务的主机和端口,用于负载均衡。
  • LoadBalancerOptions:设置负载均衡策略为RoundRobin(轮询)。
  • GlobalConfiguration:全局配置,可以配置API网关的基本地址。

5. 添加限流

在Ocelot中,可以在路由配置中添加限流选项:

{
  // 其他配置
  "RateLimitOptions": {
    "ClientWhitelist": [],
    "EnableRateLimiting": true,
    "Period": "10s",
    "PeriodTimespan": 10,
    "Limit": 10
  }
}

6. 配置身份验证与授权

在Ocelot的配置中,添加身份验证和授权选项:

{
  // 其他配置
  "AuthenticationOptions": {
    "AuthenticationProviderKey": "Bearer",
    "AllowedScopes": []
  },
  "RouteClaimsRequirement": {
    "role": "admin"
  }
}

Program.cs中,添加身份验证和授权服务:

builder.Services.AddAuthentication("Bearer")
    .AddJwtBearer("Bearer", options =>
    {
        options.Authority = "https://your-auth-server";
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateAudience = false
        };
    });

// Ocelot会自动使用ASP.NET Core的授权策略

测试配置

向YARP和Ocelot网关发送请求:

  • YARP网关

    GET http://localhost:3000/forecast/weatherforecast
    
  • Ocelot网关

    GET http://localhost:4000/forecast/weatherforecast
    

3. 验证负载均衡

多次发送请求,观察响应中服务器返回的实例信息,确认请求被轮询分配到不同的下游服务实例。

4. 验证限流

快速连续地发送超过限制次数的请求,观察是否返回相应的限流错误信息:

  • YARP:默认返回503 Service Unavailable

  • Ocelot:返回429 Too Many Requests,并包含错误信息。Ocelot的返回值更人性化

5. 验证身份验证与授权

使用dotnet签发本地测试JWT,尝试在不提供有效身份验证信息的情况下访问受保护的路由,验证是否被拒绝访问。
image

性能测试

为了对比YARP和Ocelot的性能,我们使用k6工具进行压力测试。三个项目都将运行在.NET9.0 Runtime、Release、Logging=Warning模式下

1. 设置测试脚本

创建yarp-test.jsocelot-test.js脚本,内容如下:

import http from 'k6/http';
import { check } from 'k6';

export const options = {
    stages: [
        { duration: '10s', target: 20 },
        { duration: '50s', target: 20 }
    ]
};

export default function () {
    const res = http.get('http://localhost:3000/forecast/weatherforecast');
    check(res, {
        'status was 200': (r) => r.status == 200,
    });
}
import http from 'k6/http';
import { check } from 'k6';

export const options = {
    stages: [
        { duration: '10s', target: 20 },
        { duration: '50s', target: 20 }
    ]
};

export default function () {
    const res = http.get('http://localhost:4000/forecast/weatherforecast');
    check(res, {
        'status was 200': (r) => r.status == 200,
    });
}

2. 运行性能测试

使用以下命令运行测试:

k6 run yarp-test.js
k6 run ocelot-test.js

3. 结果对比

image

根据测试结果,统计每秒处理的请求数(RPS):

  • YARP:约84120 RPS。
  • Ocelot:约57126 RPS。

YARP的性能明显优于Ocelot,快了47.3%,尤其是在高负载场景下。

结论

通过以上对比,我们可以发现:

  • YARP在性能、限流和授权的灵活性方面更具优势,适合需要高性能和高度自定义的应用场景,也更适合熟悉ASP.NET Core中间件的开发人员。
  • Ocelot提供了更丰富的功能,如服务发现、请求聚合等,开箱即用,适合快速构建和部署。

参考链接

标签:网关,http,options,YARP,API,Ocelot,限流
From: https://www.cnblogs.com/madtom/p/18655530

相关文章

  • 算法网关视频分析网关小知识:视频分析系统如何提高对动态变化的识别能力?
    在当今快速发展的智能监控领域,视频分析系统对动态变化的识别能力显得尤为重要。无论是用于安全监控、交通管理还是商业客流分析,准确地捕捉和理解视频中的动态变化都是提升系统性能的关键。为了实现这一目标,我们可以从多个方面对视频分析系统进行优化和改进。以下是一些有效的方法......
  • 阿里巴巴中国站获得1688商品高级详情 API 返回值说明
    阿里巴巴中国站提供了1688商品高级详情API,允许开发者通过编程方式获取商品的高级详情信息。以下是该API返回值说明及示例代码:返回值说明1688商品高级详情API的返回值通常包含以下字段:item:包含商品的高级详情数据。num_iid:商品ID。title:商品标题。desc_short:商品简短描述......
  • 分享几个好用的电商API接口(可测试)
    以下是一些好用的电商API接口,涵盖了商品、订单、支付、用户等多个方面:获取APIkey测试一、商品相关API接口商品详情接口功能:根据商品ID查询商品的详细信息,包括SKU信息、详情主图、库存、销量等。示例接口名:item_get。应用平台:1688、淘宝等。商品搜索接口功能:根据用户输......
  • 全网最强开源AI大模型接入教程:开源模型DeepSeek-V3 API接入全流程详解
    ......
  • redistemplate常用api
    String操作String是Redis中最简单的基本数据类型,可以存储任何数据,如字符串、整数、浮点数等。下面是一些常用操作。添加/设置值:SETkeyvaluejava复制代码redisTemplate.opsForValue().set("mykey","myvalue");获取值:GETkeyjava复制代码Stringval......
  • http代理采用API代理接口提取有哪些优势?
    在网络通信中,HTTP代理和API代理扮演着重要的角色。API代理通过API接口提取的方式,为使用HTTP代理的用户提供了许多便利和优势。本文将探讨API代理中的API接口是什么,采用API接口提取HTTP代理使用的好处,以及HTTP代理为什么会采用API接口提取方法。  API代理中的API接口是什......
  • 股票行情分析api接口怎么用?
    股票行情分析接口通常具有以下功能与应用:功能实时行情数据获取提供股票的实时价格、涨跌幅、成交量、成交额等基本交易数据,让投资者能够及时了解股票的市场表现。还可以获取盘口数据,如委买委卖五档价格和数量等,帮助投资者分析市场买卖力量的对比。历史行情数据查询允......
  • Profinet转EtherNet/IP网关连接AB PLC的应用案例
    某大型制造企业的生产车间同时采用了西门子S7-1500PLC作为核心控制系统的一部分,负责主要生产流程的控制与数据处理;而在特定生产环节,由于历史设备遗留或工艺配套需求,存在使用ABPLC的情况。这就导致了在整个自动化生产系统中,出现了两种不同的工业以太网协议(Profinet和Eth......
  • 虾皮店铺商品API接口的开发、运用与收益
    在电子商务蓬勃发展的今天,电商平台纷纷开放API接口,为开发者提供了丰富的数据资源和功能。作为东南亚领先的电商平台,虾皮(Shopee)通过其开放的API接口,为商家和开发者提供了全面的数据支持,极大地推动了电商数据分析与应用的发展。本文将详细介绍虾皮店铺商品API接口的开发、运用及......
  • 软件缺少nddeapi.dll文件及错误提示问题
    在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包文件不完整造成,原因可能是某些系统防护软件将重要的DLL文件识别为可疑,阻止并放入了隔离单里,还有一些常见的DLL文件缺少是因为系统没有安装齐全的微软运行库,还有部分情况是因为......