Динамическое название сервиса с оцелотом и консулом
Я использую 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();
}