Что такое микросервисы

Все наши про­ек­ты в Коде устро­е­ны просто: 

  • вся раз­ра­бот­ка ведёт­ся одни­ми и теми же программистами;
  • каж­дый пони­ма­ет, что дела­ет любая строч­ка кода;
  • если что-то непо­нят­но, это мож­но выяс­нить и разо­брать­ся за 5 минут в чате;
  • а глав­ное, каж­дый про­ект — это один боль­шой скрипт или стра­ни­ца, кото­рые пол­но­стью отве­ча­ют за всю логи­ку работы.

Такой под­ход рабо­та­ет в малень­ких коман­дах. Но что будет, если про­ект будет намно­го слож­нее? Давай­те разбираться.

Проблемы монолитной разработки

Наш под­ход при­ня­то назы­вать моно­лит­ной раз­ра­бот­кой. Это зна­чит, что все ком­по­нен­ты про­грам­мы соеди­ня­ют­ся в одной точ­ке. Напри­мер, если мы дела­ем онлайн-сервис для веде­ния спис­ка дел, то в нашем коде могут быть такие функции:

  • реги­стра­ция в сервисе,
  • напо­ми­на­ние пароля,
  • созда­ние ново­го спис­ка задач,
  • управ­ле­ние списками,
  • созда­ние новой задачи,
  • редак­ти­ро­ва­ние задачи,
  • уда­ле­ние задачи.

Что­бы рабо­та шла быст­рее, мы зовём ещё дво­их про­грам­ми­стов. Каж­дый дела­ет свой набор функ­ций, встра­и­ва­ет их в один код, а на выхо­де полу­ча­ет­ся один боль­шой скрипт.

Про­бле­ма в том, что чем боль­ше в коде эле­мен­тов, тем слож­нее под­дер­жи­вать всю систе­му в целом. Уже не полу­чит­ся про­сто поме­нять одну строч­ку в функ­ции реги­стра­ции, пото­му что она может повли­ять на рабо­ту осталь­ных функ­ций. Напри­мер, мы убра­ли обя­за­тель­ную реги­стра­цию по элек­трон­ной почте, но тогда сло­ма­ет­ся функ­ция напо­ми­на­ния паро­ля — в ней напи­са­но, что пароль нуж­но отпра­вить имен­но на почту.

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

Микросервисы — разбиваем программу на автономные части

Когда про­ект раз­рас­та­ет­ся, одно из реше­ний — раз­бить его на отдель­ные части, а потом свя­зать их меж­ду собой. Сле­ди­те за руками:

  1. Каж­дая смыс­ло­вая часть про­грам­мы выно­сит­ся в отдель­ный код, кото­рый дела­ет что-то одно: полу­ча­ет дан­ные от сер­ве­ра, отправ­ля­ет логин и пароль на про­вер­ку, даёт раз­ре­ше­ние поль­зо­ва­те­лю на вход и т. д. 
  2. Каж­дая такая про­грам­ма может полу­чать и отправ­лять дан­ные в каком-то фор­ма­те. Бла­го­да­ря это­му про­грам­мы могут обме­ни­вать­ся дан­ны­ми и управ­лять друг другом.
  3. Такие мини-программы и назы­ва­ют­ся микросервисами.

Каж­дый такой мик­ро­сер­вис рабо­та­ет авто­ном­но от осталь­ных, и един­ствен­ная его зада­ча — вовре­мя и пра­виль­но про­ре­а­ги­ро­вать на полу­чен­ные дан­ные и отпра­вить ответ по нуж­но­му адресу. 

👉 Глав­ный прин­цип в таком под­хо­де — сде­лать так, что­бы у каж­до­го мик­ро­сер­ви­са было понят­ное опи­са­ние, в каком фор­ма­те он полу­ча­ет дан­ные, в каком отправ­ля­ет и куда имен­но отправляет.

Пример

Раз­объ­ём нашу про­грам­му из нача­ла ста­тьи на микросервисы:

Что такое микросервисы

Обра­ти­те вни­ма­ние — у нас появи­лись функ­ци­о­наль­ные эле­мен­ты, кото­рых не было в исход­ной кар­тин­ке: напри­мер отри­сов­ка интер­фей­са, запрос дан­ных от поль­зо­ва­те­ля, отправ­ка дан­ных на сер­вер, запрос в БД.

Всё дело в том, что сама про­грам­ма и была тем обве­сом с допол­ни­тель­ны­ми функ­ци­я­ми, кото­рая дела­ла всю осталь­ную рабо­ту. Как толь­ко мы убра­ли цен­траль­ный «пульт управ­ле­ния», нам при­шлось доба­вить несколь­ко мик­ро­сер­ви­сов, кото­рые взя­ли на себя эту работу.

Плюсы и минусы микросервисов

Мик­ро­сер­вис­ная архи­тек­ту­ра реша­ет глав­ную зада­чу про­грам­ми­стов на мас­штаб­ных про­ек­тах: пре­вра­ща­ет слож­ную и объ­ём­ную про­грам­му в набор про­стых дета­лей, кото­рые рабо­та­ют вме­сте. Ещё из плюсов:

  • Каж­дый мик­ро­сер­вис мож­но пол­но­стью заме­нить или пере­пи­сать без поте­ри каче­ства для про­ек­та, если у него будет тот же фор­мат обще­ния с дру­ги­ми микросервисами.
  • Если нуж­но, мож­но запу­стить одно­вре­мен­но несколь­ко оди­на­ко­вых мик­ро­сер­ви­сов на раз­ных ком­пью­те­рах, что­бы повы­сить устой­чи­вость и ско­рость рабо­ты приложения.
  • Если какой-то мик­ро­сер­вис отка­жет, то чаще все­го это не при­во­дит к паде­нию все­го сер­ви­са или про­грам­мы. Ещё мож­но настро­ить авто­ма­ти­че­ский пере­за­пуск мик­ро­сер­ви­са после ава­рий­но­го завершения.
  • Неваж­но, на каком язы­ке напи­сан мик­ро­сер­вис, если он дела­ет то, что нуж­но, и уме­ет общать­ся с дру­ги­ми. Напри­мер, для высо­ко­про­из­во­ди­тель­ных частей мож­но исполь­зо­вать С++, а для осталь­ных — Java или Kotlin.
  • Мож­но посте­пен­но нара­щи­вать воз­мож­но­сти при­ло­же­ния, про­сто под­клю­чая новые мик­ро­сер­ви­сы к системе.

Но и мину­сы у тако­го под­хо­да тоже есть:

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

Пример: работа системы под нагрузкой

Допу­стим, у нас есть две вер­сии одно­го и того же сер­ви­са: один сде­лан еди­ным кодом, вто­рой — на микросервисах.

Пока нагруз­ка в рам­ках нор­мы, оба сер­ви­са рабо­та­ют при­мер­но одинаково:

Что такое микросервисы

Но если посе­ти­те­лей вне­зап­но боль­ше (напри­мер, отлич­но сра­бо­та­ла реклам­ная кам­па­ния), то моно­лит­ный сер­вис может упасть под нагруз­кой. Ока­зы­ва­ет­ся, базу дан­ных не опти­ми­зи­ро­ва­ли под такое коли­че­ство запро­сов. А если у нас всё на мик­ро­сер­ви­сах, то отдель­ная про­грам­ма, кото­рая за ними сле­дит, уви­дит, что запро­сов ста­ло слиш­ком мно­го, и запу­стит ещё несколь­ко мик­ро­сер­ви­сов с обра­бот­ка­ми запро­сов в базу данных:

Что такое микросервисы

Это что, теперь каждую программу нужно писать на микросервисах?

Нет, не обя­за­тель­но. Мик­ро­сер­ви­сы хоро­ши толь­ко в слож­ных про­ек­тах или в сер­ви­сах с высо­кой нагрузкой.

Но если вы с коман­дой точ­но зна­е­те, какой фраг­мент кода за что отве­ча­ет и как всё это свя­за­но в одно целое, — вам не нуж­ны мик­ро­сер­ви­сы, это будет лиш­ним услож­не­ни­ем. Это как поку­пать про­фес­си­о­наль­ный крас­ко­пульт, что­бы покра­сить две дос­ки на даче — вро­де и кру­то, но затра­ты того не стоят.

Текст:

Миха­ил Полянин

Редак­ту­ра:

Мак­сим Ильяхов

Худож­ник:

Даня Бер­ков­ский

Кор­рек­тор:

Ири­на Михеева

Вёрст­ка:

Мария Дро­но­ва

Соц­се­ти:

Олег Веш­кур­цев