Sobes.tech
Назад к вопросам
Senior
7

Как бы ты реализовал распространение бизнесовых заголовков (x-session-id, x-client-id) по всей системе микросервисов через REST и Kafka?

Компании, где спрашивали
СБК ПАРУС

Ответ от нейросети

sobes.tech AI

Для распространения бизнесовых заголовков (например, x-session-id, x-client-id) по системе микросервисов через REST и Kafka можно использовать следующий подход:

  1. REST:
  • На входе каждого микросервиса (например, в фильтрах или middleware) извлекать нужные заголовки из HTTP-запроса.
  • Сохранять их в контекст (например, ThreadLocal или специализированный контекст запроса).
  • При вызове downstream-сервисов через REST добавлять эти заголовки в исходящие HTTP-запросы.
  1. Kafka:
  • При публикации сообщений в Kafka включать эти заголовки в метаданные сообщения (например, в headers Kafka ProducerRecord).
  • При потреблении сообщений извлекать заголовки из Kafka headers и помещать в контекст обработки.
  • При необходимости передавать их дальше в другие сообщения или REST-вызовы.
  1. Реализация в Java:
  • Использовать interceptor или filter для REST (например, Spring HandlerInterceptor или OncePerRequestFilter), чтобы автоматически обрабатывать заголовки.
  • Для Kafka использовать ProducerInterceptor и ConsumerInterceptor или обертки над продюсером и консьюмером для управления заголовками.

Пример для REST (Spring):

public class BusinessHeadersInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String sessionId = request.getHeader("x-session-id");
        String clientId = request.getHeader("x-client-id");
        BusinessContext.setSessionId(sessionId);
        BusinessContext.setClientId(clientId);
        return true;
    }
}

// При вызове downstream
HttpHeaders headers = new HttpHeaders();
headers.add("x-session-id", BusinessContext.getSessionId());
headers.add("x-client-id", BusinessContext.getClientId());
// ... использовать headers в RestTemplate или WebClient

Пример для Kafka:

ProducerRecord<String, String> record = new ProducerRecord<>(topic, key, value);
record.headers().add("x-session-id", BusinessContext.getSessionId().getBytes(StandardCharsets.UTF_8));
record.headers().add("x-client-id", BusinessContext.getClientId().getBytes(StandardCharsets.UTF_8));
producer.send(record);

Таким образом, бизнесовые заголовки проходят через всю цепочку вызовов и сообщений, обеспечивая трассировку и контекст.