Рубрики
Uncategorized

Привет, развертывание Microvice Part 1: Docker

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

Автор оригинала: Sheena.

Эта статья является первой из трех частей серии о развертывании микросервисов.

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

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

В части 2 мы получим наше приложение в Интернете, развернув его к кластеру Kubernetes, которые мы устанавливаем себя на облако Google. Мы также имеем дело с основами масштабирования и обновления нашего приложения.

В части 3 мы будем использовать Drone.io, чтобы настроить простой CI/CD-трубопровод. Он проверит наше приложение и разворачивает какие-либо изменения, которые мы делаем в главной отрасли нашего репо.

Эта серия очень много «Hello World» микросервисов. Мы не будем охватывать каждый аспект проектирования, развертывания, тестирования и мониторинга ваших услуг (есть целые книги написано на этой теме), но это даст вам довольно хорошее представление о том, как начать работу. Я также укажу вам актуальные ресурсы по пути, чтобы вы могли углубить свои знания самостоятельно.

Микро-что?

Если вы знакомы с концепциями микросервисов, не стесняйтесь пропустить этот раздел.

В начале были монолиты.

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

Давайте назовем наше полностью гипотетическое приложение Webflix.

Допустим, мы пишем весь приложение Webflix как одно приложение — монолит. Там вполне многое, что означает, что значит, что многие тестирования должны случиться каждый раз, когда выполняются любые изменения, например, если я внесу изменение в код, ответственный за рекомендацию, то я должен запускать весь тестовый люкс Отказ

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

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

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

Однако, когда мы увеличиваем, мы все масштабируем, так как это монолит. Не было бы неплохо просто понять части системы, которые на самом деле под давлением в пиковые времена? Например, подсистема, ответственная за фактически сервировочные видео, должна быть масштабирована, но функциональность забытого пароля не должна.

Введите микросервисы.

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

Каждая услуга определяется его целью и обязанностями. Иногда, однако, все не так понятно. Например, следует ли аутентификацию и авторизацию быть одной услугой или двумя? Кроме того, WebFlix необходимо обеспечить политику No-Pay-No-Watch. Это означает, что система авторизации должна быть осведомлена о платежной системе. И платежные и забытые системы пароля и пользовательских систем регистрации должны иметь возможность отправлять электронные письма.

Итак, мы видим, что иногда границы между услугами довольно ясны и очевидны. Но иногда они могут быть немного нечеткой. Услуги также должны эффективно общаться.

После разрушения вещей, как указано выше, давайте увеличением на одном четко определенном обслуживании: система рекомендации. Если я внесу изменение в Кодекс службы Рекомендации, мне просто нужно запустить тесты устройства для этой одной системы, я могу развернуть и откатывать эту службу индивидуально, и я могу масштабировать его индивидуально по мере необходимости. Я даже могу развернуть несколько версий для прикосновения тестирования A/B.

Победа! Но подождите, есть другие включенные в систему — система рекомендации необходимо получить доступ к конечному интернет-пользователю, и он должен знать о том, что пользователь уже смотрел.

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

Тогда возникает проблема совместимости версии. Допустим, мы работаем на рекомендации_Service: 1.2.0 и Video_History_Service: 1.3.0 и те играют приятно. Но затем рекомендовать_service: 1.3.0 создается и что один разбивает общую систему. Таким образом, патч создан для его исправления (Review_Service: 1.3.1), но, в то же время, Review_Service: 1.4.1 выпущен.

Хорошо, так что скажем, мы все развернуты. Теперь эти услуги должны эффективно общаться. Мы могли бы просто использовать HTTP, но что, если сеть просто немного ненадежна? Что если сервис находится в середине модернизации? Что если трафик потерян или воспроизведен? Некоторые мысли подойдут туда.

Что если что-то сломается, не поднимая исключение? Например, что если «Барни Динозавр» рекомендуется для жесткого кода Zombie Fan? Услуги истории, пользователей, предпочтений и рекомендаций должны быть рассмотрены. Что если есть всплеск в задержек? Любое количество отдельных услуг может быть не виновата.

Существуют плюсы и минусы к микроэрганизмам, так и монолитам (монолиты, конечно, не вводят сложности микросервисов — связь, развертывание и тестирование намного проще). Две стили подходят для разных проектов. Но, в зависимости от того, какой маршрут вы не спуститесь, вам нужно будет развернуть ваш код. И это действительно то, о чем это учебное пособие.

Представляющий докер

Если вам удобно с докером, не стесняйтесь пропустить этот раздел

Deploy-Micro-Metal.png

Вы запускаете приложения на вашем компьютере все время. Ваш компьютер представляет собой металлическую машину. Приложения работают над вашей операционной системой (ОС), а ОС управляет оборудованием. Есть целый множество проблем с развертыванием приложений для голого металла, который я не вступит в здесь. Многие из этих проблем преодолены виртуальными машинами (VMS).

deploy-micro-vm.png

VM работает на гипервизоре, гипервизор работает на хост-ОС, а хост-ОС управляет оборудованием. Может быть несколько не связанных и изолированных виртуальных машин на верхней части одного гипервизора. Работа гипервизора является в первую очередь для выделения ресурсов различным виртуальным видам и видеомассам. Теперь ваше приложение будет работать сверху ОС, установленной на VM.

Но VMS довольно тяжелые — не было бы неплохо отбросить все эти дополнительные ОС? Контейнеры делают это. Контейнер можно рассматривать как действительно легкий VM.

Deploy-Micro-Containers.png

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

VMS, как правило, имеет гигабайты по размеру и могут занять несколько минут, потому что операционные системы большие! Контейнеры используют библиотеки и пакеты в операционной системе хоста, чтобы получить доступ к ресурсам. Затем они используют свои собственные библиотеки и пакеты, чтобы эмулировать отдельные операционные системы, по мере необходимости, вместо того, чтобы установить ненужное блуждание. Например, вы можете запустить изображение Ubuntu на вашу машину Windows, не требуя установки Ubuntu.

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

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

Докер Является ли стандартная контейнерная платформа Facto Industry, и это то, с которой мы будем иметь дело в этой статье.

Практично: Давайте сделаем API

Docker позволяет создавать изображения. Изображения создаются для создания контейнеров (если вы знакомы с объектом ориентированным программированием, то изображения подобны классам, а контейнеры похожи на объекты). В этом разделе мы создадим и запустим контейнер, и контейнер будет содержать службу, которую мы хотим развернуть.

Мы начнем, сделав простой Python Обнять Применение и управление его локально. Объятие — это каркас для создания сверхмостных, самодокуменных API, независимо от того, как эти API выставлены.

В нашем случае мы будем использовать его, чтобы открыть простой API через Http . Отказ По сути, вы создаете простые старые функции Python, а затем определите, как (и если) вы хотите, чтобы они были выставлены путем использования декораторов. Это довольно новое на сцене, но считается готовым производством.

Это руководство предполагает, что вы можете установить Python3, VirtualenVwrapper и Git самостоятельно. Вы можете узнать больше о виртуальных средах Python 3 здесь Отказ Virtualenvwrapper просто предоставляет инструменты для облегчения управления вашей виртуальной средой.

Мы собираемся начать, запустив наше приложение локально. Мы на самом деле не нужно Чтобы установить и запустить наше приложение локально, но может добавить некоторую ясность для обсуждения вокруг создания нашего изображения.

## create and activate your virtual environment. Application dependencies will be installed here instead of globally. This has nothing to do with containers really, it's just a special directory and path configuration. Also it is good practice

mkvirtualenv --python=`which python3` codementor_deployment_tutorial

## clone the application

git clone https://gitlab.com/sheena.oconnell/tutorial-codementor-deploying-microservices.git

## install the application requirements

cd tutorial-codementor-deploying-microservices
pip install -r requirements.txt

## run the application

hug -f main.py

Вы должны получить вывод с чем-то вроде этого:

hug -f main.py                                                                                                                                          [11:03]

/#######################################################################\
          `.----``..-------..``.----.
         :/:::::--:---------:--::::://.
        .+::::----##/-/oo+:-##----:::://
        `//::-------/oosoo-------::://.       ###    ###  ###    ###    #####
          .-:------./++o/o-.------::-`   ```  ###    ###  ###    ###  ##
             `----.-./+o+:..----.     `.:///. #########  ###    ### ##
   ```        `----.-::::::------  `.-:::://. ###    ###  ###    ### ###   ####
  ://::--.``` -:``...-----...` `:--::::::-.`  ###    ###  ###   ###   ###    ##
  :/:::::::::-:-     `````      .:::::-.`     ###    ###    #####     ######
   ``.--:::::::.                .:::.`
         ``..::.                .::         EMBRACE THE APIs OF THE FUTURE
             ::-                .:-
             -::`               ::-                   VERSION 2.4.0
             `::-              -::`
              -::-`           -::-
\########################################################################/

 Copyright (C) 2016 Timothy Edmund Crosley
 Under the MIT License


Serving on :8000...
127.0.0.1 - - [07/Jun/2018 11:04:27] "GET /index HTTP/1.1" 200 26

Давайте запросим на страницу индекса, чтобы убедиться, что код на самом деле работает. Откройте новый терминал, а затем:

curl 0.0.0.0:8000/index

Это должно вернуть ответ:

{"codementor": "so delicious"}

Разве это не приятно?

Практично: давайте запустим нашу API как контейнер докеров

Теперь, когда вы знаете, что приложение в основном работает, пришло время построить изображение. Обратите внимание, что REPO содержит Dockerfile. Внутри докера вы найдете что-то это:

FROM python:3
EXPOSE 8080

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["gunicorn", "-b", "0.0.0.0:8080", "main:__hug_wsgi__"]

Если вы хотите узнать больше о вытягивании и нажатии изображений, посмотрите на Документы Отказ

Хорошо, теперь мы можем построить изображение:

docker build -t codementor-tutorial:1 .

А затем для запуска изображения (то есть создать контейнер):

docker run -p 8080:8080 codementor-tutorial:1

Вы должны увидеть продукцию, как так:

[2018-06-15 07:11:59 +0000] [1] [INFO] Starting gunicorn 19.8.1
[2018-06-15 07:11:59 +0000] [1] [INFO] Listening at: http://127.0.0.1:8000 (1)
[2018-06-15 07:11:59 +0000] [1] [INFO] Using worker: sync
[2018-06-15 07:11:59 +0000] [9] [INFO] Booting worker with pid: 9

Откройте другой терминал, затем сверните API и убедитесь, что все еще работает:

curl 0.0.0.0:8080/index

Это выходы:

{"codementor": "so delicious"}

Обратите внимание, что мы используем порт 8080 вместо 8000 здесь. Вы можете указать любой хост-порт.

Очень краткое введение в версии

Итак, теперь у нас есть изображение, которое мы можем запустить на любом компьютере (голый металл или виртуальную машину), которое может запустить Docker Images. Наше изображение имеет имя и номер версии. Если мы хотели внести какие-либо изменения в функциональность нашего изображения, то мы укажем эти изменения в коде, а затем перестроили изображение с другим тегом версии, например.:

docker build -t codementor-tutorial:2 .

Резюме

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

Околомецком, который находится намного больше, что находится за пределами объема этого текста. Я предлагаю взглянуть на Официальная документация Если вам нужно больше деталей.

Если вам нужно что-то более структурированное, есть много Действительно отличные книги там, что может помочь вам.

Вы готовы к следующему шагу? В части 2 мы будем развертывать, масштабировать и обновлять наше небольшое приложение на облаке!

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

Оригинал: «https://www.codementor.io/@sheena/hello-microservice-deployment-part-1-docker-kw9ejpd9o»