Практика разработки среды разработки микросервисов на языке Go — шасси go (часть 1)

Микросервисы Go

Шасси Go — это среда разработки микросервисов на языке Go.

В этой статье я подробно проанализирую шасси Go от идей дизайна до анализа исходного кода. И я представлю свою настройку производительности языка go и лучшие практики в процессе практики. Наконец, я буду использовать шасси go для написания http-сервиса. Это первая часть, в которой в основном будет представлен механизм работы шасси go.

адрес проекта:GitHub.com/go-chassis/…

Почему мы используем язык go для разработки микросервисов?

Go все еще является развивающимся языком, и он очень молод по сравнению с java, но с успехом таких проектов, как kubenetes и docker, можно сказать, что язык go стал очень хорошим языком разработки среднего уровня и постепенно становится популярный.

Быстрая компиляция, многоплатформенная поддержка, малый объем памяти, легкие сопрограммы и т. д.

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

Зачем использовать шасси Go

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

Я считаю, что полноценная среда разработки требует более 20 000 строк кода. А ходовая часть это такой каркас

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

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

- go chasis поддерживает панель управления Istio, что означает, что вы можете смешивать ее с envoy, но вам нужно использовать только istio, который поддерживает собственное управление конфигурацией istio. Таким образом, повышается пропускная способность службы и снижается загрузка ЦП.

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

особенности шасси

Основные моменты заключаются в следующем:

● Реестр подключаемых модулей: Support Service Center, kubernetes, istio по умолчанию.

● Dynamic Governance Framework: с помощью этой платформы разработчики могут реализовывать горячую загрузку конфигурации среды выполнения процесса.

● Подключаемый протокол: разработчики могут реализовать собственный протокол RPC, который по умолчанию реализует http и шоссе (RPC).

● Переход на более раннюю версию: поддерживает сервисный предохранитель на основе тайм-аута, параллелизма, частоты ошибок и т. д.

● Отказоустойчивость: поддерживает такие настройки, как количество повторных попыток, и поддерживает повторные попытки с отсрочкой,

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

● Балансировка нагрузки клиента: поддержка индивидуальной стратегии

● Текущий лимит: поддержка текущего лимита клиента и сервера.

● Plug-in Cipher: поддержка разработчиков в настройке инструментов шифрования и дешифрования, а также применение сертификатов AKSK и TLS.

● Цепочка обработки: может поддерживать добавление пользовательской бизнес-логики в процессе связи.

● Метрики: поддерживает автоматический экспорт данных мониторинга во время выполнения в формате Prometheus.

● Трассировка: используйте opentracing, чтобы помочь пользователям быстро подключаться к различным распределенным системам трассировки.

● Logger: инструмент ведения журнала поддерживает масштабирование и размещение в различных хранилищах.

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

Цели дизайна

● Максимальная гибкость и масштабируемость

Протокол позволяет разработчикам гибко расширять и произвольно вставлять в коммуникационный конвейер свою особую бизнес-логику.

● Простота использования

Разработчики могут запускать фреймворк с минимальной конфигурацией и кодом, а фреймворк предоставляет пользователям удобные API-интерфейсы.Каждый модуль можно даже разобрать для использования, а его функции можно настроить произвольно.

● Управление услугами

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

● Визуализация услуг

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

● Горячая загрузка конфигурации во время выполнения

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

Обзор архитектуры

Как показано ниже:

● Идеи архитектуры

  1. Развязанный интерфейс программирования, модель времени выполнения, транспортный уровень

● Интерфейс программирования: имеет 2 модели программирования: RPC и Rest.

● Работающая модель: унифицируйте различные протоколы с помощью цепочек обработчиков и концепций вызова.

● Транспортный уровень: Процесс имеет несколько протоколов. Один и тот же протокол может запускать несколько экземпляров службы протокола, работать на разных портах и ​​использовать порты для изоляции API.

  1. Архитектура подключаемых модулей на основе режима цепочки обработчиков

● Цепочка обработчиков может произвольно вставлять бизнес-логику.

  1. Управление услугами на основе динамической конфигурации во время выполнения
  2. Та же операционная модель и унифицированные возможности управления
  3. Тот же метод поддержки эксплуатации и технического обслуживания

● Служба HTTP может поддерживать автоматическое подключение данных Promethees к указанному пути API.

● Журналы могут быть расширены, например, для вывода в такие службы, как kafka.

  1. Реестр разделен на два интерфейса, Registrator и Service Discovery, которые отвечают за регистрацию и обнаружение соответственно и могут поддерживать обнаружение платформы и регистрацию клиентов.

● обработка запросов

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

Несколько ключевых объектов, упомянутых здесь, будут подробно представлены позже.

Детали реализации

Базовые концепты

● Цепочка обработки и вызов

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

github.com/go-chassis/go-chassis/blob/master/core/invocation/invocation.go

Вызов — это структура, которая абстрагирует содержимое каждого протокола.Запросы, выполняемые по разным протоколам, могут быть объединены в вызов, например полезная нагрузка запроса и информация, связанная с управлением фреймворком.

● Обработчик

Обработчик — это наименьшая единица обработки на уровне фреймворка во время работы микросервисов. Шасси Go реализует компонентную архитектуру работающей модели посредством сборки обработчиков и обработчиков. Его основное использование заключается в реализации интерфейсов и регистрации логики:

  1. Реализовать базовый интерфейс

2. После того, как разработчик реализует интерфейс, его можно зарегистрировать во фреймворке через API

● Цепочка обработчиков

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

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

● Инициатор

Из-за разных стилей программирования RPC и Http шасси go использует 2 разных Invoker для разрешения вызовов, независимо от того, какой Invoker инициализирует Invocation и, наконец, войдет в цепочку обработки для обработки, и, наконец, войдет в клиентскую реализацию каждого протокола и передаст его. к целевой службе все прозрачно для пользователя.

RPC

Чтобы снизить стоимость обучения пользователя, используется стиль вызова net/rpc в стандартной библиотеке языка go.

Http

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

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

● Клиент отправляет запрос

  1. Разработчики используют Invoker для инициирования запросов, а Invoker создает единый объект Invocation.
  2. Вызов входит в цепочку обработки для обработки, такой как плавление, ограничение тока и т. д.
  3. После входа в Балансировку нагрузки IP:порт будет выбран в соответствии со Стратегией и целевым протоколом.
  4. После продолжения передачи протокола и IP-порта в Транспорт выберите конкретную реализацию Клиента в соответствии с протоколом и передайте IP-порт для отправки.

● Сервер получает запрос

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

вставной механизм

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

Class<?> act = Class.forName("com.bla.TestActivity");

На основе этой способности также появились такие проекты, как Spring, и разработчики могут легко решить проблему плагина.

Но как это сделать на языке go?

Ниже приведен пример практики шасси Go.

Обеспечить интерфейс и определение карты

Разработчикам необходимо реализовать интерфейс и реализовать NewFunc, чтобы вернуть конкретную реализацию.

Зарегистрировать плагин

Установка плагина через вызов API

Используйте плагины

Учитывая простоту использования, близкую к стилю Spring, шасси использует файлы конфигурации формата yaml для управления плагинами.

Ниже приведена идея реализации

Механизм запуска и инициализации следующий:

  1. Загружаемый плагин указываем через файл.На Сервере инкапсулируем Менеджер Сервера для управления Сервером всех протоколов, и отвечает за регистрацию в центре регистрации.При получении сигнала завершения системы отвечает за анти- Регистрация
  2. Использование менеджера клиентов сgithub.com/go-chassis/go-chassis/blob/master/core/handler/transport_handler.go инкапсулирует клиента и инициализирует клиента в соответствии с протоколом, микросервисом и экземпляром, то есть у каждого экземпляра есть свой клиент.

Поддерживаемые плагины

Платформа шасси поддерживает следующие плагины, подробности см. в документации gitbook.go-chassis.прочитайте документ S.IO/en/latest/.

  1. Handler
  2. Provider
  3. Cipher
  4. Bootstrap
  5. Logger
  6. Config Source
  7. Registry
  8. InjectFault
  9. Server
  10. Client
  11. Strategy
  12. Tracing

Балансировка клиентской нагрузки

Балансировщик нагрузки клиента отвечает за использование кэша локального реестра для обнаружения служб.

go шасси включает в себя множество дополнительных функций

  1. Алгоритм Backoff включен для стабилизации сетевого трафика.
  2. Отказоустойчивость поддерживает стратегию, которую следует повторить после ошибки запроса.
  3. Реализация стратегии закрепления сеанса и учета задержек
  4. Динамическое управление, поддержка горячей загрузки вышеуказанной конфигурации во время выполнения
  5. Поддерживает детальную настройку политики балансировки нагрузки на уровне целевого сервиса (то есть процесс может управлять политикой балансировки нагрузки для доступа к различным микросервисам).

внедрение ошибок

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

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

Сравнение с другими средами разработки микросервисов

микро**** архитектура:

Изображение взято с официального сайта go micro.micro.wood/docs/images…

Здесь я цитирую сравнение go micro и go kit от micro.mu.

Go micro — это подключаемый модуль распределенной среды разработки RPC, который можно использовать «из коробки» или настроить каждый модуль в собственном протоколе RPC. Он представляет собой экосистему, и сейчас существует большое количество реализаций плагинов, и много новых фреймворков на базе go-micro, существует множество подпроектов, построенных вокруг go-micro в рамках организации Micro.

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

Шасси Go — это подключаемый фреймворк. Отличие от Go micro в том, что возможности, предоставляемые шасси go, представляют собой подключаемые протоколы. Вы можете подключить к фреймворку http или RPC, даже Mysql, Redis и другие протоколы и предоставить один- stop functions , который интегрирует в фреймворк такие функции, как плавление, ограничение тока и мониторинг, и разработчикам не нужно искать эти решения самостоятельно. Обладает самыми богатыми функциями управления из 3. Он также имеет открытые возможности настройки, но, поскольку это новый фреймворк, экология все еще нуждается в улучшении.

Разработчики могут выбирать фреймворки благодаря опыту разработки и поддержке функций.