Динамическое название сервиса с оцелотом и консулом

Я использую Ocelot и API-шлюз с Consul и сервисом обнаружения. Я регистрирую службы в Консуле с динамическими именами, такими как: service.name.1234 и service.name.5678

Эти услуги являются статичными и не предназначены для масштабирования вообще

Поскольку я работаю с Ocelot, я хотел бы иметь возможность направить запрос к нужной службе, но поскольку имена являются динамическими, мне нужно будет использовать параметр строки запроса в качестве имени службы

Пример: http://myapp.com/service/1234 Должен быть перенаправлен в контейнер с именем service.name.1234

Есть ли способ достичь этого, используя оба продукта? или может другой продукт?

Спасибо

1 ответ

Я искал себе такое же решение, но нашел только один комментарий на GitHub, и это мне очень помогло

Итак, вам нужно создать собственное промежуточное ПО, которое перепишет DownstreamRoute Ocelot:

      public static async Task InvokeAsync(HttpContext httpContext, Func<Task> next)
    {
        
        var downstreamRoute = httpContext.Items.DownstreamRoute();

        var yourServiceName = //get query string parameter from httpContext;

        //rewrite any parameter that you want
        httpContext.Items.UpsertDownstreamRoute(
            new DownstreamRoute(
                downstreamRoute.Key,
                downstreamRoute.UpstreamPathTemplate,
                downstreamRoute.UpstreamHeadersFindAndReplace,
                downstreamRoute.DownstreamHeadersFindAndReplace,
                downstreamRoute.DownstreamAddresses,
                tenantServiceName,
                ...
            ));
    }

И после этого вызываем его в Startup.cs:

      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // some other code

    var configuration = new OcelotPipelineConfiguration
            {
                PreQueryStringBuilderMiddleware = async (ctx, next) =>
                {
                    await RouteContextRetrieverMiddleware.InvokeAsync(ctx, next);

                    await next.Invoke();
                }
            };

            app.UseOcelot(configuration).GetAwaiter().GetResult();
}
Другие вопросы по тегам