Внутреннее промежуточное ПО ByteDance для микросервисов с открытым исходным кодом CloudWeGo

задняя часть Микросервисы Архитектура
Внутреннее промежуточное ПО ByteDance для микросервисов с открытым исходным кодом CloudWeGo

Сегодня ByteDance официально анонсировала CloudWeGo с открытым исходным кодом. Это набор языка Golang в качестве ядра, с упором наКоммуникация и управление микросервисамиКоллекция промежуточного программного обеспечения с высокой производительностью, масштабируемостью и высокой надежностью.

адрес проекта:github.com/cloudwego

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

Обзор CloudWeGo

На протяжении многих лет за миллиардным трафиком техническая база, разработанная командой инфраструктуры ByteDance, поддерживала огромную экосистему микросервисов.С 2018 года количество онлайн-микросервисов, поддерживаемых командой, увеличилось почти на 600% и превысило 50 000. Перед лицом такого масштаба и роста эффективность, высокая масштабируемость и стабильность стали основой построения CloudWeGo.

CloudWeGo впервые открыл четыре проекта с открытым исходным кодом, в основном инфраструктуру RPC Kitex и сетевую библиотеку Netpoll.Чтобы узнать об их технических практиках, вы можете обратиться к двум ранее опубликованным статьям:«Практика оптимизации производительности Byte Beat Go RPC Framework Kitex»,«Практика ByteDance в сетевой библиотеке Go».

Kitex

Kitex — это микросервисный RPC-фреймворк Golang сВысокая производительность и масштабируемостьспециальность.

ByteDance использует Golang в качестве основного языка разработки бизнеса. Еще в 2016 году команда по инфраструктуре начала разрабатывать внутреннюю структуру Kite на основе Golang, а в 2019 году начала рефакторинг производительности и масштабируемости, чтобы он мог лучше соответствовать потребностям развития бизнеса и эволюции технологических систем.

В октябре 2020 года Kitex был официально запущен. Несмотря на то, что это совершенно новый фреймворк, после года онлайн-приложения более 50% микросервисов Golang в ByteDance были перенесены на Kitex.

Вот некоторые особенности Kitex:

  • высокая производительность: Kitex по умолчанию интегрирует сетевую библиотеку собственной разработки Netpoll в качестве модуля сетевой передачи, и ее производительность имеет значительное преимущество по сравнению с использованием go net; в дополнение к преимуществам производительности, обеспечиваемым сетевой библиотекой, Kitex также оптимизирует кодек Thrift, который находится в предыдущей практике оптимизации производительности, представленной в статье. Данные о производительности см. на github.com/cloudwego/kitex-benchmark.
  • Расширяемость: Kitex разделен на модули по дизайну, предоставляя больше интерфейсов расширений и реализаций расширений по умолчанию.Пользователи также могут настраивать расширения в соответствии со своими потребностями. Kitex не связан с Netpoll, и разработчики могут использовать другие расширения сетевой библиотеки.
  • протокол сообщения: протокол сообщений RPC по умолчанию поддерживает Thrift, Kitex Protobuf и gRPC. Thrift поддерживает бинарные протоколы Buffered и Framed; Kitex Protobuf — это настраиваемый протокол сообщений Kitex Protobuf, формат протокола аналогичен Thrift; gRPC — это поддержка протокола сообщений gRPC, который может взаимодействовать с gRPC. Кроме того, пользователи также могут расширить свой собственный протокол сообщений.
  • Протокол передачи: Транспортный протокол инкапсулирует протокол сообщений для взаимодействия RPC. Транспортный протокол может дополнительно прозрачно передавать метаинформацию для управления службами. Транспортные протоколы, поддерживаемые Kitex, включают TTHeader и HTTP2. TTHeader можно использовать в сочетании с Thrift и Kitex Protobuf; HTTP2 в настоящее время в основном используется в связке с протоколом gRPC, и Thrift будет поддерживаться в будущем.
  • Несколько типов сообщений: поддерживает PingPong, одностороннюю и двунаправленную потоковую передачу. Среди них Oneway в настоящее время поддерживает только протокол Thrift, а двусторонняя потоковая передача поддерживает только gRPC и в будущем рассмотрит возможность поддержки двусторонней потоковой передачи Thrift.
  • Служба управления: поддерживает модули управления службами, такие как регистрация/обнаружение службы, балансировка нагрузки, автоматический выключатель, ограничение тока, повторные попытки, мониторинг, отслеживание ссылок, ведение журнала и диагностика.Большинство из них предоставили расширения по умолчанию, и пользователи могут интегрировать их.
  • инструмент генерации кода: встроенный в Kitex инструмент генерации кода, поддерживающий создание кода Thrift, Protobuf и скаффолдинга. Собственный код Thrift генерируется Thriftgo, который на этот раз имеет открытый исходный код, а оптимизированный для Kitex код для Thrift генерируется Kitex Tool в виде подключаемого модуля. Kitex в настоящее время не поддерживает синтаксический анализ IDL и генерацию кода для Protobuf и генерирует код Protobuf в качестве официального подключаемого модуля protoc.

Netpoll

Netpoll — это высокопроизводительная сетевая библиотека Golang с неблокирующим вводом-выводом внутри ByteDance, ориентированная на сценарии RPC.

RPC обычно имеет сложную логику обработки (бизнес-логика, кодирование и декодирование), которая занимает много времени и не может обрабатываться последовательно, как Redis (должна быть асинхронной). Стандартная сеть библиотек Go разработала API режима BIO (Blocking I/O).Чтобы обеспечить асинхронную обработку, дизайн инфраструктуры RPC должен выделять горутину для каждого соединения.Когда есть много простаивающих соединений, большое количество генерируются бездействующие горутины, увеличивая накладные расходы планирования. Кроме того, net.Conn не предоставляет API для проверки активности подключений, поэтому спроектировать эффективный пул соединений сложно: неудавшиеся соединения в пуле нельзя вовремя очистить, а повторное использование неэффективно. Сообществу с открытым исходным кодом в настоящее время не хватает сетевых библиотек Go, ориентированных на решения RPC. Подобные проекты, такие как evio, gnet и т. д., ориентированы на такие сценарии, как Redis и Haproxy.

Поэтому появился Netpoll, который опирается на отличный дизайн evio и Netty, обладает отличной производительностью и больше подходит для микросервисной архитектуры.

Thriftgo

Thriftgo – это анализатор и генератор кода Thrift IDL, реализованный на языке Go. Он поддерживает полный синтаксис и семантическую проверку Thrift IDL. По сравнению с официальным генератором кода Apache Thrift Golang, Thriftgo исправил некоторые ошибки и поддерживает механизм подключаемых модулей. код.

Инструмент генерации кода Kitex является подключаемым модулем Thriftgo. CloudWeGo откроет исходный код другого подключаемого модуля Thriftgo, thrift-gen-validator, который поддерживает Thrift IDL Validator для проверки значений поля, что снимает бремя разработчиков, необходимое для реализации логика проверки кода сама по себе.

Хотя Thriftgo в настоящее время поддерживает только генерацию кода Thrift Golang, его позиционирование заключается в поддержке генерации кода Thrift на различных языках.Если в будущем возникнет спрос, мы рассмотрим возможность создания кода на других языках. Мы также постараемся вернуть его сообществу Apache Thrift.

Netpoll-http2

Netpoll-http2 заменяет go net на Netpoll на основе исходного кода стандартной библиотеки Golang golang.org/x/net/http2, которая в настоящее время используется Kitex для поддержки протокола gRPC.

Внутреннее и внешнее обслуживание версий

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

ByteDance, естественно, также имеет полные внутренние службы для поддержки системы микросервисов, но эти службы не могут быть открыты в краткосрочной перспективе. Чтобы соблюдать долгосрочные инвестиционные обязательства, поддерживать набор кода внутри и снаружи и выполнять итерации унифицированным образом, команда инфраструктуры напрямую перенесла проекты, которые не связаны с внутренней экологией, такие как Netpoll, в Библиотека с открытым исходным кодом CloudWeGo и скорректированы внутренние зависимости для библиотек с открытым исходным кодом.

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

Для разработчиков, использующих CloudWeGo, вы также можете расширить Kitex и интегрировать Kitex в систему микросервисов вашей организации. Мы также искренне приветствуем разработчиков, которые вносят свои собственные расширения вkitex-contrib, чтобы обеспечить удобство для большего количества пользователей.

RoadMap

Для инфраструктурных команд CloudWeGo — это не просто проект с открытым исходным кодом, это также настоящий гипермасштабный практический проект корпоративного уровня. Мы надеемся, что с помощью открытого исходного кода CloudWeGo сможет обогатить инструментальную систему Golang сообщества облачных разработчиков, создать облачные крупномасштабные распределенные системы для большего числа разработчиков и предприятий и предоставить современное ресурсоэффективное техническое решение.

Как упоминалось выше, в настоящее время CloudWeGo открыл исходный код только для первой партии проектов, и в будущем мы будем способствовать его дальнейшему совершенствованию:

  • Продолжить работу с открытым исходным кодом для других внутренних проектов. Мы откроем исходный код других часто используемых проектов ByteDance Golang, таких как HTTP-фреймворк Hertz, коммуникационная библиотека IPC на основе общей памяти ShmIPC и т. д., чтобы предоставить разработчикам поддержку требований микросервисов в большем количестве сценариев. Ранее мы открыли исходный код некоторых базовых библиотек инструментов Golang и унифицированного обслуживания в bytedance/gopkg, и заинтересованные разработчики также могут обратить на это внимание.
  • Постепенно проверенные, стабильные функции с открытым исходным кодом. Все основные проекты CloudWeGo обеспечивают поддержку внутренних микросервисов byte. Многие новые функции все еще проходят внутреннюю проверку. Мы будем постепенно открывать их исходный код, когда они будут относительно зрелыми, например, интеграция ShmIPC, отсутствие сериализации и несгенерированный код. служба поддержки.
  • Сочетание потребностей внутренних и внешних пользователей, непрерывная итерация. После того, как проект станет открытым, мы также проведем итерацию в соответствии с потребностями разработчиков. Например, за последний месяц мы получили много запросов от разработчиков по поводу Protobuf.Чтобы обеспечить хорошую поддержку и помочь вам быстро построить собственную микросервисную систему, мы уже готовимся провести оптимизацию производительности Kitex для поддержки Protobuf.

Вы можете отправлять вопросы в CloudWeGo, а также отправлять PR для совместной разработки CloudWeGo. Мы искренне надеемся, что к нам присоединится больше разработчиков, и мы также ожидаем, что CloudWeGo поможет все большему количеству предприятий быстро создавать облачные архитектуры.

Ссылки по теме

Присоединяйтесь к сообществу Feishu: