Построение Микросервисной Архитектуры На Golang И Grpc, Часть 2 (Докер)



Пришло время заняться контейнерами Прежде всего, мы используем последний образ Linux Alpine. Linux Alpine — это легкий дистрибутив Linux, разработанный и оптимизированный для запуска веб-приложений в Docker. Другими словами, Linux Alpine имеет достаточно зависимостей и функций для запуска большинства приложений.

Это означает, что размер изображения составляет около 8 МБ! По сравнению, скажем, с виртуальной машиной Ubuntu размером около 1 ГБ, именно поэтому образы Docker стали более естественным образом подходить для микросервисов и облачных вычислений.

Итак, я надеюсь, что теперь вы видите ценность контейнеризации, и мы можем начать «докеризацию» нашего первого сервиса.

Давайте создадим Dockerfile $ touch консигнационная служба/Dockerfile .



Построение микросервисной архитектуры на Golang и gRPC, часть 2 (докер)

Первая часть Оригинальный репозиторий от EwanValentine Оригинальная статья Добавьте в Dockerfile следующее:

  
  
  
  
  
   

FROM alpine:latest RUN mkdir /app WORKDIR /app ADD consignment-service /app/consignment-service CMD [".

/consignment-service"]

Затем мы создаем новый каталог для размещения нашего приложения.

Затем мы добавляем наш скомпилированный двоичный файл в наш контейнер Docker и запускаем его.

Теперь давайте обновим запись сборки нашего Makefile, чтобы создать образ Docker.

build: .

GOOS=linux GOARCH=amd64 go build docker build -t consignment .



Мы добавили еще два шага, и я хотел бы объяснить их немного подробнее.

Прежде всего, мы создаем бинарный файл Go. Однако вы заметите две переменные среды, прежде чем мы запустим сборку $go. GOOS и GOARCH позволяют вам перекрестно скомпилировать ваш двоичный файл для другой операционной системы.

Поскольку я занимаюсь разработкой для Macbook, я не могу скомпилировать исполняемый файл go, а затем запустить его в контейнере Docker, использующем Linux. Бинарный файл будет совершенно бессмысленным в вашем контейнере Docker и выдаст ошибку.

Второй шаг, который я добавил, — это процесс сборки докера.

Docker прочитает ваш Dockerfile и создаст образ с именем consignment-service, точка обозначает путь к каталогу, поэтому здесь мы просто хотим, чтобы процесс сборки просматривал текущий каталог.

Я собираюсь добавить новую запись в наш Makefile:

run: docker run -p 50051:50051 shippy-service-consignment

Здесь мы запускаем наш образ Docker, открывая порт 50051. Поскольку Docker работает на отдельном сетевом уровне, вам необходимо перенаправить порт. Например, если вы хотите запустить эту службу на порту 8080, вам следует изменить аргумент -p на 8080:50051. Вы также можете запустить контейнер в фоновом режиме, включив флаг -d. Например, docker run -d -p 50051:50051 служба доставки .

Бегать $ беги , затем снова в отдельной терминальной панели $ иди запусти main.go и проверьте, что он все еще работает. Когда вы запускаете сборку $docker, вы встраиваете свой код и среду выполнения в образ.

Образы Docker — это переносимые снимки вашей среды и ее зависимостей.

Вы можете поделиться изображениями Docker, опубликовав их в Docker Hub. Это похоже на репозиторий npm или yum для образов докеров.

Когда вы определяете FROM в своем файле Dockerfile, вы указываете Docker извлечь этот образ из репозитория Docker и использовать его в качестве основы.

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

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

Некоторые действительно замечательные вещи были докеризированы.

Каждое объявление в Dockerfile кэшируется при первой сборке.

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

Докер достаточно умен, чтобы определить, какие части изменились, а какие необходимо пересобрать.

Это делает процесс сборки невероятно быстрым.

Хватит о контейнерах! Вернемся к нашему коду.

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

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

Именно здесь в игру вступает служба обнаружения.

Служба обнаружения обновляет каталог всех ваших служб и их местоположений.

Каждая служба регистрируется во время выполнения и отменяется при закрытии.

Затем каждой службе присваивается имя или идентификатор.

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

Обычно существует множество подходов к этой проблеме, но, как и в большинстве случаев в программировании, если кто-то уже решил эту проблему, нет смысла изобретать велосипед. @Chuhnk (Асим Аслам), создатель Го-микро , решает эти проблемы с фантастической ясностью и простотой использования.

Он в одиночку создает фантастическое программное обеспечение.

Пожалуйста, подумайте о том, чтобы помочь ему, если вам нравится то, что вы видите!

Го-микро

Go-micro — это мощная платформа микросервисов, написанная на Go и предназначенная в основном для использования с Go. Однако вы можете использовать Sidecar для взаимодействия с другими языками.

Go-micro имеет полезные функции для создания микросервисов на Go. Но мы начнем, пожалуй, с самой распространенной проблемы, которую он решает, — с обнаружения сервисов.

Нам нужно будет внести несколько обновлений в наш сервис для работы с go-micro. Go-micro интегрируется как плагин Protoc, в данном случае заменяя стандартный плагин gRPC, который мы сейчас используем.

Итак, давайте начнем с замены этого в нашем Makefile. Обязательно установите зависимости go-micro:

go get -u github.com/micro/protobuf/{proto,protoc-gen-go}

Давайте обновим наш Makefile, чтобы использовать плагин go-micro вместо плагина gRPC:

build: protoc -I. --go_out=plugins=micro:.

\ proto/consignment/consignment.proto GOOS=linux GOARCH=amd64 go build docker build -t consignment .

run: docker run -p 50051:50051 shippy-service-consignment

Теперь нам нужно обновить наш Shippy-service-consignment/main.go, чтобы использовать go-micro. Это абстрагирует большую часть нашего предыдущего кода gRPC. Он легко обрабатывает регистрацию и ускоряет написание сервиса.

Shippy-service-consignment/main.go

// shippy-service-consignment/main.go package main import (

Теги: #docker #Go #golang #grpc #перевод с английского

Вместе с данным постом часто просматривают: