Configuração e Integração do Apollo com Spring Boot

Introdução

O Apollo é um sistema de configuração centralizada desenvolvido pela Ctrip, projetado para gerir de forma unificada as configurações de diferentes ambientes e clusters em aplicações distribuídas. Ele permite atualizações em tempo real e oferece recursos como controle de acesso e governança de processos, sendo ideal para cenários de microsserviços.

Comparação com Spring Cloud Config

Em ambientes de produção, o Apollo apresenta vantagens significativas em relação ao Spring Cloud Config, como suporte nativo a push de configurações e melhor integração com ecossistemas de microsserviços.

Instalação do Centro de Configuração Apollo

Para configurar o Apollo, consulte a documentação oficial no GitHub. O processo envolve a implantação dos módulos de administração e serviço, seguido pela inicialização dos componentes. Após a conclusão, acesse a interface de gerenciamento via navegador.

Exemplo de Configuração Inicial

Após a instalação, faça login na interface com credenciais padrão e navegue até a aplicação de exemplo para visualizar as configurações demonstrativas.

Integração com Spring Boot

Criar um projeto Spring Boot para utilizar o Apollo requer a adição de dependências específicas e configurações no arquivo de propriedades.

Dependências Maven

Inclua o cliente Apollo e bibliotecas auxiliares no arquivo pom.xml:

<dependencies>
    <dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-client</artifactId>
        <version>1.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.8.1</version>
    </dependency>
</dependencies>

Configuração do Aplicativo

No arquivo application.yml, defina parâmetros essenciais:

server:
  porta: 8761
app:
  identificador: springboot-apollo
apollo:
  meta: http://127.0.0.1:8080
  bootstrap:
    habilitado: true
    carregamento-adiantado:
      habilitado: true
logging:
  nivel:
    com:
      exemplo:
        controlador: debug

Explicação das configurações:

  • app.identificador: Identificador único da aplicação no centro de configurações.
  • apollo.bootstrap.habilitado: Injeta as configurações gerenciadas no contexto Spring durante a inicialização.
  • apollo.bootstrap.carregamento-adiantado.habilitado: Carrega as configurações Apollo antes do sistema de log.
  • logging.nivel.com.exemplo.controlador: Ajusta o nível de log para demonstrações dinâmicas.

Controlador de Exemplo

Crie um controlador REST simples para testar a integração:

@RestController
public class ControladorSaudacao {
    private static final Logger logger = LoggerFactory.getLogger(ControladorSaudacao.class);

    @Value("${server.porta}")
    private String portaServidor;

    @GetMapping("/ola")
    public String saudar(String nome) {
        logger.debug("Mensagem de depuração...");
        logger.info("Mensagem informativa...");
        logger.warn("Mensagem de alerta...");
        return "Olá " + nome + ", vindo da porta: " + portaServidor;
    }
}

Classe de Inicialização

Ative o suporte ao Apollo na classe principal:

@SpringBootApplication
@EnableApolloConfig
public class AplicacaoApolloSpring {
    public static void main(String[] args) {
        SpringApplication.run(AplicacaoApolloSpring.class, args);
    }
}

Configuração no Centro de Administração

Após executar a aplicação, configure o projeto no painel do Apollo.

Criação do Projeto

Acesse a interface de gerenciamento, selecione a opção para criar um novo projeto e forneça detalhes como departamento, AppId e nome. O AppId deve corresponder ao definido na aplicação.

Adição de Propriedades

Adicione propriedades que serão gerenciadas, como server.porta. Após inserir os valores, publique as configurações para torná-las ativas.

Teste de Configurações Dinâmicas

Modifique o valor de server.porta no centro de configurações e publique a alteração. Ao chamar o endpoint da aplicação, a porta retornada pode refletir a mudança após um reinício do aplicativo, demonstrando o carregamento das configurações atualizadas.

Monitoramento de Alterações de Configuração

Para atualizar configurações como níveis de log sem reiniciar a aplicação, implemente um listener que reaja a mudanças no Apollo.

Classe de Atualização de Log

Crie uma classe para monitorar e aplicar mudanças nos níveis de log:

@Configuration
public class ConfiguracaoLog {
    private static final Logger logger = LoggerFactory.getLogger(ConfiguracaoLog.class);
    private static final String PREFIXO_LOG = "logging.nivel.";

    @Autowired
    private LoggingSystem sistemaLog;

    @ApolloConfig
    private Config configApollo;

    @ApolloConfigChangeListener
    private void aoMudarConfiguracao(ConfigChangeEvent evento) {
        atualizarNiveisLog();
    }

    @PostConstruct
    private void atualizarNiveisLog() {
        Set<String> chaves = configApollo.getPropertyNames();
        for (String chave : chaves) {
            if (StringUtils.containsIgnoreCase(chave, PREFIXO_LOG)) {
                String nivelStr = configApollo.getProperty(chave, "info");
                LogLevel nivel = LogLevel.valueOf(nivelStr.toUpperCase());
                String pacote = chave.replace(PREFIXO_LOG, "");
                sistemaLog.setLogLevel(pacote, nivel);
                logger.info("Configuração aplicada: {}={}", chave, nivelStr);
            }
        }
    }
}

Pontos-chave:

  • @ApolloConfig: Injeta a instância de configuração do Apollo.
  • @ApolloConfigChangeListener: Escuta eventos de mudança e aciona a atualização.
  • O método atualizarNiveisLog itera sobre as propriedades relevantes e ajusta os níveis de log dinamicamente.

Validação da Atualização Dinâmica

Com o código de listener ativo, altere o nível de log no centro de configurações de debug para warn e publique. Ao acessar o endpoint, apenas logs de nível warn serão exibidos, confirmando a atualização em tempo real sem reinício da aplicação.

Tags: apollo spring-boot configuração-centralizada microsservicos java

Publicado em 6-15 23:19 por Thomas