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上显示 服务器内部错误

将 MVC 应用程序部署到服务器后,JQuery 文件 404(未找到)和 500(内部服务器错误)

微服务架构

内部服务器错误 500,在 Docker 中访问 Spring 引导端点时