[БЕЗ_ЗВУКА] В начале был монолит. Потом этот монолит разбили на модули, которые стали автономными кусками программы, и после чего пришел XXI век, появился паттерн микросервисов, и эти модули вынесли в микросервисы. И в этом видео мы как раз об этом поговорим. Про то, как немножко разбить старый код на отдельный сервис. Рассмотрим эту страницу. В ней мы видим логин и пароль, поля для их ввода. Давайте введем. rvasily и пароль любой. И вот мне написало, что «здравствуйте, rvasily», тот username, который я ввел, и user agent, который был на момент создания моей сессии. То есть если я обновлю страницу, моя сессия тут уже заполнена. Ну и у меня есть кнопка выхода. Что это значит? Это значит, что у нас есть код, в котором есть три функции: создать сессию, проверить сессию и удалить сессию. Писалось это в стародавние времена, когда компьютеры были большими и медленными. Что это значит? Это значит, что у нас есть какое-то глобальное хранилище сессий, какой-то глобальный Mutex, который находится в глобальном пространстве вообще, и все плохо. Ну и рассмотрим функцию. Вот сессия, для того чтобы создать сессию, мы там что-то делаем, лочимся каждый раз на Mutex и там кладем ее в хранилище. Пытаемся получить сессию, мы лочимся на чтение только, потом получаем ее из хранилища, и все. Ну и удаление сессии тоже. Лочимся и удаляем. Вот это монолит старого стиля. Такое, махровое legacy. Теперь, для того чтобы что-то с этим сделать, его стоит вынести в отдельный, хотя бы, модуль. Хотя бы чтобы он был как-то взаимозаменяем, или реализацию можно было как-то подменить. Для начала выкинем глобальные переменные. Начнем. type Session Manager struct. У нас будет наша структура. Mutex, и session (я это скопирую даже). Хорошо. То есть вот в экземпляр этой структуры мы будем все наше складывать. Теперь его нужно удобно создавать. Вынесем просто в отдельный helper. NewSessManager, return, [БЕЗ_СЛОВ] [БЕЗ_СЛОВ] Так, окей. Вот так, и вот так вот, запятые. Хорошо, мы создали структуру — менеджер сессий. Полями, которые являются Mutex, и, собственно, хранилище сессий. И мы создали функцию — новый менеджер сессий, который будет нам, собственно, возвращать экземпляр структуры. Отлично. Теперь вот эти вот функции, которые тут были, мы сделаем методами этой структуры. Create. Create, что это такое? Check. Check и Delete. Ну и сделаем (sm *SessionManager). Так, теперь это экземпляры, теперь это методы этой структуры. Отлично. Mutex'а у нас больше нет глобального, это теперь поле структуры, поэтому заменяем, обращаемся к полю. sm — это в данном случае данная структура. sm там и там. Отлично. Теперь у нас есть уже как-то более-менее изолированный модуль, который мы можем переиспользовать. Но модуль — это конечно очень круто, но вдруг мы захотим какие-то тесты. Поэтому можем сразу создать интерфейс. Ну назовем. [БЕЗ_СЛОВ] У него будет функция Create, [БЕЗ_СЛОВ] Create, Check, Delete. [БЕЗ_СЛОВ] Хорошо. Так, interface. [БЕЗ_СЛОВ] Ну и глобальные переменные мы выкинем. Окей. У нас есть Manager, interface какой-то, новая функция для создания экземпляров — все хорошо. Теперь нужно отрефакторить код, который все это вызывает. Создадим var sm. Эта переменная будет иметь тип interface'а. Ну вот так вот. Теперь вот так. Теперь вызовем функцию, которая нам создает. Вот, теперь мы получили уже какую-то обособленную единицу, давайте это даже вынесем вот так, потому что вдруг мы захотим это как-то глобально использовать. Вот. Теперь переведем это на вызов методов этой структуры. Create, Check. Delete, и еще раз Check. Вроде бы оно даже должно заработать. Надо попробовать запустить. Так. Нет, все плохо. [БЕЗ_СЛОВ] SessionManager. [БЕЗ_СЛОВ] Mutex in field value 32. 32. [БЕЗ_СЛОВ] Адрес. Так. Это не просто Mutex, это — RWMutex. RWMutex. И 41, 58. Ах, ну да, конечно. Теперь нам еще нужно в структуру это все положить. Записали, сделали и сделали. Хорошо, вроде бы мы... [БЕЗ_СЛОВ] sessions. Вроде мы зачинили все ошибки, и у нас даже все заработало. Итак, что мы сделали? Раньше у нас была глобальная переменная, где мы хранили все, и были какие-то функции, для того чтобы работать с этой глобальной переменной. Функция — это уже неплохо. Иногда бывает так, что прямо работает с этой переменной. За счет того, что у нас были функции, мы хотя бы смогли это изолировать. Мы создали структуру, которая заменила нам эти глобальные переменные. И функции, которые раньше были, мы заменили на методы этой структуры. Также мы создали Helper, который возвращает нам экземпляр структуры, и создали interface, которому удовлетворяет наша структура. Все. Теперь мы заменили вызов глобальных функций на обращение к методам структур. Причем переменную менеджера сессии мы создали как interface. Значит, что если вдруг мы хотим подменить теперь эту структуру, заменить реализацию, нам будет гораздо проще это делать. Хорошо. Теперь у нас есть вроде как отдельный небольшой модуль — сессия, и его уже можно попробовать изолировать в виде отдельного сервиса, чем мы и займемся дальше.