Biblioteca de código aberto Netflix Archaius

1. O que é Archaius?

Archaius é na verdade um encapsulamento e extensão da Apache Common Configuration Library. Ele fornece um conjunto de APIs de configuração baseadas em Java. Os principais recursos incluem:

  • A configuração pode ser ajustada dinamicamente
  • Tipo de suporte de configuração (Int, Long, Boolean, etc.)
  • Alto desempenho e segurança de rosca
  • Fornece uma estrutura para puxar configuração, que pode puxar dinamicamente a configuração alterada da fonte de configuração
  • Suporta o mecanismo de retorno de chamada, que é automaticamente invocado quando a configuração muda
  • Suporte JMX MBean, você pode ver a configuração e modificar a configuração através do JConsole

Insira a descrição da imagem aqui

O núcleo do Achaius é chamado de combinação de conceitos de configuração (Configuração composta) e pode ser entendido como uma configuração hierárquica simples, a configuração de prioridade hierárquica e de nível de alta prioridade sobrescreverá a configuração de baixa prioridade. Cada nível pode obter a configuração de uma fonte de configuração, como arquivos de configuração locais, fontes de dados JDBC, APIs REST remotas, etc. A fonte de configuração também pode extrair alterações dinamicamente no tempo de execução.Por exemplo, na figura acima, Configuração de banco de dados persistente se refere ao armazenamento da configuração em um banco de dados relacional, e a fonte de configuração correspondente extrairá periodicamente as alterações do banco de dados. O valor final da configuração é determinado pela configuração de nível superior. Por exemplo, se vários níveis contêm um determinado item de configuração, o valor final visto pelo aplicativo é o valor mais alto no nível de configuração. A ordem das camadas de configuração pode ser ajustada

A interface principal da configuração pull é PolledConfigurationSourceque o Achaius fornece duas subcategorias: JDBCConfigurationSource (com base no banco de dados) e URLConfigurationSource (com base na URL). A seguir, obteremos propriedades dinâmicas de uma maneira baseada em banco de dados.

public interface PolledConfigurationSource {
    
    

    /**
     * Poll the configuration source to get the latest content.
     * 
     * @param initial true if this operation is the first poll.
     * @param checkPoint Object that is used to determine the starting point if the result returned is incremental. 
     *          Null if there is no check point or the caller wishes to get the full content.
     * @return The content of the configuration which may be full or incremental.
     * @throws Exception If any exception occurs when fetching the configurations.
     */
    public PollResult poll(boolean initial, Object checkPoint) throws Exception;    
}

Insira a descrição da imagem aqui

2. Obtenha atributos dinâmicos com base no banco de dados

1), adicionar dependência de archaius

        <dependency>
            <groupId>com.netflix.archaius</groupId>
            <artifactId>archaius-core</artifactId>
            <version>0.6.0</version>
        </dependency>

2), crie uma tabela de banco de dados

CREATE TABLE `my_site_properties` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `property_key` varchar(50) DEFAULT NULL COMMENT '属性的key',
  `property_value` varchar(255) DEFAULT NULL COMMENT '属性的值',
  PRIMARY KEY (`id`),
  UNIQUE KEY `my_site_properties_u1` (`property_key`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

3), classe de configuração

@Configuration
public class DynamicPropertyFactoryConfig {
    
    
    @Autowired
    private DataSource dataSource;

    @PostConstruct
    public void init() {
    
    
        PolledConfigurationSource source = new JDBCConfigurationSource(dataSource,
                "select distinct property_key, property_value from my_site_properties",
                "property_key",
                "property_value");
        //首次任务立即执行,1秒间隔
        FixedDelayPollingScheduler scheduler = new FixedDelayPollingScheduler(0, 1000, false);
        DynamicConfiguration configuration = new DynamicConfiguration(source,
                scheduler);
        ConfigurationManager.install(configuration);
    }
}

4), obtenha a configuração dinâmica

@RestController
@RequestMapping("/api/demo1")
public class Demo1Controller {
    
    

    DynamicStringProperty defaultProp = DynamicPropertyFactory.getInstance().getStringProperty(
            "demo", "default");

    @GetMapping
    public String getDynamicStringProperty() {
    
    
        return defaultProp.getValue();
    }
}

Efeito de realização : solicite a interface para obter a configuração dinâmica, e o resultado de retorno é que property_key no banco de dados é o property_value correspondente ao demo. Se você alterar o valor do banco de dados e solicitar a interface novamente, você pode obter o último valor.

3. Fonte de configuração personalizada e programador de sondagem

1), fonte de configuração personalizada

Implementar a interface PolledConfigurationSource

public class DynamicConfigurationSource implements PolledConfigurationSource {
    
    
    @Override
    public PollResult poll(boolean initial, Object checkPoint) throws Exception {
    
    
        Map<String, Object> map = new HashMap<>();
        map.put("demo2", UUID.randomUUID().toString());
        return PollResult.createFull(map);
    }
}

Se você deseja personalizar o cronograma, você pode implementar a classe abstrata AbstractPollingScheduler

2), classe de configuração

@Configuration
public class DynamicPropertyFactoryConfig {
    
    

    @PostConstruct
    public void init() {
    
    
        PolledConfigurationSource source = new DynamicConfigurationSource();
        //首次任务立即执行,1秒间隔 DynamicConfigurationSource中使用UUID 相当于demo2的配置每1秒刷新一次
        FixedDelayPollingScheduler scheduler = new FixedDelayPollingScheduler(0, 1000, false);
        DynamicConfiguration configuration = new DynamicConfiguration(source,
                scheduler);
        ConfigurationManager.install(configuration);
    }
}

3) Obtenha configuração dinâmica

@RestController
@RequestMapping("/api/demo2")
public class Demo2Controller {
    
    

    DynamicStringProperty defaultProp = DynamicPropertyFactory.getInstance().getStringProperty(
            "demo2", "default");

    @GetMapping
    public String getDynamicStringProperty() {
    
    
        return defaultProp.getValue();
    }
}

Efeito de realização : solicitar a interface para obter a configuração dinâmica, retornar o resultado como UUID e alterar a cada segundo

referência:

https://blog.csdn.net/yang75108/article/details/86990136

https://github.com/Netflix/archaius/wiki

https://www.cnblogs.com/lexiaofei/p/7169483.html

Acho que você gosta

Origin blog.csdn.net/qq_40378034/article/details/109553007
Recomendado
Clasificación