Микросервисы на 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 — просто