API 在 .NET 6 上使用 Ocelot 的网关 docker 容器 - 无法使其工作
API Gateway using Ocelot on .NET 6 docker container - unable to make it work
我对微服务架构还很陌生,并且手动启动了我自己的 api-gateway,它可以正常工作,但通过研究,我意识到使用 Ocelot 作为替代品的价值在于它带来的功能。今天我创建了一个新的空 .NET 6 api-gateway 项目,并使用 Ocelot 文档引入了设置它所需的 nuget 包。最终游戏是使用 Eureka,但由于我似乎无法让它工作,所以我退后一步,首先使用直接调用基于 docker 的微服务。
查看文档,我想我已经严格遵守了,但是当我启动容器时它什么也没做,我想知道是否有人可以指出正确的方向。
我的program.cs
using Ocelot.DependencyInjection;
using Ocelot.Middleware;
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext, config) =>
{
config
.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
.AddJsonFile("appsettings.json", true, true)
.AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
.AddJsonFile("ocelot.json")
.AddEnvironmentVariables();
})
.ConfigureServices(s =>
{
s.AddOcelot();
//.AddEureka();
});
var app = builder.Build();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.UseOcelot().Wait();
app.Run();
我的ocelot.json
{
"Routes": [
// drugService API
{
"DownstreamPathTemplate": "/api/TerminologyServices/SearchDrugs/{filter}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "drugservice",
"Port": "80"
}
],
"UpstreamPathTemplate": "/TerminologyServices/SearchDrugs/{filter}",
"UpstreamHttpMethod": [ "Get" ]
}
],
"GlobalConfiguration": {
"BaseUrl": "https://localhost:5003"
}
}
'''
在这种情况下 docker compose yaml 使用的容器名称替换 localhost web.api.gateway 解决了这个问题。
我对微服务架构还很陌生,并且手动启动了我自己的 api-gateway,它可以正常工作,但通过研究,我意识到使用 Ocelot 作为替代品的价值在于它带来的功能。今天我创建了一个新的空 .NET 6 api-gateway 项目,并使用 Ocelot 文档引入了设置它所需的 nuget 包。最终游戏是使用 Eureka,但由于我似乎无法让它工作,所以我退后一步,首先使用直接调用基于 docker 的微服务。
查看文档,我想我已经严格遵守了,但是当我启动容器时它什么也没做,我想知道是否有人可以指出正确的方向。
我的program.cs
using Ocelot.DependencyInjection;
using Ocelot.Middleware;
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext, config) =>
{
config
.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
.AddJsonFile("appsettings.json", true, true)
.AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
.AddJsonFile("ocelot.json")
.AddEnvironmentVariables();
})
.ConfigureServices(s =>
{
s.AddOcelot();
//.AddEureka();
});
var app = builder.Build();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.UseOcelot().Wait();
app.Run();
我的ocelot.json
{
"Routes": [
// drugService API
{
"DownstreamPathTemplate": "/api/TerminologyServices/SearchDrugs/{filter}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "drugservice",
"Port": "80"
}
],
"UpstreamPathTemplate": "/TerminologyServices/SearchDrugs/{filter}",
"UpstreamHttpMethod": [ "Get" ]
}
],
"GlobalConfiguration": {
"BaseUrl": "https://localhost:5003"
}
}
'''
在这种情况下 docker compose yaml 使用的容器名称替换 localhost web.api.gateway 解决了这个问题。