404错误:尝试在docker内部部署ocelot网关调用微服务
Posted
技术标签:
【中文标题】404错误:尝试在docker内部部署ocelot网关调用微服务【英文标题】:404 error: Trying to deploy ocelot gateway inside docker to call microservices 【发布时间】:2021-07-17 10:31:51 【问题描述】:我们开发了两个 ASP.NET CORE (5.0) 微服务并将它们部署在 docker 中 http://localhost:28621/stock http://localhost:62362/用户
两者都可以通过浏览器轻松访问。
API网关我们使用ocelot网关。 当我们在 docker 中部署它时,出现以下错误
warn: Ocelot.DownstreamRouteFinder.Middleware.DownstreamRouteFinderMiddleware[0] requestId: 0HM8658EF6KHC:00000002, previousRequestId: no previous request id, message: DownstreamRouteFinderMiddleware setting pipeline errors. IDownstreamRouteFinder returned Error Code: UnableToFindDownstreamRouteError Message: Failed to match Route configuration for upstream path: /user, verb: GET. warn: Ocelot.Responder.Middleware.ResponderMiddleware[0] requestId: 0HM8658EF6KHC:00000002, previousRequestId: no previous request id, message: Error Code: UnableToFindDownstreamRouteError Message: Failed to match Route configuration for upstream path: /user, verb: GET. errors found in ResponderMiddleware. Setting error response for request path:/user, request method: GET
-------------------------------------------------------- -------------------------------------------------- ---
ocelot.Development.json如下
"Routes": [
"DownstreamPathTemplate": "/user",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
"Host": "localhost",
"Port": 62362
],
"UpstreamPathTemplate": "/user",
"UpstreamHttpMethod": [ "Get" ]
,
"DownstreamPathTemplate": "/stock",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
"Host": "localhost",
"Port": 28621
],
"UpstreamPathTemplate": "/stock",
"UpstreamHttpMethod": [ "Get" ]
],
"GlobalConfiguration":
"BaseUrl": "https://localhost:5021"
startup.cs
public class Startup
public void ConfigureServices(IServiceCollection services)
services.AddOcelot();
public async void Configure(IApplicationBuilder app, IWebHostEnvironment env)
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseRouting();
app.UseEndpoints(endpoints =>
endpoints.MapControllers();
);
await app.UseOcelot();
program.cs
public class Program
public static void Main(string[] args)
CreateHostBuilder(args).Build().Run();
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
config.AddJsonFile($"ocelot.
hostingContext.HostingEnvironment.EnvironmentName.json", true, true);
)
.ConfigureWebHostDefaults(webBuilder =>
webBuilder.UseStartup<Startup>();
);
请指导我们哪里做错了 我们正在使用 .net core 5.0
谢谢
【问题讨论】:
【参考方案1】:您的 Ocelot 容器无法通过“DownstreamHostAndPorts”设置访问其他容器的服务:'Host': 'localhost'。容器的 'localhost' 和宿主机的 'localhost' 不一样!
要解决这个问题,请看这个方向:
创建 Docker 网络 使用 --network-alias 标志在同一网络下运行所有三个容器 在Ocelot json 文件中使用网络别名和默认端口(由于容器可以直接相互通信,因此无需映射外部端口!)【讨论】:
【参考方案2】:您能否将路由更改为 ReRoutes。我解决了这个问题。也许你忘了在 program.cs 中添加 json 文件。这是代码,
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((host, config) =>
config.AddJsonFile("Ocelot.json", false, true);
)
.ConfigureWebHostDefaults(webBuilder =>
webBuilder .UseStartup<Startup>();
);
【讨论】:
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 请edit将该附加信息添加到答案本身。 我试过了,希望对你有用! :)以上是关于404错误:尝试在docker内部部署ocelot网关调用微服务的主要内容,如果未能解决你的问题,请参考以下文章
使用 Angular 7、NGINX 和 Docker 刷新页面时出现 404 错误
使用 ocelot 和 docker 服务使用路由 ApiGateway 时出错
本地自定义了404 和500 错误处理 部署到IIS上显示 服务器内部错误