Обновление 2020.04.02: версия Micro из этой серии обновлена ​​с v1.18.0 до v2.4.0

Поговорим о Микро в этой серии статей.

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

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

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

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

Вот почему я начал эту серию статей. Надеюсь, это поможет вам. (Примечание: эта серия основана на версии Micro v2.24.0)

Так что же такое Micro?

Давайте сначала взглянем на его домашнюю страницу:

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

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

Затем заявление на странице 4 официального документа:

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

Ты понял? Я не делаю.

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

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

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

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

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

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

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

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

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

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

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

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

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

Обнаружение услуг

Обнаружение сервисов - это проблема, которую должна решить каждая распределенная система. go-micro преобразует эту задачу в интерфейс github.com/micro/go-micro/v2/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/v2/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, и никакой настройки не требуется.

Кодек

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

// 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 и многое другое.

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

  • Сервер , определите сервер микросервисов.
  • Транспорт , определяет транспортный протокол.
  • Селектор , абстрагирует логику выбора услуги. вы можете реализовать различные стратегии балансировки нагрузки с помощью этого интерфейса
  • Wrapper , определяет промежуточное ПО, которое может оборачивать запрос сервера / клиента.

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

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

Создайте службу gRPC с помощью Micro

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

Установите микробинарный файл v2.4.0

Примечание : никогда не используйте скрипт install.sh, который предоставляется на официальном сайте, поскольку он всегда устанавливает последнюю версию, а вам нужна конкретная стабильная версия.

GO111MODULE=on  go get github.com/micro/micro/[email protected]

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

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

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

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

micro new поддерживает некоторые другие аргументы, мы объясним их в следующих статьях.

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

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
├── .gitignore
└── go.mod
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/v2
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
GO111MODULE=on go get -u github.com/micro/protoc-gen-micro/v2

Примечание protoc-gen-micro не является частью ядра Protobuf, это расширение Protobuf, разработанное командой Micro, которое специально используется для генерации кода, связанного с Micro. Вам необходимо явно включить модуль Go до GO111MODULE=on, иначе вы столкнетесь с ошибкой (известная проблема).

Выполнять

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

gotcha : Сначала необходимо явно установить go-micro v2.4.0:

go get github.com/micro/go-micro/[email protected]

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

module hello
go 1.14
require github.com/micro/go-micro/v2 v2.4.0

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

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

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

Выполнив вышеуказанные приготовления, теперь мы можем скомпилировать и запустить первую службу :

make build && ./hello-service

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

make build && ./hello-serviceprotoc --proto_path=. --micro_out=Mgithub.com/micro/go-micro/api/proto/api.proto=github.com/micro/go-micro/v2/api/proto:. --go_out=Mgithub.com/micro/go-micro/api/proto/api.proto=github.com/micro/go-micro/v2/api/proto:. proto/hello/hello.protogo build -o hello-service *.go2020-04-02 11:12:47  level=info Starting [service] go.micro.service.hello
2020-04-02 11:12:47  level=info Server [grpc] Listening on [::]:53451
2020-04-02 11:12:47  level=info Broker [eats] Connected to [::]:53453
2020-04-02 11:12:47  level=info Registry [mdns] Registering node: go.micro.service.hello-063d6dae-826b-49f5-9141-df525af8a6b1
2020-04-02 11:12:47  level=info Subscribing to topic: go.micro.service.hello

Адреса прослушивания и uuid узла могут отличаться от моих, не волнуйтесь, мы объясним это позже。

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

Наконец, hello-service запускается и готовится к работе.

Резюме

В этой статье представлены основные концепции и функции Micro, а также даны инструкции по установке, созданию и запуску первой простейшей службы gRPC.

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

Продолжение следует.

Смотрите также: