Um consumidor assina a lista de provedores em um registro. Se o registro sofrer alterações, enfrentar problemas inesperados ou perder a conexão com um provedor devido a fatores como rede e carga de CPU, poderão ocorrer exceções de assinatura. Consequentemente, o consumidor pode receber uma lista vazia de provedores. Para melhorar a disponibilidade de todo o sistema, ative a proteção contra lista vazia no cliente Nacos ou no servidor Microservices Engine (MSE) Nacos.
Pré-requisitos
O MSE está ativado. Para mais informações, consulte Activate MSE.
Um mecanismo Nacos foi criado. Para mais informações, consulte Criar um mecanismo Nacos.
Ativar a proteção contra lista vazia no cliente
Limites
O cliente Java do Nacos na versão 1.4.1 ou posterior oferece suporte à proteção contra lista vazia.
Para evitar riscos associados a versões específicas, recomendamos selecionar as versões adequadas para o cliente, aplicações Spring Cloud e aplicações Dubbo com base nas versões recomendadas.
Procedimento
-
Se você utilizar o cliente Java do Nacos, execute as seguintes operações:
-
Adicione a seguinte dependência do
Nacos client:<!-- ${nacos-client.version} must be 1.4.1 or later. --> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>${nacos-client.version}</version> </dependency> -
Defina as seguintes configurações no código da aplicação:
Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, "${Endpoint of the MSE Nacos instance}"); properties.put(PropertyKeyConst.NAMING_PUSH_EMPTY_PROTECTION, "true"); NamingService naming = NamingFactory.createNamingService(properties);
-
-
Se sua aplicação for Spring Cloud Alibaba, adicione a seguinte configuração ao arquivo de configuração da aplicação:
spring.cloud.nacos.discovery.namingPushEmptyProtection=true -
Se sua aplicação for Dubbo, inclua a seguinte configuração de URL de registro no arquivo de configuração da aplicação Dubbo:
dubbo.registry.address=nacos://${Endpoint of the MSE Nacos instance}:8848?namingPushEmptyProtection=true
Ativar a proteção contra lista vazia no servidor
Muitos clientes não Java e clientes Java do Nacos em versões anteriores à 1.4.1 ainda estão em uso. O MSE otimiza os recursos dos servidores Nacos com base no Nacos open source para fornecer proteção contra lista vazia nos servidores Nacos.
Limites
A versão do mecanismo Nacos deve ser 2.1.0.0 ou posterior. Para mais detalhes sobre como atualizar a versão do mecanismo Nacos, consulte Atualizar uma versão do Nacos.
Procedimento
O método para ativar a proteção contra lista vazia varia conforme a versão do seu mecanismo MSE Nacos.
Nas versões 2.1.0.0 ou 2.1.0.1 do mecanismo MSE Nacos, nenhuma ação é necessária, pois a proteção contra lista vazia já vem ativada automaticamente.
-
Se a versão do seu mecanismo MSE Nacos for 2.1.0.2 ou posterior, siga os passos abaixo para ativar a proteção contra lista vazia:
Faça login no console do MSE e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha Microservices Registry > Instances.
Na página Instances, clique em nome da instância.
No painel de navegação à esquerda, clique em Parameter Settings. Na seção Real-time Effective Parameters da página Parameter Settings, clique em Edit na coluna Actions correspondente ao parâmetro forcePushEmptyProtectionForAllService.
-
Na caixa de diálogo Edit Parameters, selecione Yes para Value e clique em OK.
NotaPara garantir a máxima disponibilidade do serviço, recomendamos sempre selecionar Yes no campo Value do parâmetro forcePushEmptyProtectionForAllService.
Verificar o resultado
Quando um serviço aciona a proteção contra lista vazia, a mensagem Trigger push empty protection for Service aparece no arquivo naming.log, localizado no diretório ${user.home}/logs/nacos do nó onde reside o consumidor.
Em situações normais, essa informação não aparece com frequência. Se ela aparecer frequentemente, investigue as possíveis causas abaixo:
-
Os provedores assinados pelo consumidor não existem.
Se o consumidor assinar um provedor inexistente, verifique se a dependência da aplicação é realmente necessária. Caso não seja, remova a dependência inválida. Se for indispensável, publique o provedor novamente.
-
Nenhum provedor aparece na lista de instâncias.
Verifique se há desconexões frequentes dos provedores assinados pelo consumidor.
Confirme se a conexão de rede entre cada provedor e a instância MSE Nacos está normal. Conexões anormais fazem com que a instância MSE Nacos considere o provedor como desconectado.
Identificar o serviço que acionou a proteção contra lista vazia
A mensagem de erro contém informações sobre o serviço responsável por acionar a proteção. É possível identificar o serviço vazio assinado pelo consumidor por meio do trecho Service{namespace='XXX', group='xx', name='xxxxxxx', ephemeral=true, revision=0}.
Cenários conhecidos de acionamento
|
Cenário |
Causa |
Solução |
|
Em cenários de multi-assinatura com compatibilidade para versões do Dubbo 2, provedores com nomes de serviço no formato antigo não aparecem na lista de instâncias. |
O formato do nome de serviço em versões anteriores ao Dubbo 2.7.6 difere daquele usado no Dubbo 2.7.6 ou posterior. Em cenários de multi-assinatura que utilizam provedores Dubbo 2.7.6+, o consumidor assina tanto provedores com nomes no formato antigo quanto no novo. Se todos os provedores forem Dubbo 2.7.6 ou superior, os provedores com nomes no formato antigo não conseguem se registrar na instância Nacos. Isso faz com que a proteção contra lista vazia seja acionada quando o consumidor tenta assinar um provedor com nome no formato antigo. |
Atualize a versão do mecanismo para 2.1.0.1 ou posterior, ou atualize o Dubbo para a versão 2.7.17 ou superior. Para mais informações, consulte Atualizar versão do mecanismo. |
|
Em cenários de multi-assinatura com compatibilidade para versões do Dubbo 3, provedores cujos nomes são de nível de interface não aparecem na lista de instâncias. |
O Dubbo 3 introduziu a descoberta de serviços no nível da aplicação. Os nomes registrados deixaram de ser de nível de interface e passaram a ser de nível de aplicação. Para garantir transições suaves entre versões do Dubbo, o consumidor assina simultaneamente provedores com nomes de nível de aplicação e de nível de interface. Se todos os provedores forem Dubbo 3, aqueles com nomes de nível de interface não se registram na instância Nacos, acionando a proteção contra lista vazia durante a assinatura. |
Adicione a configuração |
|
Ao ativar o recurso NacosWatch pela primeira vez em uma aplicação Spring Cloud Alibaba sem réplicas de instância existentes, o consumidor recebe uma lista de instâncias vazia. |
Versões recentes do Spring Cloud Alibaba incluem o recurso NacosWatch para monitorar o status do serviço das aplicações. Esse recurso permite que a aplicação monitore seu próprio serviço durante a inicialização. Se o NacosWatch for ativado pela primeira vez e não houver réplicas disponíveis, a proteção contra lista vazia será acionada porque a instância da aplicação ainda não está registrada no Nacos. Após a inicialização completa da instância, o acionamento cessa. |
Ignore o problema se for a primeira ativação do NacosWatch sem réplicas existentes. Alternativamente, adicione a configuração |
|
Quando um serviço é totalmente desativado no Spring Cloud Gateway, o status do serviço não é sincronizado. |
Durante a inicialização, o Spring Cloud Gateway consulta e assina todos os serviços disponíveis na instância Nacos. Por exemplo, se um serviço for completamente desativado após a inicialização do gateway (porque a instância Nacos removeu automaticamente todas as instâncias da aplicação), o Spring Cloud Gateway não detecta essa mudança e continua assinando o serviço, o que aciona a proteção contra lista vazia. |
O Spring Cloud Gateway não consegue detectar dinamicamente a desativação de um serviço para cancelar a assinatura automaticamente. Recomendamos reiniciar o Spring Cloud Gateway. |
Cenários com ativação forçada da proteção contra lista vazia
A partir do MSE Nacos 2.1.0.2, a lógica de ativação da proteção contra lista vazia foi otimizada. Essa melhoria garante que a proteção só seja ativada quando se seleciona Yes no campo Value do parâmetro forcePushEmptyProtectionForAllService. No entanto, para preservar a disponibilidade e estabilidade, o sistema ainda ativa automaticamente a proteção nos cenários abaixo, mesmo que se tenha escolhido No no campo Value do parâmetro forcePushEmptyProtectionForAllService.
Durante atualizações, reinicializações ou recuperações de falhas em nós do mecanismo, uma proteção contra lista vazia de dois minutos é ativada automaticamente para todas as aplicações, assegurando a disponibilidade do serviço nesse período.
Se todas as instâncias de uma aplicação forem removidas da lista de instâncias na instância MSE, o sistema ativa automaticamente uma proteção contra lista vazia de um minuto para essa aplicação. Essa medida evita acionamentos inesperados causados por instabilidade de rede ou falhas temporárias nos provedores, mantendo a disponibilidade do serviço.
Para assegurar a maior disponibilidade possível do serviço, recomendamos selecionar Yes no campo Value do parâmetro forcePushEmptyProtectionForAllService para manter a proteção contra lista vazia sempre ativa.
Referências
Os recursos de alta disponibilidade fornecidos pelo Microservices Registry do MSE permitem aumentar significativamente a capacidade das aplicações de lidar com riscos. Para mais informações, consulte Implementar recursos de alta disponibilidade do MSE Microservices Registry.