Введение

Архитектура микросервисов приобрела значительную популярность благодаря своей масштабируемости и гибкости. Одной из ключевых проблем в такой архитектуре является управление обменом данными между службами. Традиционные подходы, такие как жесткое кодирование IP-адресов или использование статических конфигураций, становятся непрактичными по мере роста количества сервисов. Вот где на помощь приходит обнаружение сервисов.

В этом руководстве мы рассмотрим, как использовать Eureka, надежный инструмент обнаружения служб, для включения динамического обнаружения служб в архитектуре микрослужб. Мы углубимся в детали реализации с помощью .NET Core и продемонстрируем, как Eureka позволяет службам беспрепятственно обнаруживать друг друга и взаимодействовать друг с другом.

К концу этого руководства у вас будет четкое представление о том, как настроить сервер Eureka, интегрировать его в ваши микросервисы и увидеть всю мощь динамического обнаружения сервисов в действии. Давайте начнем путь к более устойчивому и масштабируемому обмену микросервисами.

Мы пройдем этапы настройки сервера Eureka и его интеграции в два примера сервисов: ProductService и OrderService.

Шаг 1. Настройка сервера Eureka

  1. Загрузите и установите сервер Eureka, следуя официальной документации: https://github.com/Netflix/eureka/wiki/Building-Eureka-Client-and-Server
  2. Запустите сервер Eureka, выполнив соответствующую команду или сценарий.

Шаг 2. Внедрение ProductService

  1. Создайте новый проект .NET Core для ProductService.
  2. Добавьте в проект пакет Steeltoe.Discovery.Eureka NuGet.
  3. Настройте клиент Eureka в файле Program.cs ProductService:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Steeltoe.Discovery.Eureka;

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .AddServiceDiscovery(options =>
            {
                options.UseEureka();
            });
}

4. Создайте образец конечной точки API в Startup.cs службы ProductService.

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

Шаг 3. Внедрение службы OrderService

  1. Создайте новый проект .NET Core для OrderService.
  2. Добавьте в проект пакет Steeltoe.Discovery.Eureka NuGet.
  3. Настройте клиент Eureka в Program.cs OrderService, аналогично ProductService:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Steeltoe.Discovery.Eureka;

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .AddServiceDiscovery(options =>
            {
                options.UseEureka();
            });
}

4. Создайте пример конечной точки API в файле Startup.cs службы OrderService, аналогичной ProductService:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

Шаг 4. Запустите приложения

  1. Запустите сервер Eureka, если он еще не запущен.
  2. Запустите ProductService, запустив его проект.
  3. Запустите OrderService, запустив его проект.

Шаг 5. Проверка службы обнаружения

  1. Получите доступ к панели инструментов сервера Eureka в своем браузере (http://localhost:8761).
  2. Убедитесь, что и ProductService, и OrderService указаны как зарегистрированные экземпляры.

3. В OrderService сделайте HTTP-запрос к ProductService, используя клиент обнаружения службы.

using Microsoft.AspNetCore.Mvc;
using Steeltoe.Discovery;

[ApiController]
[Route("[controller]")]
public class OrderController : ControllerBase
{
    private readonly DiscoveryHttpClientHandler _handler;
    public OrderController(IDiscoveryClient discoveryClient)
    {
        _handler = new DiscoveryHttpClientHandler(discoveryClient);
    }
    [HttpGet]
    public async Task<ActionResult> Get()
    {
        using var client = new HttpClient(_handler, false);
        var response = await client.GetAsync("http://ProductService/api/products");
        var content = await response.Content.ReadAsStringAsync();
        return Ok(content);
    }
}

Отправьте запрос GET на конечную точку OrderService (http://localhost:5000/order) для получения данных из ProductService.

Поздравляем! Вы реализовали обнаружение сервисов с помощью Eureka в архитектуре микросервисов. Теперь службы могут динамически обнаруживать друг друга и взаимодействовать друг с другом без необходимости жестко запрограммированных IP-адресов или явных конфигураций.