Введение
Архитектура микросервисов приобрела значительную популярность благодаря своей масштабируемости и гибкости. Одной из ключевых проблем в такой архитектуре является управление обменом данными между службами. Традиционные подходы, такие как жесткое кодирование IP-адресов или использование статических конфигураций, становятся непрактичными по мере роста количества сервисов. Вот где на помощь приходит обнаружение сервисов.
В этом руководстве мы рассмотрим, как использовать Eureka, надежный инструмент обнаружения служб, для включения динамического обнаружения служб в архитектуре микрослужб. Мы углубимся в детали реализации с помощью .NET Core и продемонстрируем, как Eureka позволяет службам беспрепятственно обнаруживать друг друга и взаимодействовать друг с другом.
К концу этого руководства у вас будет четкое представление о том, как настроить сервер Eureka, интегрировать его в ваши микросервисы и увидеть всю мощь динамического обнаружения сервисов в действии. Давайте начнем путь к более устойчивому и масштабируемому обмену микросервисами.
Мы пройдем этапы настройки сервера Eureka и его интеграции в два примера сервисов: ProductService и OrderService.
Шаг 1. Настройка сервера Eureka
- Загрузите и установите сервер Eureka, следуя официальной документации: https://github.com/Netflix/eureka/wiki/Building-Eureka-Client-and-Server
- Запустите сервер Eureka, выполнив соответствующую команду или сценарий.
Шаг 2. Внедрение ProductService
- Создайте новый проект .NET Core для ProductService.
- Добавьте в проект пакет Steeltoe.Discovery.Eureka NuGet.
- Настройте клиент 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
- Создайте новый проект .NET Core для OrderService.
- Добавьте в проект пакет Steeltoe.Discovery.Eureka NuGet.
- Настройте клиент 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. Запустите приложения
- Запустите сервер Eureka, если он еще не запущен.
- Запустите ProductService, запустив его проект.
- Запустите OrderService, запустив его проект.
Шаг 5. Проверка службы обнаружения
- Получите доступ к панели инструментов сервера Eureka в своем браузере (http://localhost:8761).
- Убедитесь, что и 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-адресов или явных конфигураций.