#java #oop #design-patterns #spring-kafka #design-principles
#java #ооп #шаблоны проектирования #spring-kafka #принципы проектирования
Вопрос:
Я пытаюсь внедрить в наш проект apache Kafka и изменить архитектуру проектов на producer-consumer. Я экспериментирую над новым тестовым проектом. Например, у меня есть один производитель и два потребителя. Это разные приложения с весенней загрузкой (микросервисы).
В службе producer мне нужно настроить Kafka, создать KafkaTemplate
. В каждом потребителе мне нужно настроить Kafka и создать обработчики (методы с @KafkaListener
аннотацией).
Например, завтра мы захотим заменить Kafka на что-то другое, мы изменим KafkaTemplate
методы and с @KafkaListener
аннотацией на реализацию новой библиотеки. Это не очень хороший подход. Итак, я считаю, что нам нужно создать нашу оболочку. Что-то вроде этого:
public interface EventBus {
void sendMessage(String topicName, String message);
}
И инкапсулируйте KafkaTemplate в реализацию этого интерфейса ( KafkaEventBus implements EventBus
)
Я начинаю это реализовывать, но столкнулся с тем, что не понимаю, как это сделать. Я создаю модуль Gradle с именем ‘event-bus’. Этот модуль не spring — просто Java-модуль. Я создаю EventBus
интерфейс и внедряю его:
public class KafkaEventBus implements EventBus {
private final KafkaProducer<String, String> kafkaProducer;
public KafkaEventBus() {
this.kafkaProducer = new KafkaProducer<>(producerConfig());
}
@Override
public void sendMessage(String topicName, String message) {
kafkaProducer.send(new ProducerRecord<>(topicName,message));
}
private Map<String, Object> producerConfig() {
Map<String, Object> configProps = new HashMap<>();
configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
return configProps;
}
}
И застрял. У меня есть вопросы:
1) Нужно ли мне создавать другой модуль (event-bus)? Правильно ли я думаю?
2) Как можно реализовать обработку сообщений в этом модуле? Если отправка чего-либо понятна (инкапсулировать KafkaTemplate
и делегировать ему сообщение), то с обработкой ничего не понятно ничего не ясно.
Может быть, есть какие-нибудь примеры этого, лучшие практики?