Обмен технологиями

Анализ исходного кода модуля Apache Seata

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Эта статья взята из Официальная документация Apache SeataДобро пожаловать на официальный сайт для просмотра более подробных статей.
Эта статья взята изОфициальная документация Apache SeataДобро пожаловать на официальный сайт для просмотра более подробных статей.

1. Введение

в соответствии сБоссСуществует три типа определенных категорий и конфигураций: конфигурация среды, конфигурация описания и расширенная конфигурация.

Конфигурация среды: такие параметры, как время запуска некоторых компонентов, обычно дискретные простые значения, в основном данные «ключ-значение».

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

Расширенная конфигурация: продукт должен обнаруживать сторонние реализации и имеет относительно высокие требования к агрегации конфигурации, например, к различным центрам конфигурации и центрам регистрации. Обычный метод — поместить файл полного имени класса интерфейса в каталог META-INF/services. пакета jar со следующим содержимым: Одно имя класса реализации в каждой строке.

2. Конфигурация среды

При загрузке сервер Seata будет использовать resources/registry.conf для определения типа центра конфигурации и центра регистрации. После версии 1.0 клиент Seata может не только использовать файл conf для загрузки конфигурации, но также использовать Seata.config.{type} в файле конфигурации yml Springboot для выбора центра конфигурации. Центр регистрации аналогичен. Исходный код для загрузки конфигурации через yml находится в пакете io.seata.spring.boot.autoconfigure.properties.registry.

Если пользователь клиента Seata помещает как файл конфигурации conf в ресурсы, так и конфигурацию в файле yml, конфигурация из файла yml будет использоваться в первую очередь. Код:

CURRENT_FILE_INSTANCE = null == extConfiguration ? configuration : extConfiguration;

Здесь extConfiguration — это экземпляр внешней конфигурации, то есть предоставляемый классом внешнего поставщика конфигурации ExtConfigurationProvider#provide(), а конфигурация предоставляется другим классом поставщика конфигурации ConfigurationProvider#provide(). Эти два класса поставщика конфигурации находятся в статическом блоке. модуль конфигурации ConfigurationFactory, загруженный через SPI.

EnhancedServiceLoader.load(ExtConfigurationProvider.class).provide(configuration);

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

Клиент и сервер получают параметры конфигурации через ConfigurationFactory#getInstance() для получения экземпляра класса конфигурации, а затем используют экземпляр класса конфигурации для получения параметров конфигурации. Определение констант ключей конфигурации в основном находится в файле конфигурации в основном модуле.

Значение некоторых важных свойств конфигурации среды,На официальном сайте есть введение

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

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

public class GlobalTransactionalInterceptor implements ConfigurationChangeListener {
private volatile boolean disable = ConfigurationFactory.getInstance().getBoolean(ConfigurationKeys.DISABLE_GLOBAL_TRANSACTION,false);
@Override public Object invoke(Param param) {
   if(disable){//事务业务处理}
}
@Override public void onChangeEvent(Param param) {
   disable = param;
}}

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

ConfigurationFactory.getInstance().addConfigListener(ConfigurationKeys.DISABLE_GLOBAL_TRANSACTION,(ConfigurationChangeListener)interceptor);

Понижение версии означает, что когда определенная функция службы недоступна, определенная функция отключается с помощью динамически настраиваемых атрибутов, чтобы избежать повторных попыток устранения сбоя. interceptor#invoke() Только когда этот атрибут отключения имеет значение true, будут выполняться службы, связанные с транзакциями Seata.

3. Опишите конфигурацию

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

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

@GlobalTransactional(timeoutMills = 300000, name = "busi-doBiz")
public String doBiz(String msg) {}

Если это режим tcc, участникам транзакции также необходимо использовать идентификаторы аннотаций:

@TwoPhaseBusinessAction(name = "tccActionForSpringTest" , commitMethod = "commit", rollbackMethod = "rollback")
public boolean prepare(BusinessActionContext actionContext, int i);
public boolean commit(BusinessActionContext actionContext);
public boolean rollback(BusinessActionContext actionContext);

4. Расширенная конфигурация

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

Вставьте сюда описание изображения
Это пример класса, предоставляемого пользовательским центром конфигурации. Поместите текстовый файл с тем же именем, что и интерфейс, в папку META-INF/services. Содержимое файла представляет собой класс реализации интерфейса. Это стандартный способ spi. Затем измените config.type=test в файле конфигурации Registry.conf.

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

private static Configuration buildConfiguration() {
   configTypeName = "test";//registry.conf中配置的config.type
   configType = ConfigType.getType(configTypeName);//ConfigType获取不到会抛异常
}

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

Текущие типы центров конфигурации, определенные в ConfigType в версии 1.0: File, ZK, Nacos, Apollo, Consul, Etcd3, SpringCloudConfig, Custom. Если пользователь хочет использовать настраиваемый тип центра конфигурации, он может использовать тип «Пользовательский».

Вставьте сюда описание изображения
Здесь вы можете использовать неэлегантный способ, то есть предоставить класс реализации с указанным именем ZK, но с порядком более высокого уровня = 3 (порядок ZK по умолчанию = 1), чтобы ConfigurationFactory мог использовать TestConfigurationProvider в качестве класса поставщика центра конфигурации.

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

5. Адрес серии анализа исходного кода Seata

Автор: Чжао Жунзэ,Адрес серии