O registro com atraso fixo atende à maioria dos microsserviços, mas é insuficiente quando o tempo de inicialização varia. Um atraso muito curto causa tráfego prematuro, enquanto um atraso excessivo desperdiça tempo de implantação. O registro condicional permite que a aplicação sinalize quando está pronta para que o agente do Microservices Engine (MSE) registre o serviço no momento exato.
Este recurso está em visualização pública e requer a versão 4.6.0 ou posterior do agente MSE. Para especificar uma versão do agente, consulte Especifique uma versão do agente MSE.
Quando usar o registro condicional
Use o registro condicional em vez do registro com atraso fixo quando a aplicação:
Carregar caches, pré-computar índices ou executar outras inicializações assíncronas com duração imprevisível.
Depender da disponibilidade de recursos locais não expressável como um simples atraso de tempo.
Exigir controle preciso sobre o início do recebimento de tráfego de microsserviços.
Se o tempo de inicialização for previsível, o registro com atraso fixo é mais simples e suficiente. Se você ainda não conhece os recursos de inicialização e desligamento elegantes do MSE, use primeiro a solução de registro com atraso fixo. Ela cobre a maioria dos cenários típicos de aplicação. O registro condicional exige alteração de código na aplicação. Avalie essa troca antes de prosseguir.
Como funciona
O agente MSE monitora uma propriedade de sistema Java definida nos parâmetros de inicialização ou nas variáveis de ambiente. A aplicação define essa propriedade como true após concluir a lógica de inicialização personalizada. Ao detectar o valor da propriedade, o agente aciona o registro do microsserviço.
Antes do atendimento da condição, o serviço não é registrado e não recebe tráfego.
Fluxo de inicialização com sonda de prontidão do Kubernetes
Ao combinar o registro condicional com uma sonda de prontidão do Kubernetes, a sequência de inicialização segue estas etapas:
|
Fase |
O que acontece |
|
1. Início do Pod |
O contêiner inicia a execução. |
|
2. Inicialização da aplicação |
A lógica de negócio executa (aquecimento de cache, pré-carregamento de dados, etc.). |
|
3. Definição da condição |
O código da aplicação define a propriedade de sistema como |
|
4. Agente MSE registra o serviço |
O agente detecta a condição e inicia o registro do microsserviço. |
|
5. Serviço aceita tráfego |
O registro do microsserviço tem êxito e o serviço passa a processar requisições. |
|
6. Aprovação na sonda de prontidão |
A sonda de prontidão do Kubernetes na porta |
|
7. Pod torna-se Ready |
O Kubernetes marca o pod como |
Pré-requisitos
Antes de começar, verifique se você tem:
Versão
4.6.0ou posterior do agente MSE. Consulte Especifique uma versão do agente MSE
Declarar a chave de condição
Adicione a seguinte configuração aos parâmetros de inicialização ou às variáveis de ambiente da aplicação para declarar a chave da propriedade de sistema usada como condição de registro.
Formato:
mse_lossless_register_condition_on_system_property_true="<your-condition-key>"
Exemplo:
# Use PRODUCT_PRELOAD_COMPLETED as the registration condition key
mse_lossless_register_condition_on_system_property_true="PRODUCT_PRELOAD_COMPLETED"
Substitua <your-condition-key> por um nome descritivo que reflita a lógica de inicialização.
Defina a condição no código da aplicação
Após concluir todas as tarefas de inicialização, chame System.setProperty para definir a chave de condição como true. O agente MSE detecta essa alteração e registra o serviço.
No exemplo a seguir, um cache de produtos carrega de forma assíncrona. Depois que o cache fica pronto, o código define a propriedade de sistema para sinalizar a prontidão:
@Component
public class HotProductInitComponent {
public ScheduledExecutorService executor = Executors.newScheduledThreadPool(
1,
new NameThreadFactory("product-preload-pool"));
@Value("${demo.product.init.delay.seconds:3}")
public long initDelaySeconds;
public void asyncLoadPoductDataIntoCache() {
executor.schedule(() -> {
// ... load product data into cache ...
// Signal that initialization is complete.
// The MSE agent detects this and registers the service.
System.setProperty("PRODUCT_PRELOAD_COMPLETED", "true");
}, initDelaySeconds, TimeUnit.SECONDS);
}
}
Interação com outros recursos do MSE
|
Tópico |
Detalhe |
|
Compatibilidade com sonda de prontidão |
O registro condicional funciona com a sonda de prontidão do MSE no endpoint |
|
Sem opção separada para inicialização elegante |
Ao definir |
|
Registro atrasado não obrigatório |
Após ativar o registro condicional, não é preciso configurar o registro atrasado para a inicialização elegante. |