簡體   English   中英

404錯誤:試圖在docker內部部署ocelot網關調用微服務

[英]404 error: Trying to deploy ocelot gateway inside docker to call microservices

我們開發了兩個 ASP.NET CORE (5.0) 微服務並部署在里面 docker http://localhost:28621/stock http://localhost:62362/user

兩者都可以從瀏覽器輕松訪問。

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 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"
  }
}

啟動.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();
    }
}

程序.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 核心 5.0

謝謝

您的 Ocelot 容器無法使用“DownstreamHostAndPorts”設置訪問其他容器的服務:{'Host': 'localhost'}。 容器的“localhost”與主機的“localhost”不同!

要解決這個問題,請朝這個方向看:

  • 創建一個 Docker.network
  • 在帶有 -.network-alias 標志的 same.network 下運行所有三個容器
  • 在 Ocelot json 文件中使用 .network 別名和默認端口(因為容器可以直接相互通信,不需要 map 外部端口!)

您能否將Routes 更改為 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>(); 
}); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM