📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Пишем Микросервисы на Python + Брокер RabbitMQ

Артём Шумейко25:13

Transcription

В этом видео вы познакомитесь с микросервисами на практике. Мы вместе с вами создадим полноценную микросервисную архитектуру из двух микросервисов и брокера сообщений. Всё это дело напишем, всё это свяжем, протестируем, и вы увидите, как происходит взаимодействие в микросервисах.

Друзья, всем привет. Меня зовут Артём. Я Python Backкэнд разработчик. И на этом канале помогаю вам прокачивать харскилы и развивать карьеру. Если вам нравятся подобные практические уроки, обязательно поддержите их лайком и подпиской на канал. Буду благодарен. Ну что, поехали.

Итак, в первую очередь давайте посмотрим на схему наших сервисов. Это будет сервис уведомлений. Например, у нас есть пользователь, который стучится в нашу опишку. Это может быть фронтендер, это может быть другой разработчик и получает какой-то ответ. Но помимо того, что пользователь получил ответ, мы направили какое-то сообщение в другой микросервис, чтобы этому пользователю пришло уведомление в Телеграме, как это всё происходит.

Пользователь, например, на сайте сделал какое-то действие, не знаю, создал заказ. Мы приняли его через какой-либо фреймворк. Это Fastp, это Jango, это Lightstar, если мы говорим про Python. Далее мы должны каким-то образом передать сообщение Telegram а через брокер сообщений. Мы не можем напрямую постучаться в Telegram бата. Ну, на самом деле, мы можем сделать это через обычный HTTP запрос, но это ненадёжно.

В видео по плюсам и минусам микросервисов я уже разбирал, в чём, собственно, плюсы микросервисов, в чём плюсы брокеров сообщений. Даже про брокеров есть отдельное видео. Поэтому чаще всего, просто имейте в виду, в микросервисной архитектуре используются брокеры сообщений. Либо, конечно, есть использование JRPC, чаще всего в GoН разработке. Сейчас говорим про Python и про актуальные программы, которые пишутся прямо сейчас. У нас всё-таки не так распространён JRPC пока что в Python. Используем брокеров сообщений.

Так вот, сообщение помещается в брокер. Брокер - это некоторая временная база данных. Один из самых популярных - это Rabbit MQ. Ещё есть Кавка и менее популярный наs. Он используется не так часто. Мы будем использовать Rabit MQ. Его легко развернуть, легко с ним работать. И, в принципе, для старта в брокер сообщений в стриминговые платформы типа Кавка Rabit я считаю самым простым.

Так вот, чтобы отправить сообщение из нашей опишки в брокер сообщений, мы будем использовать некоторую библиотеку. Мы не хотим с нуля сами писать интеграцию. И мы будем использовать библиотеку Faststream. Она отправит сообщение в брокер. Затем Telegramбот через тот же Fastстstст прочитает это сообщение из брокера тут же, буквально там за миллисекунду. И используя фреймворкAM для написания Telegram ботов асинхронно, мы отправим пользователю, наконец-таки сообщение, что у него был создан заказ.

Вот такая нехитрая схема. Может показаться, что это сложно, но сейчас мы начнём писать, вы увидите, что суммарно у нас будет где-то 60 строчек кода. То есть вообще не страшно. И вы сможете повторить, сделать точно такой же микросервис или добавить ещё один микросервис в эту цепочку. В общем, сможете реально потрогать микросервисы на практике.

Что вы сегодня научитесь делать? Что мы сделаем вместе с вами? Мы поднимем кролика или rabbit MQ в докере, напишем простенький API, научимся отправлять сообщения в брокер, затем напишем Telegram бата и научимся получать сообщения из брокера сообщений. Ну и, конечно, отправлять их пользователям. Для этого всё и задумано.

На самом деле нотификации - это очень частые проекты, ну, продукты в внутри каждой компании. Обычно это внутренний проект, в котором не так много пользователей. Я лично писал сервис нотификации в одной из компаний, и ты общаешься в основном с другими бэкэнд-разработчиками. То есть ты разрабатываешь какого-то, например, там бота и общаешься с ребятами, у кого написано для приёма платежей, AP для там создания заказов, AP для, не знаю, прохождения каких-то уроков, модулей курсов на сайте. В общем, работаешь именно с разработчиками.

Ну что, друзья, давайте напишем полноценную систему, пора уже приступать. И первое, что мы с вами сделаем - это развернём биit MQ в докер контейнере. Как это делается? Мы берём уже написанную кем-то команду. А на самом деле вам не нужно знать и учить, как пишется эта команда. Вы просто её вставляете, и вы сможете работать с Rabit MQ на текущем этапе. Пока не так важно, что конкретно разворачивается, на каких портах и так далее. Мы просто учим микросервисы, самые основы, самую базу. Давайте нажмём Enter. И у нас должно запуститься по сути два приложения. Одно порту 5672 - это сам Rabbit MQ. А вот если зайти на порт 15672, по этому адресу у нас откроется менеджерская панель Rabbit MQ. В неё можно войти, если ввести. Нажимаем логин, и мы в сети. У нас здесь есть некоторые вкладочки. Нас они пока не очень интересуют. Мы Rabit отдельно разбирали в отдельном видео. Обязательно его посмотрите. Сегодня будем им пользоваться просто как а каким-то чёрным ящиком условно. На самом деле будет всё очень-очень просто. О'кей, бит развернули, всё хорошо работает.

И давайте приступим к написанию сначала опишки, чтобы можно было принимать запросы, например, на создание заказа. Давайте создадим новый Python проект. В первую очередь здесь давайте создадим новый интерпретатор. Создадим обычный Virtual Enf environment, то есть среду Virtual Enf. Можно создавать poetry, можно использовать UV. Опять же в этом видео упор делается не на какую-то архитектуру, не на использование всех самых современных инструментов, а на то, как взаимодействуют микросервисы. Создали. Отлично. У нас в терминале, скорее всего, она уже активирована, да? И давайте создадим наш файлик main.py. У нас всё будет в одном файле. Будет буквально 30 строчек.

Давайте установим библиотеки. Нам нужен в первую очередь fast. Нам нужен UVCorn - это веб-сервер, чтобы можно было запустить фаи. По фастапе, кстати, есть отдельный курс на канале. И нам нужен Fastстam. Очень классная, очень перспективная библиотека для удобной работы с брокерами сообщений, с кавкой, с ребитом, с наS. В едином интерфейсе всё это можно делать. Если раньше мы работали с этими брокерами и стриминговыми платформами через всякие отдельные библиотеки, типа IO Кавка, Ао пика для Ребита, сейчас всё это есть в единой библиотеке, в едином интерфейсе, и вам не нужно париться. Плюс есть интеграция с Фастапи, которой мы сегодня с вами воспользуемся. По фастриму, скорее всего, будет отдельное видео. Если вам действительно нравится эта библиотека или вы слышали, хотите узнать поподробнее, поставьте много лайков, много комментариев. Я обязательно запишу разбор. Отлично, всё установилось.

И теперь давайте создадим простейшее приложение. Нам нужен Fastpлас Fastпи. Нам нужно из Fastстstam Rabbit фаast импортировать Rabbit, простите, Rabbit roутер. В фастапе мы всегда используем какой-то роутер и там пишем там post getзапросы. Да, простите, забыл, забыл его объявить. Роутер равно rabbit router. А в данном случае мы используем некоторую обвязку. библиотеки Faststream, которая под капотом на самом деле использует тот же роутер, который есть в фастапе. То есть он его не сильно видоизменяет. То есть под капотом всё работает точно так же. Никаких проблем быть не должно.

Давайте здесь, например, сделаем какой-то заказ. Условно добавляется order. У нас, конечно же, асинхронная функция. FastстAM тоже асинхронный. И давайте make order назовём функцию. Здесь будет, например, название какого-то товара. И что мы с вами делаем? Самая интересная часть. Мы хотим после того, как мы приняли от пользователя какие-то данные, отправить их в брокера сообщений, чтобы они там находились. И и затем сервис, который отвечает за отправку сообщений в Telegram, мог их считать и отправить, соответственно, уже нашему пользователю.

Что мы делаем? Ну, перед тем, как мы ответим, что, например, там всё хорошо, там дата о'кей, да, что заказ создан, мы хотим отправить в Rabbit сообщение. Как это делается? Ну, мы пишем, конечно же, a, потому что у нас асинхронное взаимодействие. Мы из роутера берём сущность брокеer. Брокер можно создать отдельно. Опять же, мы не будем сильно погружаться в фастAM, но вот таким образом мы его берём и хотим просто опубликовать сообщение, да, отправить его. Что нам нужно? Две вещи. Первое, само сообщение. Второе, очередь, куда оно отправится. Само сообщение пускай будет такое. А, новый заказ. Новый заказ и двоеточие, пускай будет имя нашего товара. И мы также укажем очередь. Пускай будет очередь заказы. Почему бы и нет?

Далее, обязательно, чтобы у нас было фастапе приложение, чтобы это была опишка, нам нужно создать наше фастапе приложение. Это можно было сделать, конечно, и раньше. В идеале, конечно, где-то здесь это сделать. И нам нужно добавить к нашему приложению постапе роутер, чтобы все энпоинты, в данном случае только один endpint был учтён. В целом это всё, это всё предложение, его уже можно запускать, да, всего 19 строчек.

Вы спросите, почему здесь нету указания каста, парта, логина, пароля, всё, всей необходимый вещи, когда мы подключаемся к брокеру или там или бак базе данных, к чему угодно. На самом деле здесь они по дефолту все заданы, и у нас, так как мы не указывали какие-то специфичный логин и пароль, у нас всё развёрнуто локально, всё работает отлично. Не нужно даже указывать эти настройки. Но если прямо очень хочется, то их можно здесь указать, и ничего не изменится. Ну, давайте пускай так и оставим. Нет, не будем. Но давайте уберём, чтобы было максимально всё просто, чтобы ничего не отвлекало глаз.

Итак, давайте запустим нашу апишку. Это делается через UVCorn main 2точи up и на всякий случай reload. Запускаем. Нам пишет, что у нас нет библиотеки Faststстam. Давайте её ещё раз установим. Мне казалось, мы её устанавливали и забыл. Там нужно ещё указать биit, да, потому что мы хотим ещё интеграцию с Рбитом. После установки библиотек давайте заново запустим наш UVCorn с флагом Reload. И всё замечательно запустилось.

Перейдём, зайдём в документацию. И у нас есть одна единственная ручка. Есть ещё ручки, которые добавил Fastстstam. Нам они сейчас не очень интересны. У нас есть заказ, мы можем сюда отправить, например, там какой-нибудь банан Execute. Мы как пользователь получаем ответ. И в это же время отправляется сообщение в брокера. Можно посмотреть, здесь должна быть некоторая активность. Да, вот она. Мы отправили сообщение. Можем отправить там, не знаю, 10 сообщений и увидим, что у нас здесь будет гораздо больше активности. Ну, просто чтобы смотреть, что всё работает, да. Опять же, э, панель для того, чтобы можно было мониторить, что происходит в нашем брокере сообщений, в наших очередях.

Теперь самое интересное. Нам нужно написать простенького Telegram-бота, который будет забирать, считывать эти сообщения и отправлять пользователю.

Друзья, перед тем, как перейти к написанию Telegram бота, у меня для вас важная информация. Если вы разрабатываете на Python, если вы уже разбираетесь хорошо в асинхронности ООП, понимаете, как работают базы данных, возможно, даже занимаетесь- разработкой, но у вас есть некоторая неуверенность в ваших знаниях, вы не чувствуете, что выстong midle или strong june, смотря на какой вы позиции, и вы не понимаете, как перейти дальше по технической лестнице, как вырасти в понимании систем дизайна, архитектуры, паттернов, тестирования, CICD, всех тех тем, которые реально применяются каждый день на работе, которые спрашиваются на собеседовании. Каждую из этих тем нужно хотя бы немножко пощупать, потрогать, в идеале решить несколько практических заданий. Ровно всё это есть на моём практическом курсе по бэкэнд-разработке. Это не только 35 часов суперкачественного видеоматериала, ещё более качественного, чем на Ютубе, чем вы видите в каждом видео. Это огромное количество практических заданий. Это написание личного проекта. Это может быть микросервисная архитектура, может быть монолитная архитектура. любой фреймворк и технологии на ваш выбор под важно руководством Sеньenor Python разработчика, который с вами сначала всё это дело обсудит, какая архитектура, какие паттерны, какие технологии, какие подходы, а после завершения вами проекта сделает полноценный кодрев, скажет, где у вас слабые места, где что можно исправить, где что можно дополнить, и даст полноценный фидбэк. Так что вы сможете понять, чего вы условно стоите, какой у вас сейчас грейд, какие компетенции. Может быть, вы уже давно заслуживаете переход на новый технический грейд или на новый уровень зарплаты, но сомневаетесь, что сможете туда перейти. Друзья, огромный наплыв мотивации, энергии и уверенности я даю на этом курсе. Я максимально вложил всю энергию, все силы в его создание. Я уверен, он вам понравится. Обязательно переходите по ссылочке внизу на мой сайт, записывайтесь на бесплатную консультацию, вам всё расскажут, покажут, объяснят, и вы сможете принять осознанное решение. Так что, друзья, прокачивайтесь в эээнд разработке, а мы возвращаемся к видео.

Для того, чтобы написать Telegram бота, мы воспользуемся самой популярной библиотекой Аограм. Хоть её документация недоступна в России, всё равно все пользуются именно этой библиотекой. И мы возьмём супербазовый пример, который здесь написан, и даже его ещё чуть больше упростим. Давайте откроем новый проект. Так, как будто бы мы с вами как разработчики работаем в другом репозитории, в другом GitHub или Gitlab репозитории, потому что обычно микросервис хранятся в разных репозиториях, ими заведуют разные команды, чаще всего, если это какая-то большая компания и большие микросервисы. Был, конечно, у меня опыт, когда я работал сразу над тремя микросервисами. Все они были под моей ответственностью. Все они были не супер какие-то большие, может быть, там на несколько тысяч строк, но бывает такое, что вы один разрабатываете микросервис.

Давайте здесь тоже создадим виртуальное окружение. Добавим интерпретатор локальный virtuual. Окей. И нам нужно установить здесь аogram и, конечно, fastст stream с rбиit интеграцией. Возможно, нам нужны кавычки, возможно, не нужны кавычки. Попробуйте и то, и то. Возможно, у вас сработает без кавычек. И нам нужен, конечно, файл main Pie, куда мы вставим весь этот примерчик и капитально с ним поработаем. Во-первых, уберём все комментарии, уберём вот эту историю, уберём вот эту историю и оставим только самое-самое базовое. Вот это уберём и, пожалуй, вот так сделаем. Всё, отформатируем. И всё, у нас 26 строчек, чтобы у нас был рабочий Telegramбот. А что самое важное? Telegramбот пока что не умеет отправлять сообщения и не умеет считывать их из брокера.

Итак, нам осталось подключить брокера сообщений. Делается это довольно просто. Давайте удалим лишний импорт. Мы импортируем из fast stream брокеer импортируем rit. Так, простите, да, из ребита импортируем rabbit брокеer и просто его объявляем где-нибудь вот здесь. брокеer равно Rabit Broker. Опять же, здесь можно указать строку подключения, но она уже указана по дефолту, поэтому мы не будем её менять.

Что мы хотим сделать? Мы хотим подписаться на входящий поток сообщений в Rabbit MQ из очереди, которая называется Orders. Мы хотим именно её слушать, никакие другие очереди. Broker тоsubscriber. И указываем здесь название очереди orders, то есть заказы. Дальше пишем асинхронную функцию, называем её как угодно, например, handle orders, да, обработать ордеры и отправить сообщение. Ну, уже видно, что функция делает слишком много, поэтому лучше её разделить на две функции, конечно, но, допустим, так. То есть здесь мы получим некоторые данные. Данные мы получим, на самом деле, в формате строки. То есть понятное дело, что в Rabit MQ мы не отправляем Python словарики или массивы, мы отправляем строку и получаем строку. И учитывая, что сейчас мы с вами не работаем с массивами, с джейсонами, мы просто отправили текст, что там создан новый заказ, нам достаточно будет не переводить в джейсоны обратно, просто отправим те же самые данные пользователю.

Как это сделать? Мы пишем ait bot.send message. А, кстати, да, бота давайте зададим чуть выше вот здесь, чтобы можно было его использовать. И настроечку с HTML можно пока убрать. У нас нет никакого форматирования. Вот send message нам нужно здесь два параметра. Первое - это чат ID. Кому отправлять, сейчас разберёмся. И второе - это текст. Текст у нас уже есть, да? Это вот у нас это будет новый заказ и название самого предмета.

Откуда раздобыть свой чат ID вообще? Где у нас бот? Давайте его создадим. Давайте зайдём в ботфа и создадим нового бота. Давайте вот так зайдём. Нажимаем здесь старт. А, new bot. Какое-нибудь имя, тестбот. Абсолютно не важно. Рандомное название для бота. Опа, кто-то уже такое создал. Ладно, нам дают токен. Отлично. Давайте его сюда вставим. Понятное дело, что в идеале использовать переменное окружение, не прописывать ни в коем случае никогда вот так токены. Просто напоминаю, если вдруг вы не знали, опять же, это учебное видео, и нет смысла, у меня нет цели сделать идеально всё правильно. Есть смысл показать, как работают микросервисы, так, чтобы это там уложилось буквально в полчаса.

Так вот, у нас есть бот. Давайте в него зайдём, нажмём старт. Здесь, понятное дело, пока ничего нету. И что мы можем сделать? Как можно узнать чат ID? Как можно узнать наш ID в Телеграме? На самом деле можно здесь написать очень простенькую функцию из IOAM DP message. А, ну, допустим, там handle message. Мы получаем объект сообщения. И можно, так, простите, def, можно отправить сообщение answer. Да, можно ответить на это сообщение. Давайте типизацию пропишу, потому что без типизации будет вообще ужасно. types import message и можно ответить. И нам здесь нужен просто текст и можно отправить message chat idat ID. И вот такая история. Всё, давайте запустим нашего бота. Пока он не будет использовать брокера, пока нам просто хочется узнать наш чат ID. Давайте Python Main Pay. Запускаем. У нас запускается асинхронный, точнее событийный цикл через ASIN Run. И давайте просто напишем что-нибудь, что угодно. Да, вот наш чат ID. Спасибо. Теперь можно вставить его вот сюда, чтобы сообщения отправлялись именно нам.

Здесь опять же важно подметить, что это упрощённый пример, и мы не используем базы данных. Если мы говорим про микросервисы, то чаще всего, там в 80-90% случаев под каждый микросервис будет своя база данных. И этот чат ID мы бы взяли из нашей базы данных. И какие-то дополнительные данные мы бы отправили тоже здесь из базы данных заказов. Мы это не делаем. У нас сейчас цель познакомиться именно с тем, как работают микросервис, как сообщения переходят из одного сервиса в другой через брокер и через сторонние библиотеки, в нашем случае fastстрим, который и отправляет сообщение, и считывает его из очереди.

Отлично. Это наш чат ID, это наше сообщение. Эту историю можно удалить. Я для вас её, конечно, оставлю. И что нам не хватает? У нас сейчас ещё не работает брокер. То есть, да, мы объявили, да, мы вроде как подписались, но он ещё не будет работать. Что для этого нужно сделать? Для этого нужно в функции main открыть асинхронный контекстный менеджер Assin with Broker. В этом случае он самостоятельно, а, нет, простите, не стартует. Его нужно стартовать через брокер. Старт. Да, после этого он стартует. Можно здесь добавить какой-нибудь лог. Давайте сделаем, а логин. Пускай инфо нет, вот вот так. И напишем, что брокер стартовал. И здесь в конце напишем после контекстого менеджера, когда у нас брокер уже закроется подключение, мы напишем, что всё закончилось. Плаки, плаки. О'кей, давайте перезагрузим нашего бота. Python main Pie. И наш бот стартовал. Отлично. Пока что у нас никаких сообщений нету.

Давайте попробуем теперь, наконец-то, всю эту схему использовать. То есть мы пользователь, который пользуется вот этим сайтиком. Пускай это будет какой-то фронт, какое-то мобильное приложение, ну, просто чтобы представить, что это какое-то приложение полноценное, а не просто документация Свагер. Оно сейчас примется в Фастапе. Давайте посмотрим ещё раз. постапе примет запрос, отправит в брокера сообщений, что создан новый заказ, а пользователю ответит, что всё хорошо. В это время брокер сообщений получит сообщение и будет временно его у себя держать, пока его никто не считает. Да, и мы здесь увидим некоторую активность, что сообщение было отправлено. Его буквально через несколько миллисекунд считает наш сервис, который отвечает за Telegram бата, потому что там тоже есть стстрим, и он подключён через broker.subscber. Вот эту историю, которую мы с вами написали, он получает абсолютно все сообщения из очереди Orders. И здесь мы ещё раз увидим активность, но уже не то, что у нас кто-то опубликовал сообщение, а что кто-то его забрал, кто-то его прочитал. И после этого оно отправится пользователю уже в Телеграме.

Давайте всё это дело посмотрим. Сейчас я хочу отправить, например, банан и посмотреть, что будет в Телеграме. Новый заказ банан. То есть я даже не успел зайти в Telegram, но уже отправилось, потому что всё настолько быстро происходит, всё на локал хосте, всё локально. Я думаю, вы у вас также будет всё быстро работать. Давайте какой-нибудь ещё заказик. Гайка, болтик, а и квартира. Несколько заказов. И все эти сообщения приходят сюда в Telegram. Давайте даже для красоты. для того, чтобы всё идеально было видно. Бам! Смотрите, справа появляются новые сообщения. Ну да, действительно, они приходят не мгновенно, потому что есть некоторая задержка в том, как быстро Telegram отправляет сообщение, пока до опишки Телеграма летит запрос через аграam, пока он отправит сообщение. В общем, вы понимаете, задержка есть, но вот так всё выстроено.

И, конечно, было бы очень интересно мне, не знаю, как вам, напишите в комментариях, расширить эту систему, чтобы здесь был не только Telegramбот, чтобы здесь был ещё сервис, который рассылает имейлы, чтобы сервис, который рассылает не только в телегу уведомления, а, например, в ВК. В ВК тоже есть боты, там тоже можно отправлять сообщения, например, по номеру телефона. Это очень круто. И вообще эсэмэски можно отправлять. Можно, чтобы в этот брокер летели сообщения не только с этой опишки, ещё и с других опишек, да, как будто другие команды отправляют какие-то запросы. Например, новый заказ создан или, например, у нас там на сайте появился новый какой-то раздел или там информация по вашему возврату, по вашему заказу. Это всё разные микросервисы. Там вот поставили лайк вашему отзыву. Вот я делал ровно такой сервиснетификации, когда там кто-то кому-то ответил в комментариях, кто-то кому-то поставил лайк, и я всё это отправлял человеку либо в Telegram, либо в email, либо в браузер, смотря, как человек всё это настраивал у себя в личном кабинете. То есть это очень сложная система. Мы посмотрели буквально её кусочек, буквально 5% от того, как это реально выглядит и насколько много кода на фронте, на БКИ, в микросервисах используется, насколько много там логирования, насколько много там обработки ошибок, насколько много тестов написано. Всё это, друзья, нужно знать и уметь, чтобы писать классные нагруженные ээнд-сервисы.

Ещё раз напомню, что всё это можно освоить на моём практическом курсе покend разработке. Если вы уже знаете Python, знаете какие-то азы разработки, может даже уже работаете, но чувствуете неуверенность, это то место, где вы обретёте её. И многие ребята отмечают, что после прохождения курса они стали гораздо быстрее решать рабочие задачки. Ну и кто-то, конечно, смог либо повыситься в грейде, либо повысить зарплату, либо перейти на новое место и уже на middle позицию или midleп позицию. Друзья, всё в ваших руках. Спасибо большое за просмотр видео и увидимся скоро. Пока.