Обновление 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 - это набор инструментов, который помогает разработчикам создавать микросервисы и управлять ими. Он состоит из двух частей:
- go-micro: фреймворк для разработки микросервисов Golang. Это ядро. Используя его, разработчики могли быстро создавать микросервисы. Типичный тип этих микросервисов - gRPC.
- 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 и попытаемся изменить его поведение по умолчанию.
Продолжение следует.
Смотрите также:
- Micro в действии, часть 2: полное руководство по Bootstrap
- Micro в действии, часть 3: Вызов службы
- Micro In Action, Часть 4: Pub / Sub
- Micro в действии, часть 5: брокер сообщений
- Micro в действии, часть 6: обнаружение сервисов
- Micro In Action, Часть 7: Автоматический выключатель и ограничитель скорости
- Micro In Action, Coda: Распределенная работа Cron
- Главная страница Micro In Action