← Назад к вопросам
Какие операции чтения микросервиса использовались на последней работе
1.7 Middle🔥 251 комментариев
#REST API и микросервисы
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Операции чтения в микросервисах
На последней работе я работал с микросервисной архитектурой, где использовались различные паттерны чтения данных.
REST API вызовы между сервисами
Основной способ получения информации из других микросервисов:
@Service
public class OrderService {
private final WebClient webClient;
public Mono<Order> getOrderWithDetails(Long orderId) {
return webClient.get()
.uri("/api/v1/orders/" + orderId)
.retrieve()
.bodyToMono(Order.class);
}
}
Кэширование результатов
Часто используемые данные кэшировались в Redis:
@Service
public class ProductService {
@Cacheable(value = "products", key = "#id")
public Product getProduct(Long id) {
return productRepository.findById(id).orElse(null);
}
}
Event-driven чтение через Message Queue
Для асинхронной синхронизации использовали RabbitMQ:
@Service
public class OrderEventListener {
@RabbitListener(queues = "order-created")
public void handleOrderCreated(OrderEvent event) {
orderRepository.save(event.toOrder());
}
}
Read Replicas для масштабирования
Для операций чтения использовали отдельные реплики БД:
@Service
public class ReportService {
@Qualifier("replicaDataSource")
private final DataSource readDataSource;
public List<Report> getReports() {
return reportRepository.findAll(); // из replica
}
}
GraphQL для гибких запросов
Для сложных операций чтения использовали GraphQL:
query {
user(id: 1) {
id
name
orders {
id
total
}
}
}
Это позволяло клиентам запрашивать только нужные данные.
Пакетное чтение (Batch Operations)
Для оптимизации N+1 проблемы:
public List<User> getUsersWithOrders(List<Long> userIds) {
return userRepository.findByIdInWithOrders(userIds);
}
Circuit Breaker паттерн
Для надёжности при чтении из других сервисов:
@CircuitBreaker(name = "recommendation-service", fallbackMethod = "fallback")
public Mono<List<Product>> getRecommendations(Long userId) {
return webClient.get()
.uri("/api/v1/recommendations/" + userId)
.retrieve()
.bodyToFlux(Product.class)
.collectList();
}
Elasticsearch для полнотекстового поиска
Для быстрого поиска:
public List<Product> searchProducts(String query) {
return elasticsearchRepository.search(query).getContent();
}
Результаты
Эти техники позволили нам добиться:
- Низких лейтенсей (< 100ms)
- Высокой пропускной способности (> 10k req/s)
- Отказоустойчивости при сбое других сервисов
- Снижения нагрузки на основную БД
Критично было мониторить эти операции и использовать правильные паттерны для каждого сценария.