Микросервисы на C#: с чего начать в 2025 году

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Микросервисы на C#: с чего начать новичку в 2025 году

Раньше казалось, что микросервисы — это удел гигантов вроде Netflix или Amazon. Но времена изменились. Сегодня микросервисная архитектура на C# доступна каждому разработчику, кто хочет строить гибкие, масштабируемые и поддерживаемые системы. Если вы чувствуете, что монолит «душит» ваш проект, или просто хотите освоить востребованный навык — вы попали по адресу.

В этой статье мы разберём: с чего начать, какие технологии выбрать, и напишем два реальных микросервиса на C# с нуля. Без воды, только практика.

Почему C# — отличный выбор для микросервисов

C# и экосистема .NET — это не просто язык, это полноценный фреймворк для построения распределённых систем. Вот почему многие выбирают микросервисы на C#:

  • ASP.NET Core — лёгкий, кроссплатформенный и производительный. Работает на Windows, Linux, macOS.
  • Встроенная поддержка Docker — Visual Studio умеет добавлять Docker-поддержку в проект двумя кликами.
  • gRPC и SignalR — готовые решения для межсервисного взаимодействия и real-time коммуникаций.
  • Entity Framework Core — удобный ORM, который легко настраивается под микросервисную базу данных.
  • Большое сообщество — на Stack Overflow и GitHub тысячи готовых решений.

Кстати, если вы только начинаете погружение в C#, советую заглянуть в раздел базовых статей на PythonLib — там есть много полезного для старта.

С чего начать: структура проекта

Ошибка новичка — сразу кидаться писать код, не продумав архитектуру. Давайте сделаем правильно. Для начала создадим два микросервиса:

  • UserService — отвечает за пользователей (регистрация, профиль).
  • OrderService — отвечает за заказы.

Каждый сервис будет иметь свою базу данных (SQLite для простоты) и общаться через REST API. Для начала этого достаточно.

Шаг 1. Создаём проект UserService

Откройте терминал или Visual Studio и выполните:

dotnet new webapi -n UserService
cd UserService
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Design

Структура проекта будет выглядеть так:

UserService/
├── Controllers/
│   └── UsersController.cs
├── Models/
│   └── User.cs
├── Data/
│   └── AppDbContext.cs
├── Program.cs
└── appsettings.json

Шаг 2. Модель и контекст данных

Создаём модель пользователя:

// Models/User.cs
public class User
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public string Email { get; set; } = string.Empty;
    public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}

И контекст базы данных:

// Data/AppDbContext.cs
using Microsoft.EntityFrameworkCore;

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
    public DbSet<User> Users { get; set; }
}

Настраиваем подключение в appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=users.db"
  },
  "Logging": {
    "LogLevel": { "Default": "Information" }
  }
}

Регистрируем сервисы в Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlite(builder.Configuration.GetConnectionString("DefaultConnection")));

builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Автоматическая миграция при старте
using (var scope = app.Services.CreateScope())
{
    var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
    db.Database.EnsureCreated();
}

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.MapControllers();
app.Run();

Шаг 3. Контроллер для работы с пользователями

Теперь создадим простой REST API для UserService:

// Controllers/UsersController.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    private readonly AppDbContext _context;

    public UsersController(AppDbContext context)
    {
        _context = context;
    }

    [HttpGet]
    public async Task<ActionResult<IEnumerable<User>>> GetUsers()
    {
        return await _context.Users.ToListAsync();
    }

    [HttpGet("{id}")]
    public async Task<ActionResult<User>> GetUser(int id)
    {
        var user = await _context.Users.FindAsync(id);
        if (user == null) return NotFound();
        return user;
    }

    [HttpPost]
    public async Task<ActionResult<User>> CreateUser(User user)
    {
        _context.Users.Add(user);
        await _context.SaveChangesAsync();
        return CreatedAtAction(nameof(GetUser), new { id = user.Id }, user);
    }
}

Всё. Первый микросервис готов. Запустите его командой dotnet run и откройте Swagger (обычно https://localhost:5001/swagger).

Создаём OrderService

По аналогии создаём второй проект. Только теперь модель заказа:

// Models/Order.cs
public class Order
{
    public int Id { get; set; }
    public int UserId { get; set; } // ссылка на UserService
    public string ProductName { get; set; } = string.Empty;
    public decimal Price { get; set; }
    public DateTime OrderDate { get; set; } = DateTime.UtcNow;
}

И контроллер с двумя эндпоинтами:

[ApiController]
[Route("api/[controller]")]
public class OrdersController : ControllerBase
{
    private readonly AppDbContext _context;

    public OrdersController(AppDbContext context) => _context = context;

    [HttpGet]
    public async Task<ActionResult<IEnumerable<Order>>> GetOrders() =>
        await _context.Orders.ToListAsync();

    [HttpPost]
    public async Task<ActionResult<Order>> CreateOrder(Order order)
    {
        _context.Orders.Add(order);
        await _context.SaveChangesAsync();
        return CreatedAtAction(nameof(GetOrders), new { id = order.Id }, order);
    }
}

Теперь у нас есть два независимых сервиса. Каждый работает на своём порту (5001 и 5002). Это и есть минимальная микросервисная архитектура на C#.

Как заставить сервисы общаться?

В реальных проектах сервисы общаются между собой. Самые популярные способы:

  • HTTP/REST — просто

Блоги

Рекомендаций по книгам