WeatherBot — это Telegram-бот, который получает от пользователя геолокацию и возвращает прогноз погоды, используя API Open-Meteo. Архитектура разделена на два микросервиса: TgBot (интерфейс с Telegram) и BackEnd (обработка данных и взаимодействие с внешним API). Обмен сообщениями между сервисами осуществляется через Apache Kafka.
[Telegram User] ⇄ [TgBot Service] ⇄ Kafka ⇄ [BackEnd Service] ⇄ Open-Meteo API
Важно: Поддерживаются как асинхронные запросы (через Kafka) — подходящие для масштабируемых и надёжных интеграций, так и синхронные HTTP-запросы к BackEnd (REST API) для случаев, когда нужен немедленный ответ. TgBot умеет работать с обоими режимами: в асинхронном режиме он шлёт
WeatherRequestв Kafka и ждёт ответа изweather-response; в синхронном — может напрямую вызыватьBackEndпо HTTP (/api/weather?latitude=...&longitude=...).
- Получает сообщения и геолокацию от пользователей.
- Отправляет запросы в Kafka-топик
weather-requests. - Принимает ответы из Kafka-топика
weather-response. - Отправляет прогноз пользователю в Telegram.
Основные классы:
WeatherBotGate— реализация TelegramLongPollingBot.WeatherProducer— отправка сообщений в Kafka.WeatherConsumer— получение прогнозов из Kafka.
- Получает запросы из Kafka (
weather-requests). - Делает запрос к внешнему API Open-Meteo.
- Формирует ответ
WeatherResponseи отправляет в Kafka (weather-responses). - Сохраняет историю запросов в PostgreSQL.
Основные классы:
WeatherConsumer— слушает Kafka и вызываетCbrClient.CbrClient— выполняет HTTP-запрос к Open-Meteo API.WeatherParser— парсит JSON-ответ.WeatherRepository— JPA-репозиторий для хранения данных.
В проекте используется docker-compose.yaml, который поднимает:
- Два контейнера PostgreSQL (для TgBot и BackEnd);
- Kafka и Zookeeper.
Запуск:
docker-compose up -dПорты по умолчанию:
- PostgreSQL TgBot —
5434 - PostgreSQL BackEnd —
5433 - Kafka —
9092
-
Убедитесь, что установлен Docker и Java 17+.
-
Запустите инфраструктуру:
docker-compose up -d
-
Запустите оба микросервиса:
# TgBot cd TgBot ./mvnw spring-boot:run # BackEnd cd BackEnd ./mvnw spring-boot:run
-
В Telegram найдите бота и отправьте команду:
/start -
Отправьте свою геолокацию и получите прогноз погоды.
В файлах application.yaml можно задать настройки:
TgBot:
bot:
name: "WeatherBot"
token: "<ВАШ_TELEGRAM_BOT_TOKEN>"BackEnd:
weather:
url: "https://api.open-meteo.com/v1/forecast"- Java 17
- Spring Boot 3
- Kafka (Confluent)
- PostgreSQL
- OkHttp — HTTP-клиент для API-запросов
- Jackson — парсинг JSON
- Lombok — генерация boilerplate-кода
- Пользователь отправляет боту свою геолокацию.
- TgBot отправляет объект
WeatherRequestв Kafka. - BackEnd получает запрос, обращается к API, формирует
WeatherResponse. - TgBot получает ответ из Kafka и отправляет сообщение пользователю:
☀️ Sunny weather
Temperature: +18.4°C