Чистая архитектура проекта на Golang

Поделиться
HTML-код
  • Опубликовано: 23 сен 2023
  • Мой курс по разработке микросервисов: clck.ru/389FM7
    Репозиторий с примером: github.com/olezhek28/clean-ar...
    Мой Boosty: boosty.to/olezhek28
    Linkedin: / olezhek28
    Telegram-канал: t.me/olezhek28go
    В этом видео мы разберемся в основах создания архитектуры микросервисов на golang, познакомимся со слоистой архитектурой и реализуем DI-контейнер. Мы на практике поймем, как реализовать архитектуру go проекта, как в BigTech-компаниях. А также в конце я расскажу про свой курс по разработке микросервисов на golang.

Комментарии • 116

  • @TrifunS
    @TrifunS 3 месяца назад +3

    Как же классно вас смотреть, все четко, по делу, без душноты)

    • @olezhek28go
      @olezhek28go  3 месяца назад

      Спасибо, приятно слышать:)

  • @turbo3d649
    @turbo3d649 23 дня назад +1

    😁 Олег, респект! Отличный контент.

    • @olezhek28go
      @olezhek28go  23 дня назад

      Спасибо большое)

  • @kodikoff
    @kodikoff 9 месяцев назад +1

    Огонь, спасибо большое за полезную информацию!

    • @olezhek28go
      @olezhek28go  9 месяцев назад

      рад, что понравилось)

  • @iloveflovers781
    @iloveflovers781 5 месяцев назад +2

    Спасибо за труд!

    • @olezhek28go
      @olezhek28go  5 месяцев назад

      Рад стараться:)

  • @dsbasko
    @dsbasko 9 месяцев назад +2

    Олег молодец! Очень красноречив. Приятно слушать )

  • @Freeline95
    @Freeline95 4 месяца назад +2

    Отличный урок, спасибо. То, что искал.

    • @olezhek28go
      @olezhek28go  4 месяца назад

      Рад, что понравилось:)

    • @Freeline95
      @Freeline95 4 месяца назад

      @@olezhek28go У меня один вопрос только появился только что.
      Верно ли понимаю, что структуры одного уровня не должны использоваться друг другом? Иначе появляется риск зацикленности.

  • @techbuterbrod
    @techbuterbrod Месяц назад +1

    Пишу на C#, все выглядит похоже и знакомо. Правда, реализация интерфейсов в C# нравится мне больше.

    • @olezhek28go
      @olezhek28go  Месяц назад

      Я тоже было время на шарпе чутка писал:) а что именно в интерфейсах нравится больше?

  • @5111
    @5111 8 месяцев назад +1

    Лайк за разбор данной темы

  • @rahug1927
    @rahug1927 4 месяца назад +1

    Спасибо за видео! Будучи джуниором уже пишу такой код :D *довольно понятно объясняете*

    • @olezhek28go
      @olezhek28go  4 месяца назад +1

      Отлично) Рад, что доступно изложил

  • @alexandrshatilov8227
    @alexandrshatilov8227 2 месяца назад +2

    такой материал в живой подаче очень приятно смотреть) спасибо! Сейчас прохожу отбор в Авито на стажировку, надеюсь там вас увидеть :)

    • @olezhek28go
      @olezhek28go  2 месяца назад +1

      спасибо за добрые слова) удачи в отборе!)

  • @romanbush5164
    @romanbush5164 2 месяца назад +3

    какой веселый чел, и презентации забавные делает) Повезло сохранить оптимизм )

    • @olezhek28go
      @olezhek28go  2 месяца назад

      Спасибо за добрые слова:)

  • @user-jg9bm6ft3q
    @user-jg9bm6ft3q 2 месяца назад +1

    🎉

  • @qskyisover8153
    @qskyisover8153 Месяц назад +1

    Если у вас в микросервисе под 10 юзкейсов и реп и вам нужна DI-система, скорее всего у вас что-то не так пошло на этапе планирования микросервисной архитектуры)

    • @olezhek28go
      @olezhek28go  Месяц назад

      Согласен:) скорее это бывает промежуточным состоянием, при котором принимаем решение распиливать:) а di лично мне на любых размерах кажется кайфовой штукой

  • @unicoxr5tj417
    @unicoxr5tj417 8 месяцев назад +1

    лайк за разговорчики про архитектуру

  • @trypophobia7497
    @trypophobia7497 Месяц назад +1

    Спасибо за видео. Блин, из-за того что в go нет возможности перечислять, какие интерфейсы должна имплементировать структура, как это сделано в других языках, приходятся делать такой костыль с переменной, то что структура удовлетворяет интерфейс -- это кек))))

    • @olezhek28go
      @olezhek28go  Месяц назад +1

      Да это скорее удобство чтения добавляет) так-то можно и не писать такую конструкцию, просто ошибка на компиляции будет, а не сразу в ide

  • @ivankuzmin4727
    @ivankuzmin4727 9 месяцев назад +1

    Привет, спасибо за контент, а стоит проходить курс, если в route256 обучался, в том числе у тебя)? И второй вопрос, на разборе будут показаны куски кода, как было бы правильнее реализовать или дана ссылка на реализацию от преподавателя текущего дз?)

    • @olezhek28go
      @olezhek28go  9 месяцев назад

      Привет)
      1) Если в руте на потоке где я обучал был, то наверное нового будет процентов 40. В целом по программе на сайте можешь оценить)
      2) Я буду рассказывать темы, иллюстрируя примерами кода, которые будут доступны обучающимся. Что касается дз, то у меня тоже есть моя реализация, да

  • @pvinnie3827
    @pvinnie3827 6 месяцев назад +1

    спасибо, вчера классно уснул в наушниках, придется пересматривать. Помню что повествование веселое, местами с шутечками, чувствуется что чел могёт ))

    • @olezhek28go
      @olezhek28go  6 месяцев назад

      Спасибо за добрые слова:)

    • @user-dx2yg4sw3w
      @user-dx2yg4sw3w 6 месяцев назад

      Ахахаха

  • @user-vo7lq1jt5v
    @user-vo7lq1jt5v 6 месяцев назад +1

    Спасибо, очень понравилось. У меня возник такой вопрос, в чём состоит основное отличие чистой архитектуры от Слоистой архитектуры "Layered architecture" (N-layer). Например, почему представленный пример является чистой архитектурой, а не слоистой (N-layer), так как у меня возникла мысль (возможно неверная, прошу поправить, если это не так), что представленный пример можно было бы отнести к Слоистой архитектуре (N-layer).

  • @Orionich
    @Orionich 8 месяцев назад

    Олег, отличный контент! Спасибо тебе! Небольшой вопрос: в коде модель репозитория и модель сервиса для User помещены в пакет model. Обе модели с публичной видимостью. В итоге к ним обеим можно обратиться как model.User, но при этом это разные структуры естественно. Возникает некоторая потенциальная путаница и необходимость пользоваться альясами. Это так и задумано? Или в конкретном случае лучше использовать разный нейминг/пакеты? Спасибо!

    • @olezhek28go
      @olezhek28go  8 месяцев назад

      Спасибо за добрые слова) касательно вопроса - Мы на работе так и юзаем с алиасом) IDE сразу запоминает куда что ведет и импорты автоматом добавляются и путаницы фактически нет) но можно и разные нейминги попробовать)

    • @Orionich
      @Orionich 8 месяцев назад

      @@olezhek28go Спасибо еще раз!

  • @Freeline95
    @Freeline95 4 месяца назад

    А верно ли, что сервисы на одном уровне/слое не должны использовать друг друга? Чтобы не происходило зацикливания.

    • @olezhek28go
      @olezhek28go  4 месяца назад

      А почему должно быть зацикливание? Это совершенно не обязательно)

  • @user-pg6mb6il1c
    @user-pg6mb6il1c 9 месяцев назад

    Опа, новое от Козыря

    • @olezhek28go
      @olezhek28go  9 месяцев назад

      так меня пожалуй с садика не называли)

  • @buginsystem8925
    @buginsystem8925 7 месяцев назад +2

    Ток интерфейсы лучше в месте использования объявлять. Т.е. используешь в сервисе интерфейс репо, там его и объявляешь, указываешь какие методы твоему сервису нужны.
    Иначе, если одному сервису нужны одни методы, а другому другие, и оба могут работать с одним и тем же репозиторием, то они будут эмбеддить интерфейс репозитория со ВСЕМИ его методами, а это избыточность и неудобство для программиста.

    • @olezhek28go
      @olezhek28go  7 месяцев назад

      Я как раз говорил о холиварности этого вопроса) мы осознано выбрали варик как в видео и репо слой немного иначе разбивает, от того неудобства нет

    • @buginsystem8925
      @buginsystem8925 7 месяцев назад

      @@olezhek28go Понял-принял.

    • @MrJamesHunt
      @MrJamesHunt 15 дней назад

      @@olezhek28goинверсия зависимости направлена не в ту сторону. Бизнес логика зависит от репозитория и его импортирует.

  • @yarbersheer8559
    @yarbersheer8559 9 месяцев назад +2

    для микросервиса покатит) но когда в приложении больше одного сервиса, то без слоя межсервисного взаимодействия будет .опа)

    • @olezhek28go
      @olezhek28go  9 месяцев назад

      С несколькими еще жить можно, но чем дальше тем хуже, согласен)

  • @user-tr5wi9ws6s
    @user-tr5wi9ws6s 6 месяцев назад +2

    На работе (python/fastapi) начали вводить чистую архетиктуру, интересно посмотреть на всю эту тему со слоями со стороны другого языка

    • @olezhek28go
      @olezhek28go  6 месяцев назад

      И как в го проще или нет?

    • @user-tr5wi9ws6s
      @user-tr5wi9ws6s 6 месяцев назад +1

      @@olezhek28go да трудно сказать, надо попробовать апиху полноценную выкатить, не хватает времени пока. У нас еще авторизация, орм, зависимостей внедрения свои способы. В fastapi уже есть это готовое, на коллектив можно опереться. А так со слоями нормально объяснили в видео -- делать их изолированными полностью, и все ок будет.

  • @TheDavBag
    @TheDavBag 7 месяцев назад

    на больших бачах конвертер дорого юзать (ещё один проход O(n)), также спорно использовать конвертер на перекладывании одинаковых полей из одной структуры в другую. я лично предпочитаю сквозные дто/модели на микросервис.
    прикол что ЧА разрабилась для модульных монолитов

    • @olezhek28go
      @olezhek28go  7 месяцев назад

      ага, на большых бачах будет грустно( сквозные дтошки мы тоже юзали в другом проекте, сейчас решили иначе)

    • @TheDavBag
      @TheDavBag 7 месяцев назад

      @@olezhek28go а что повлияло на выбор?

  • @Kotl1n
    @Kotl1n 9 месяцев назад

    Олег а на собеседованиях DevOps/SRE в Ozon или Avito спрашивают алгоритмы или это только у разрабов?

    • @olezhek28go
      @olezhek28go  9 месяцев назад

      Честно говоря не знаю, не интересовался на этот счет)

  • @fprotimaru1944
    @fprotimaru1944 9 месяцев назад +4

    Возвращать интерфейс вместо структуры разве не антипаттерн?

    • @olezhek28go
      @olezhek28go  9 месяцев назад

      А в чём проблема? Для этого же всё и задумывалось, чтоб абстракцией закрыться)

    • @fprotimaru1944
      @fprotimaru1944 9 месяцев назад

      @@olezhek28go Интерфейса нужно положить туда, где этот интерфейс вызывается. А чтобы закрыть у нас есть инкапсуляция)

    • @olezhek28go
      @olezhek28go  9 месяцев назад

      Как раз тут и случается срач по поводу интерфейсов:) Кто-то кладет по месту использования, кто-то иначе) так что стоит отталкиваться от того как договорились в комманде

    • @user-zu3rw3cr1u
      @user-zu3rw3cr1u 6 месяцев назад

      @@olezhek28go так на выходе получаем какой-то конкретный объект, зачем нам возвращать абстракцию? чтобы использоваться полиморфизм, на вход мы получаем абстракцию, а на выходе зачем она непонятно

    • @MrJamesHunt
      @MrJamesHunt 15 дней назад

      @@olezhek28goпроблема в том что это не конструктор сущности должен решать какие методы нужно реализовывать возвращать интерфейсом, а тот кто будет пользоваться должен определить нужный ему интерфейс для этой сущности. Конструктор возвращает конкретное(структура), потребители решают какие методы требуются (интерфейс)

  • @ypohut1673
    @ypohut1673 3 месяца назад

    А правда что в го можно новичкам идти? Непонятно что лучше взять питон или го?

    • @olezhek28go
      @olezhek28go  3 месяца назад

      Конечно можно) в чем проблема?)

    • @vugpgu
      @vugpgu 2 месяца назад

      Да, лучше питон в руках, чем гоу в кустах

  • @yarbersheer8559
    @yarbersheer8559 9 месяцев назад +1

    эй.. почему не по схеме explicit architecture? ) один раз бы разобрались, было бы веселее )) А ещё DDD не хватат)

    • @olezhek28go
      @olezhek28go  9 месяцев назад +1

      да я рассказывал из своей рабочей практики) а так-то конечно можно намутить будет как-нить урок веселья ради и по тому же DDD) Заодно будет повод лучше разобраться хех

    • @alekseishashev712
      @alekseishashev712 9 месяцев назад

      @@olezhek28go это, я так понимаю, вся суть лучших практик по архитектуре - "веселья ради"? 😅

  • @romanbush5164
    @romanbush5164 2 месяца назад +2

    интересно когда-нибудь напишут для go Фреймворки, пока это выглядит, как ранний php, но хотя бы архитектурно придумали как делить это безобразие

    • @olezhek28go
      @olezhek28go  2 месяца назад

      Внутри крупных компаний есть:)

    • @qskyisover8153
      @qskyisover8153 Месяц назад

      Надеюсь, что никогда

  • @yarbersheer8559
    @yarbersheer8559 9 месяцев назад +3

    а разве было бы не прагматичнее convertor mapper'ом назвать?)

    • @olezhek28go
      @olezhek28go  9 месяцев назад

      да в целом можно и так) тут скорее зависит как в команде договоришься) мы на конверторе сошлись)

  • @eamarc
    @eamarc Месяц назад

    вот говорит, что плюсами покусан, а сам пишет = (*repository)(nil) вместо = new(repository). Что-то тут не так...

    • @olezhek28go
      @olezhek28go  Месяц назад

      Ну все, надо разоблачение снимать))

    • @eamarc
      @eamarc Месяц назад

      @@olezhek28go точно! И обязательно сдать своего диллера, который ключи от Goland'а поставляет ))

  • @JohnGrave
    @JohnGrave 4 месяца назад

    Сделайте поправочку только, что, это не та самая "чистая архитектура" как на первой картинке было
    А обычная слоистая, трехзвенка в народе

    • @olezhek28go
      @olezhek28go  4 месяца назад

      Я уже не помню, что там за пикча была) в целом, если там шестиугольник, то кажется оно тут тоже ложится) или я что-то упускаю?

  • @user-sx4hu3ny9c
    @user-sx4hu3ny9c 4 месяца назад

    Посмотрел разные видосы по чистой архитектуре, единого стандарта тупо нет, каждый городит по своему "как удобнее или как понял" У кого-то Entity,Usecase у кого-то Model, Repository. Давайте еще какой-нибудь "Template" еще введем, чтоб всем дружно гадать, что это такое

    • @olezhek28go
      @olezhek28go  4 месяца назад

      Если правильно помню, я об это и говорил) в любом случае на уровне команды лучше устаканивать договоренности такие)

  • @9285550
    @9285550 18 часов назад

    Не понял зачем RLock в гете.

    • @olezhek28go
      @olezhek28go  17 часов назад

      Чтобы запись залочить)

    • @9285550
      @9285550 17 часов назад

      @@olezhek28go пошёл читать доки сразу после просмотра, уже разобрался, спасибо)

  • @niumandzi2929
    @niumandzi2929 8 месяцев назад

    А у кого-то есть пример цепной инициализации DB Client'a в контестке реализации, представленной в этом видео?

    • @olezhek28go
      @olezhek28go  8 месяцев назад

      Дак а что там сверхъестественного?) принцип же тот же самый

    • @niumandzi2929
      @niumandzi2929 8 месяцев назад

      Ну я столкнулся с некоторыми проблемами при попытке реализации, по этому решил спросить

  • @faizulla5838
    @faizulla5838 8 месяцев назад +2

    Вопросы все задают вроде как все с опытом, но смотря как чувак распинается объясняя всем что он сделал все на интерфейсах, типа ООП, то понимаешь что многие вообще не знают что такое ООП, и инкапуляция в том числе.
    Хотя Go он вообщето задуман как функциональный язык, и че городить ООП, я пока не догнал, за исключением "+" для поддержки проекта.
    А закзчику тяжело с сайтом и сервером... дааа ерунда.

    • @JohnGrave
      @JohnGrave 4 месяца назад

      В Go коммьюнити вообще как-то странно с пониманием архитектуры сервисов, я заметил

    • @vugpgu
      @vugpgu 2 месяца назад

      ​@@JohnGraveв комьюните противостояние очкариков ушедших с плюсов и студентов после питона.
      Борьба поколений!

  • @L0wPressure
    @L0wPressure 8 месяцев назад +1

    Сорри, но 666 подписичков - пока кто-то не испортит, подписаться религия не позволит.

    • @olezhek28go
      @olezhek28go  8 месяцев назад +1

      Уже испортили:(

  • @andreyparovozz
    @andreyparovozz 2 месяца назад +1

    Послушал первые 10 минут. Дальше не смог. Формулирование мыслей на уровне 5 класса.

    • @olezhek28go
      @olezhek28go  2 месяца назад +7

      А вы в шестой уже перешли?:)

  • @vincentvince2136
    @vincentvince2136 7 месяцев назад +1

    Прикольно конечно, но я в ахуе с этих названий переменных: r, n, a, b, s. Для реального проекта это конечно будет тот еще пиздец, особенно когда новенькие придут и будут в этом разбираться

    • @olezhek28go
      @olezhek28go  7 месяцев назад

      Это имена ресиверов и они как раз таки часто именно в таком стиле и задаются в проектах и проблемы в этом нет

    • @vincentvince2136
      @vincentvince2136 7 месяцев назад

      ​@@olezhek28go Ну это в любом случае может ввести в некоторое заблуждение или недоумение неподготовленного человека, ничего не мешает написать название чуть подлиннее, зато любой человек поймет что к чему, да и легче потом в коде будет искать их использование

    • @olezhek28go
      @olezhek28go  7 месяцев назад

      Таков стиль в гошке:) написать можно, спору нет

  • @michaelcorleone3741
    @michaelcorleone3741 6 месяцев назад +1

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

    • @olezhek28go
      @olezhek28go  6 месяцев назад +3

      Почему я не могу рекламировать свой собственный курс, материал которого я обновляю) да и разговоры про знания, которые не используются тоже спорный) практики, которые я там рассказываю мы активно юзаем у себя в команде в Авито) ментор тоже хороший способ, спору нет

    • @michaelcorleone3741
      @michaelcorleone3741 6 месяцев назад

      @@olezhek28go Если вы передаете свой опыт, знания и являетесь ментором для каждого ученика индивидуально - респект вам и уважуха.. если же нет - то те же пожелания наоборот вам.. и геморрой хронический в качестве бонуса)

    • @user-cq7gb9gj4e
      @user-cq7gb9gj4e 5 месяцев назад

      Большинство коммерческих курсов - да. Но есть бесплатные курсы от компаний, в которых бывает полезно. Проходил такой от МТС пару лет назад, для меня это был легкий способ войти в Go, имея опыт в другом языке. Доступная информация, классные менторы. Практические задания для меня были мотивацией потратить время на изучение языка на практике. После курса получил 3 оффера из бигтехов РФ, в одном из которых работаю до сих пор.

    • @michaelcorleone3741
      @michaelcorleone3741 5 месяцев назад

      @@user-cq7gb9gj4e Вам повезло) я не имею ввиду, что все вокруг шарлатаны.. всего лишь 99% населения планеты

  • @videorelief
    @videorelief 7 месяцев назад +1

    зная как работает ужасно Авито, лучше всерьез не слушать данный доклад

    • @olezhek28go
      @olezhek28go  7 месяцев назад +10

      Зная как устроен интернет, лучше всерьез не слушать комментарии😄

    • @videorelief
      @videorelief 7 месяцев назад

      @@olezhek28go согласен, но очень прощу почините Авито уже, так плохо работает =((

    • @olezhek28go
      @olezhek28go  7 месяцев назад +3

      Я во внутренних сервисах тружусь, так что над основным сайтом власти не имею(

    • @carrykerry2023
      @carrykerry2023 6 месяцев назад +3

      А че не так с авито? Вроде нормально там ручки отвечают, никогда долго не ждал ответа