.NET中如何合并多个微服务的Ocelot配置文件?
问题描述
我有一个使用Ocelot的.NET项目,现有代码如下:
using Ocelot.DependencyInjection; using Ocelot.Middleware; var builder = WebApplication.CreateBuilder(args); builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true); builder.Services.AddOcelot(builder.Configuration); builder.Services.AddLogging(logging => { logging.AddConsole(); logging.AddDebug(); }); builder.Services.AddControllers(); var app = builder.Build(); await app.UseOcelot(); app.Run();
我希望将Ocelot作为所有微服务的入口点,并将不同微服务的路由拆分到不同配置文件中:在ocelot-config文件夹下存放doctors.json、reviews.json,同时src目录下还有ocelot.json。
但当我尝试添加所有配置文件时,只有最后一个生效,后续配置会覆盖之前的内容:
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true) .AddJsonFile("./ocelot-config/reviews.json", optional: false, reloadOnChange: true) .AddJsonFile("./ocelot-config/doctors.json", optional: false, reloadOnChange: true);
请问如何拆分不同微服务的路由配置文件并正确注册所有配置?
解决方案
直接叠加添加JSON配置文件会导致后加载的配置覆盖前一个的同名节点(比如Routes数组会被完全替换),要实现多配置文件的路由合并,需使用Ocelot的配置合并功能,具体步骤如下:
1. 调整主配置文件ocelot.json
主配置文件保留全局配置(如GlobalConfiguration),通过File节点引入其他路由配置文件:
{ "GlobalConfiguration": { "BaseUrl": "https://localhost:5001", // 其他全局配置项(如限流、熔断等) }, "File": [ "./ocelot-config/reviews.json", "./ocelot-config/doctors.json" ] }
2. 拆分路由配置文件的格式
每个拆分的配置文件仅需包含对应微服务的Routes数组,无需重复全局配置。例如doctors.json:
{ "Routes": [ { "DownstreamPathTemplate": "/api/doctors/{everything}", "DownstreamScheme": "https", "DownstreamHostAndPorts": [ { "Host": "doctors-service", "Port": 5002 } ], "UpstreamPathTemplate": "/doctors/{everything}", "UpstreamHttpMethod": ["Get", "Post"] } ] }
reviews.json同理,仅维护对应微服务的路由规则即可。
3. 修改Program.cs代码
仅需加载主ocelot.json,Ocelot会自动读取File节点指定的配置文件并合并所有路由:
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); builder.Services.AddLogging(logging => { logging.AddConsole(); logging.AddDebug(); }); builder.Services.AddControllers(); var app = builder.Build(); await app.UseOcelot(); app.Run();
补充说明
- 若需新增配置文件,直接修改主
ocelot.json的File数组即可,Ocelot会因reloadOnChange: true自动刷新配置。 - 拆分的配置文件路径是相对于主配置文件的位置,需确保路径正确,避免出现文件找不到的情况。
内容的提问来源于stack exchange,提问作者user29547398
相关产品推荐
相关产品推荐

