Compartilhamento de tecnologia

Análise do código-fonte do módulo Apache Seata

2024-07-08

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

Este artigo vem de Documentação oficial do Apache Seata, bem-vindo ao visitar o site oficial para ver artigos mais detalhados.
Este artigo vem deDocumentação oficial do Apache Seata, bem-vindo ao visitar o site oficial para ver artigos mais detalhados.

1. Introdução

de acordo comChefeExistem três tipos de categorias e configurações definidas: configuração de ambiente, configuração de descrição e configuração estendida.

Configuração do ambiente: parâmetros como quando alguns componentes são iniciados, geralmente valores simples e discretos, principalmente dados de valor-chave.

Descrição configuração: relacionada à lógica de negócios, como iniciadores e participantes de transações, geralmente incorporada ao gerenciamento do ciclo de vida do negócio. Há muitas informações de configuração descritas e existe até um relacionamento hierárquico.

Configuração estendida: o produto precisa descobrir implementações de terceiros e possui requisitos relativamente altos para agregação de configuração, como vários centros de configuração e centros de registro. O método usual é colocar o arquivo de nome completo da classe de interface em META-INF/services. do pacote jar, com o conteúdo a seguir. Um nome de classe de implementação por linha.

2. Configuração do ambiente

Ao carregar, o servidor seata usará resources/registry.conf para determinar o tipo de centro de configuração e centro de registro. Após a versão 1.0, o cliente seata pode não apenas usar o arquivo conf para carregar a configuração, mas também usar seata.config.{type} no arquivo de configuração yml do springboot para selecionar o centro de configuração. O código-fonte para carregar a configuração por meio de yml está no pacote io.seata.spring.boot.autoconfigure.properties.registry.

Se o usuário do cliente seata colocar o arquivo de configuração conf em recursos e a configuração no arquivo yml, a configuração no arquivo yml será usada primeiro. Código:

CURRENT_FILE_INSTANCE = null == extConfiguration ? configuration : extConfiguration;

Aqui extConfiguration é uma instância de configuração externa, ou seja, fornecida pela classe de provedor de configuração externa ExtConfigurationProvider#provide(), e a configuração é fornecida por outra classe de provedor de configuração ConfigurationProvider#provide(). o módulo de configuração ConfigurationFactory , carregado por meio do SPI.

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

O que é mencionado acima é a seleção do tipo de centro de configuração, e o carregamento do ambiente de configuração é carregar a configuração do ambiente através do centro de configuração correspondente após determinar qual tipo de centro de configuração usar. A configuração de arquivos em modo texto também é um centro de configuração.

O cliente e o servidor obtêm parâmetros de configuração por meio de ConfigurationFactory#getInstance() para obter a instância da classe de configuração e, em seguida, usam a instância da classe de configuração para obter os parâmetros de configuração. A definição das constantes da chave de configuração está principalmente no arquivo de configuração no módulo principal.

O significado de algumas propriedades importantes de configuração do ambiente,O site oficial tem uma introdução

Aqueles obtidos através do ConfigurationFactory durante a instanciação e depois injetados no construtor precisam ser reiniciados para entrarem em vigor. No entanto, aqueles obtidos através do ConfigurationFactory em tempo real durante o uso podem entrar em vigor assim que a configuração for alterada.

No entanto, o módulo de configuração fornece o método de interface ConfigurationChangeListener#onChangeEvent para modificar as propriedades dentro da instância. Ou seja, neste método, os atributos que mudam dinamicamente são monitorados. Caso seja detectado que os atributos utilizados são diferentes daqueles quando a injeção foi iniciada pela primeira vez, os atributos salvos na instância serão modificados para ficarem consistentes com o centro de configuração. conseguindo assim uma configuração dinâmica.

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;
}}

O acima é o pseudocódigo relacionado ao GlobalTransactionalInterceptor no módulo spring e no atributo rebaixado. GlobalTrarnsactionalScanner registra o interceptor na lista de escuta de alterações de configuração quando a classe de interceptor acima é instanciada. Quando a configuração é alterada, o ouvinte será chamado:

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

Downgrade significa que quando uma determinada função do serviço está indisponível, uma determinada função é desativada por meio de atributos configurados dinamicamente, de forma a evitar repetidas tentativas de tratamento da falha. interceptor#invoke() Somente quando este atributo de desabilitação for verdadeiro, os serviços relacionados à transação seata serão executados.

3. Descreva a configuração

A configuração descritiva da estrutura geral geralmente contém muitas informações e ainda possui relacionamentos hierárquicos. É mais conveniente usar a configuração xml porque a estrutura em árvore é mais descritiva. Contudo, os hábitos actuais defendem a eliminação de configurações incómodas e restritivas e a adopção de métodos acordados.

O modo Seata AT realiza o processamento de transações por meio de proxy de fontes de dados, o que é menos intrusivo para as partes comerciais. A Seata só precisa identificar quais partes comerciais precisam ativar transações globais ao iniciar, para que a configuração descritiva possa ser obtida usando anotações.

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

Se for o modo tcc, os participantes da transação também precisarão usar identificadores de anotação:

@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. Configuração estendida

A configuração estendida geralmente possui requisitos mais elevados para agregação de produtos, porque o produto precisa descobrir implementações de terceiros e adicioná-las ao produto.

Insira a descrição da imagem aqui
Este é um exemplo de classe fornecida por um centro de configuração personalizado. Coloque um arquivo de texto com o mesmo nome da interface em META-INF/services. Esta é a maneira padrão do spi. Em seguida, modifique config.type=test no arquivo de configuração Registry.conf.

Mas se você pensa que isso pode ser reconhecido pelo seata e substituir o centro de configuração, você está enganado. Quando seata carrega o centro de configuração, ele usa enum ConfigType para encapsular o valor do tipo de centro de configuração configurado no arquivo de configuração:

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

Se o teste de tipo do centro de configuração não estiver definido em ConfigType, uma exceção será lançada. Portanto, simplesmente modificar o arquivo de configuração sem alterar o código-fonte não pode usar as classes fornecidas pelo centro de configuração diferentes das classes fornecidas pelo centro de configuração definidas em ConfigType.

Os tipos atuais de centros de configuração definidos no ConfigType na versão 1.0 são: File, ZK, Nacos, Apollo, Consul, Etcd3, SpringCloudConfig, Custom. Caso o usuário queira utilizar um tipo de centro de configuração customizado, ele poderá utilizar o tipo Customizado.

Insira a descrição da imagem aqui
Você pode usar uma maneira deselegante aqui, ou seja, fornecer uma classe de implementação com um nome especificado ZK, mas um nível superior order=3 (ZK default order=1), para que ConfigurationFactory possa usar TestConfigurationProvider como a classe de provedor do centro de configuração.

Através das etapas acima, você pode permitir que o Seata use o código que fornecemos. Módulos como codec, compressor, descoberta e integração no seata usam o mecanismo spi para carregar classes funcionais, o que está alinhado com a filosofia de design do plug-in microkernel e tratamento igualitário de terceiros.

5. Endereço da série de análise de código-fonte seata

Autor: Zhao Runze,Endereço da série