DevGang
Авторизоваться

Micro в действии: начало работы 

Мы будем строить микро сервис шаг за шагом, объясним особенности Micro во время этого путешествия. Мы начнем с основных понятий и тем, а затем перейдем к расширенным функциям.

Микро очень мощный и простой в использовании после освоения. Но он развивается так быстро, что его документация сильно отстает или устарела.

Многие функции не документированы. Многие базовые вопросы могут быть рассмотрены на Github или заданы в Slack, с небольшим количеством отзывов.

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

Примечание: эта статья основана на Micro v1.18.0

Так что же такое Микро?

Давайте сначала посмотрим на его домашнюю страницу: cамый простой способ создания, обмена и совместной работы на микросервисах!

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

Micro - это микросервисная экосистема, ориентированная на предоставление продуктов, услуг и решений, позволяющих внедрять инновации на современных предприятиях, работающих на программном обеспечении.
Заявление на <a href="https://micro.mu/docs/goals.html" target="_blank">странице 4</a> официальной документации

Ты понял? Я не.

После прочтения всех его документов позвольте мне дать вам более простое определение:

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

  1. go-micro: система разработки микросервисов Golang. Это ядро. Используя его, разработчики могут быстро создавать микросервисы. Типичным типом обмена данными этих микросервисов является gRPC.
  2. micro: инструмент командной строки. Хотя это и не обязательно, оно обеспечивает много удобств для разработки и управления Micro. Например, создание шаблона проекта, проверка состояния во время выполнения и вызов служб. Этот инструмент также основан на Go-Micro .

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

Ну, а почему официальное определение такое грандиозное и абстрактное?

Потому что создатель Micro Asim Aslam имеет более амбициозный характер, чем просто предоставление инструментов. Его последние усилия направлены на построение «распределенной сети» - хотя, на мой взгляд, есть немало важных вопросов, которые необходимо решить, и выполнимость сомнительна.

Архитектор го-микро

Чтобы облегчить понимание, давайте сначала представим архитектуру go-micro .

Цель go-micro - упростить разработку микросервисов и создание распределенных систем. На практике некоторая работа всегда необходима в каждой распределенной системе.

Поэтому go-micro абстрагирует эти общие задачи в интерфейсы. Это освобождает разработчиков от основных деталей реализации, снижает затраты на обучение и разработку. сделать возможным создание гибкой и надежной системы очень быстро.

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

Вот примеры важных интерфейсов:

Сервис Discovery

Обнаружение службы - это проблема, которую должна решать каждая распределенная система. Go-Micro абстрагирует эту задачу в интерфейс github.com/micro/go-micro/registry/Registry:

// The registry provides an interface for service discovery
// and an abstraction over varying implementations
// {consul, etcd, zookeeper, ...}
type Registry interface {
   Init(...Option) error
   Options() Options
   Register(*Service, ...RegisterOption) error
   Deregister(*Service) error
   GetService(string) ([]*Service, error)
   ListServices() ([]*Service, error)
   Watch(...WatchOption) (Watcher, error)
   String() string
}

Любой плагин, который реализует этот интерфейс, может играть роль обнаружения службы. Фактически, многие реализации уже предусмотрены в go-плагинах, включая поддержку основных продуктов, таких как etcd / consul / zookeeper, а также облегченные реализации в памяти. Реализация по умолчанию основана на многоадресном DNS (mdns), настройка не требуется, она работает «из коробки»

Асинхронный обмен сообщениями

Асинхронный обмен сообщениями является ключевой технологией для создания надежной системы со слабой связью. Соответствующий интерфейс go-micro github.com/micro/go-micro/broker/Broker:

// Broker is an interface used for asynchronous messaging.
type Broker interface {
   Init(...Option) error
   Options() Options
   Address() string
   Connect() error
   Disconnect() error
   Publish(topic string, m *Message, opts ...PublishOption) error
   Subscribe(topic string, h Handler, opts ...SubscribeOption) (Subscriber, error)
   String() string
}

Уже есть несколько брокер плагинов в go-plugins, включая RabbitMQ, Kafka, NSQ, и т.д., реализация по умолчанию основывается на HTTP, и не требуется никакой настройки.

Codec

Кодек интерфейс (github.com/micro/go-micro/codec/Codec) определяет формата кодирования / декодирования сообщений для обмена данных между microservices.

// Codec encodes/decodes various types of messages used within go-micro.
// ReadHeader and ReadBody are called in pairs to read requests/responses
// from the connection. Close is called when finished with the
// connection. ReadBody may be called with a nil argument to force the
// body to be read and discarded.
type Codec interface {
   Reader
   Writer
   Close() error
   String() string
}

Текущая поддержка включает в себя json / bson / msgpack и многое другое.

В дополнение к трем интерфейсам выше, есть много других интерфейсов:

  1. Server - определяет сервер микросервисов
  2. Transport - определяет транспортный протокол
  3. Selector - абстрагирует логику выбора сервиса. С помощью этого интерфейса вы можете реализовать различные стратегии балансировки нагрузки
  4. Wrapper - определяет промежуточное ПО, которое может обернуть запрос сервера / клиента

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

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

Создание службы gRPC с помощью Micro

Самый быстрый способ начать работу с Micro - это создать шаблон проекта с помощью инструмента командной строки micro.

Установите последнюю версию микро

# Mac OS or Linux
curl -fsSL https://micro.mu/install.sh | /bin/bash

# Windows
powershell -Command "iwr -useb https://micro.mu/install.ps1 | iex"

Создаем проект

micro new hello --namespace=com.foo --gopath=false

Каждая часть команды имеет свое значение:

  1. micro new - создать сервис gRPC путем запуска на команды new
  2. hello - название сервиса
  3. — namespace=com.foo - предоставить пространство имен для сервиса
  4. — gopath=false - генерировать код в текущем каталоге вместо $GOPATH (поскольку Golang поддерживает Go Module, новые проекты следует размещать за пределами $GOPATH)

После выполнения команды мы получим вывод на экран, как показано ниже:

Creating service com.foo.srv.hello in hello

.
├── main.go
├── generate.go
├── plugin.go
├── handler
│   └── hello.go
├── subscriber
│   └── hello.go
├── proto/hello
│   └── hello.proto
├── Dockerfile
├── Makefile
└── README.md

download protobuf for micro:

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

compile the proto file hello.proto:

cd hello
protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/hello/hello.proto

Установка зависимостей

Поскольку Micro использует Protobuf для определения интерфейса сервиса, нам нужно сначала установить зависимости, связанные с Protobuf. Возьмем среду Mac в качестве примера:

# install protobuf
brew install protobuf

# install protoc-gen-go
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}

# install protoc-gen-micro
go get -u github.com/micro/protoc-gen-micro

Обратите внимание на protoc-gen-micro, что это не является частью ядра Protobuf, это расширение Protobuf, разработанное командой Micro, которое специально используется для генерации кода, связанного с Micro

Компиляция и запуск

Как вы можете видеть, Makefile был сгенерирован в проекте, который содержит несколько часто используемых задач. Таким образом, вы можете использовать команду make для компиляции и запуска проекта. Как упоминалось ранее, проект будет использовать Go Module, но micro new не будет автоматически генерировать для нас go.mod, давайте его сгенерируем.

cd hello
go mod init hello

будет сгенерирован пустой файл go.mod, содержимое которого выглядит следующим образом:

module hello
go 1.13

Получилось! Сначала вам нужно явно установить go-micro v1.18.0:

go get github.com/micro/go-micro@v1.18.0

Тогда содержимое go.mod будет изменено на:

module hello
go 1.13
require github.com/micro/go-micro v1.18.0

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

Например, последние 6 релизов go-micro были освобождены в течение 35 дней. Некоторые версии существовали в качестве последней версии всего несколько часов, а затем были заменены на исправление серьезной проблемы.

К счастью, Go Module может помочь нам заблокировать зависимости и обеспечить качество доставки.

С вышеупомянутыми подготовками мы можем теперь скомпилировать и запустить первый сервис:

make build && ./hello-srv

мы получим вывод на экран, как показано ниже:

protoc --proto_path=/Users/cuixg/go/src:. --micro_out=. --go_out=. proto/hello/hello.proto
go build -o hello-srv *.go
2020-01-10 13:51:21.627440 I | Transport [http] Listening on [::]:51564
2020-01-10 13:51:21.627541 I | Broker [http] Connected to [::]:51565
2020-01-10 13:51:21.627710 I | Registry [mdns] Registering node: com.foo.srv.hello-54151215-f985-42ab-9fe8-f92a682d332d
2020-01-10 13:51:21.629620 I | Subscribing com.foo.srv.hello-54151215-f985-42ab-9fe8-f92a682d332d to topic: com.foo.srv.hello
2020-01-10 13:51:21.629839 I | Subscribing com.foo.srv.hello-54151215-f985-42ab-9fe8-f92a682d332d to topic: com.foo.srv.hello
Адреса прослушивания и uuid, которые вы получаете, могут отличаться от моих.

Как видно из вывода на экране, сначала make build запустит protoc, скомпилировав файл .proto, и запустит go build , который сгенерирует исполняемый двоичный файл hello-srv.

Наконец, hello-srv запускается и готовится к подаче.

Резюме

Эта статья знакомит с основными понятиями и функциями Micro, помогает пользователю установить его, создает и запускает первый простой сервис gRPC.

Источник:

#Golang
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

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

Попробовать

Сделайте первый шаг к новой профессии

Получить скидку