Теперь с открытым исходным кодом! Узнайте больше об этом здесь.

Эта статья является частью серии статей Alibaba Open Source.

Что такое фреймворки для разработки?

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

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

Общие ограничения сред разработки

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

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

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

Из-за этих ограничений и ограничений существует реальная потребность в более гибком и эффективном подходе к разработке фреймворка.

Проектирование новой среды разработки

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

· Изоляция класса

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

· Изоляция экземпляра

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

· Изоляция ресурсов

Использование отдельных ресурсов ЦП и памяти для каждого модуля означает, что в будущем может поддерживаться изоляция ресурсов между модулями.

· Динамическая публикация

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

· Динамическая выгрузка

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

· Доступный, универсальный и гибкий API

Это будет предусмотрено для взаимодействия между системой и модулями.

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

Модульный подход к разработке

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

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

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

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

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

JarsLink: модульная структура разработки Alibaba.

Фреймворк JarsLink от Alibaba основан на модульном методе разработки, схема которого показана ниже.

Основными компонентами фреймворка JarsLink являются:

· Обновление модуля

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

· Загрузчик модулей

Механизм загрузки модулей, отвечающий за загрузку и выгрузку модулей.

· Менеджер модулей

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

· Модуль

Модуль имеет несколько действий.

· Действие

Исполнитель в модуле.

Возможности и функции JarsLink

Загрузка модуля

JarsLink создает новый URLClassLoader для каждого модуля для загрузки JAR. Он также поддерживает настройку механизма родительского делегирования, согласно которой overridePackages загружаются загрузчиками подклассов, и не имеет приоритета для использования пакетов, которые были загружены загрузчиком родительского класса.

Выгрузка модуля

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

На каждом шаге последовательности выполняются разные функции:

· Закрыть ресурсы

Закройте пул соединений HTTP или пул потоков.

· Закрыть IOC-контейнеры

Вызовите метод applicationContext.close(), чтобы закрыть контейнеры IOC.

· Удалить загрузчики классов

Удалите ссылку на модуль.

· Выгрузить клиентов JVM (в разработке)

Выгрузите клиентов JVM, используемых этим модулем, чтобы освободить ресурсы.

Изоляция между модулями

Чтобы модули не влияли друг на друга, ключевым атрибутом модульной разработки является изоляция модулей. Существует три уровня изоляции между модулями:

· Изоляция класса

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

· Изоляция экземпляра

Создайте новый контейнер IOC для каждого модуля, чтобы загрузить bean-компонент в модуль.

· Изоляция ресурсов

Используйте только указанные ЦП и память для каждого модуля.

Отношения между ними показаны ниже.

В настоящее время для JarsLink реализована изоляция классов и изоляция экземпляров. Изоляция ресурсов все еще находится на стадии планирования и потенциально может быть решена путем внедрения мультитенантности ALIJVM.

Связь между модулями

К основным методам облегчения связи между модулями относятся:

· Местные звонки

Это требовало, чтобы загрузчики классов модулей и контейнеры IOC имели отношение родитель-потомок. В настоящее время doAction от JarsLink использует этот метод связи.

· Вызовы RPC

Это используется для вызовов между модулями JVM с использованием динамических API SOFA 4 для публикации и ссылки на службы TR в модулях.

· Глубокое клонирование/отражение

Глубоко клонируйте и отражайте входные параметры других модулей для достижения вызова.

Ниже приводится иллюстрация этих сообщений.

Механизм загрузки классов

Механизм загрузки классов OSGi использует сетчатую структуру. Каждый модуль использует Export-Package, чтобы объявить, какие классы он передаст другим, и использует Import-Package, чтобы объявить, какие классы он хочет использовать. JarsLink использует плоское управление. Каждый модуль имеет общий родительский класс. Загрузчик родительского класса используется для загрузки класса ModuleLoader. Если это приложение SOFA, родительским загрузчиком модуля является KernelAceClassLoader.

Отношения загрузчиков классов следующие:

Классы, которые нужны всем модулям, можно загрузить через Application ClassLoader.

Сценарии применения JarsLink

Одно из основных возможных применений JarsLink — в центрах управления данными. Эти системы обычно собирают данные из различных системных структур, с такими интерфейсами, как RPC, HTTP и т. д., и различных источников, которые нуждаются в стыковке и развитии. Требуется частая модификация и публикация кода из-за низкого качества данных.

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

Другое возможное применение JarsLink — в фоновых системах управления интернет-приложениями. Например, запросы в службу поддержки клиентов обычно включают функцию проверки исходных данных для устранения системных ошибок, а операционные отделы — для активизации оперативной деятельности. Частота публикации этих функций выше, чем в базовой системе, и если они помещаются в базовую систему, это влияет на стабильность базовой системы. Следовательно, системы должны иметь фоновые функции.

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

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

JarsLink применяется в реальных сценариях

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

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

Открытый источник

Alibaba сделала JarsLink открытым исходным кодом. Подробнее об этом здесь.

(Оригинальная статья Fang Tengfei方腾飞)

Алибаба Тех

Подробная информация о новейших технологиях Alibaba из первых рук → Найдите «Alibaba Tech» на Facebook.