⚙️ Service Discovery в .NET через Consul можно подключить без самописного резолва адресов и ручного перебора инстансов.
Рабочая схема выглядит так:
Install-Package Steeltoe.Discovery.Consul
Регистрируем discovery:
builder.Services
.AddServiceDiscovery(o => o.UseConsul());
В appsettings.json указываем Consul и параметры сервиса:
"Consul": {
"Host": "localhost",
"Port": 8500,
"Discovery": {
"ServiceName": "reporting-service",
"Hostname": "reporting-api",
"Port": 8080
}
}
А дальше самое полезное:
builder.Services
.AddHttpClient(client =>
{
client.BaseAddress = new Uri("http://reporting-service");
})
.AddServiceDiscovery()
.AddRoundRobinLoadBalancer();
То есть HttpClient ходит не на конкретный IP:port, а на логическое имя сервиса.
Steeltoe через Consul получает живые инстансы, а RoundRobinLoadBalancer распределяет запросы между ними.
Это особенно полезно, когда сервисы часто пересоздаются, IP меняются, а хардкодить адреса уже невозможно.
По сути, клиентская часть получает простой pipeline:
service name → Consul → healthy instances → load balancing → HTTP request
Для микросервисов на .NET это намного чище, чем городить собственный discovery layer.
Рабочая схема выглядит так:
Install-Package Steeltoe.Discovery.Consul
Регистрируем discovery:
builder.Services
.AddServiceDiscovery(o => o.UseConsul());
В appsettings.json указываем Consul и параметры сервиса:
"Consul": {
"Host": "localhost",
"Port": 8500,
"Discovery": {
"ServiceName": "reporting-service",
"Hostname": "reporting-api",
"Port": 8080
}
}
А дальше самое полезное:
builder.Services
.AddHttpClient(client =>
{
client.BaseAddress = new Uri("http://reporting-service");
})
.AddServiceDiscovery()
.AddRoundRobinLoadBalancer();
То есть HttpClient ходит не на конкретный IP:port, а на логическое имя сервиса.
Steeltoe через Consul получает живые инстансы, а RoundRobinLoadBalancer распределяет запросы между ними.
Это особенно полезно, когда сервисы часто пересоздаются, IP меняются, а хардкодить адреса уже невозможно.
По сути, клиентская часть получает простой pipeline:
service name → Consul → healthy instances → load balancing → HTTP request
Для микросервисов на .NET это намного чище, чем городить собственный discovery layer.