Notas de Dubbo②: Visão geral da arquitetura

I. Introdução

Esta série é um estudo de notas pessoais de Dubbo, o conteúdo vem de "Análise aprofundada do núcleo de tecnologia interna do Apache Dubbo", apenas para gravação de notas pessoais. A análise deste artigo é baseada na versão Dubbo 2.7.0.Devido a limitações de entendimento pessoal, se houver algum erro no artigo, obrigado pela sua correção.


Este artigo é puramente teórico e o conteúdo vem de "Análise detalhada do Apache Dubbo Core Technology Insider". O objetivo deste artigo é ser o início de uma série de artigos de acompanhamento.

Dois, uma visão geral da arquitetura em camadas

Insira a descrição da imagem aqui

  • Camada de serviço e configuração : camada de interface de API para permitir que usuários Dubbo publiquem facilmente serviços e serviços de referência; para provedores de serviços, é necessário implementar interfaces de serviço e, em seguida, usar a API ServiceConfig para publicar o serviço; para consumidores de serviço, é necessário usar ReferenceConfig para proxy da interface de serviço. As partes de publicação e referência do serviço Dubbo podem inicializar diretamente a classe de configuração ou gerar automaticamente a classe de configuração por meio da configuração Spring.

  • As outras camadas são todas as camadas SPI (Service Provider Interface). SPI significa que as seguintes camadas são todas divididas em componentes e podem ser substituídas. Este é um dos melhores designs de Dubbo. Dubbo aprimora as funções SPI padrão fornecidas no JDK. No Dubbo, exceto para as camadas de serviço e configuração, todas as outras camadas fornecem serviços implementando interfaces de ponto de extensão; o SPI aprimorado de Dubbo adiciona suporte para pontos de extensão IoC e AOP. Um ponto de extensão pode diretamente use o método setter () para injetar outros pontos de extensão e não instanciará todas as classes de implementação do ponto de extensão de uma vez, o que evita a inicialização demorada da classe de implementação do ponto de extensão, mas ainda não foi usada. A função de carregamento e instanciação ainda é um desperdício de recursos; o SPI aprimorado serve para instanciar uma classe de implementação específica quando uma classe de implementação específica é usada. O princípio de implementação do SPI aprimorado de Dubbo será explicado em detalhes posteriormente.

  • Camada de proxy de serviço proxy : Esta camada serve principalmente para fazer proxy da interface usada pelo consumidor de serviço e converter de forma transparente chamadas locais em chamadas remotas; além disso, fazer proxy das classes de implementação de serviço do provedor de serviço e converter as classes de implementação de serviço em classes Wrapper. Isso é para reduzir a chamada de reflexão, que será explicada em detalhes posteriormente. A interface de extensão SPI da camada Proxy é ProxyFactory. As classes de implementação fornecidas por Dubbo incluem principalmente JavassistProxyFactory (usado por padrão) e JdkProxyFactory. Os usuários podem implementar a interface ProxyFactory SPI e personalizar a implementação da camada de serviço de proxy.

  • Camada de registro do serviço de registro : quando o provedor de serviço for iniciado, ele irá registrar o serviço no registro de serviço, e quando o consumidor iniciar, ele irá para o registro de serviço para obter a lista de endereços do provedor de serviço. camada é para encapsular o registro e a lógica de descoberta do endereço de serviço. As extensões correspondentes à interface de extensão Registry são implementadas como ZookeeperRegistry, RedisRegistry, MulticastRegistry, DubboRegistry, etc. Interface estendida RegistryFactory A interface estendida correspondente é implementada como DubboRegistryFactory, DubboRegistryFactory, RedisRegistryFactory, ZookeeperRegistryFactory. Além disso, as classes de implementação do diretório de interface estendida desta camada incluem RegistryDirectory e StaticDirectory, que são usados ​​para converter de forma transparente a lista Invoker em Invoker; os usuários podem implementar uma série de interfaces estendidas dessa camada e personalizar a implementação de serviço dessa camada.

  • Camada de roteamento de cluster : encapsula a implementação de regras de roteamento, balanceamento de carga, tolerância a falhas de cluster de vários provedores de serviço e conecta o registro de serviço; as classes de implementação correspondentes à interface estendida Cluster incluem FailoverCluster (nova tentativa de falha), FailbackCluster (recuperação automática de falha) , FailfastCluster (falha rápida), FailsafeCluster (segurança de falha), ForkingCluster (chamada paralela), etc .; as classes de implementação correspondentes à interface de extensão de balanceamento de carga LoadBalance são RandomLoadBalance (aleatório), RoundRobinLoadBalance (pesquisa), LeastActiveLoadBalance (número ativo mínimo) , ConsistentHashLoadBalance (consistente) Sex Hash) e assim por diante. Os usuários podem implementar uma série de interfaces estendidas nesta camada e personalizar a tolerância a falhas do cluster e estratégias de balanceamento de carga.

  • Camada de monitoramento do monitor : usada para contar o número de chamadas RPC e as chamadas demoradas, a interface de extensão é MonitorFactory e a classe de implementação correspondente é DubboMonitorFactroy. Os usuários podem implementar a interface de extensão MonitorFactory desta camada e implementar estratégias de estatísticas de monitoramento personalizadas.

  • Camada de chamada remota de protocolo : encapsula a lógica de chamada RPC, a interface estendida é Protocolo e as implementações correspondentes incluem RegistryProtocol, DubboProtocol, InjvmProtocol, etc.

  • Camada de troca de informações : encapsula o modo de resposta da solicitação, síncrono para assíncrono, a interface de extensão é Exchanger e as implementações de extensão correspondentes incluem HeaderExchanger, etc.

  • Camada de transporte da rede de transporte : Mina e Netty são abstraídos como interfaces unificadas. A interface estendida é Channel, e as implementações correspondentes incluem NettyChannel (padrão), MinaChannel, etc.; As classes de implementação correspondentes à interface estendida Transporter são GrizzlyTransporter, MinaTransporter, NettyTransporter (implementação padrão); as classes de implementação correspondentes à interface estendida Codec2 incluem DubboCodec, ThriftCodec, etc.

  • Serializar camada de serialização de dados : fornece algumas ferramentas que podem ser reutilizadas. A interface estendida é serialização. As implementações estendidas correspondentes incluem DubboSerialization, FastJsonSerialization, Hessian2Serialization, JavaSerialization, etc., e as implementações estendidas correspondentes da interface estendida ThreadPool incluem FixedThreadPool, CachedThreadPool, LimitedThreadPool, etc.

Três, visão geral da chamada remota

1. Visão geral da exposição do provedor de serviços

Insira a descrição da imagem aqui

  1. Ref -> Invoker: a classe ServiceConfig faz referência à classe de implementação ref (como GreetingServiceImpl) que fornece serviços externos e, em seguida, usa a ref para gerar uma instância AbstractProxyInvoker por meio do método ProxyFactory # getInvoker. Nesta etapa, a conversão do serviço específico para o Invoker é concluído. .
  2. Invoker -> Export: A conversão do protocolo Dubbo Invoker para Exporter ocorre no método de exportação Protocol #. A chave para a exposição do serviço de manuseio Dubbo está no processo de conversão de Invoker para Exporter. Neste processo, o Netty Server será iniciado para monitorar o conexão de serviço e, em seguida, registre o serviço no registro de serviço.

2. Visão geral dos serviços de consumo do consumidor de serviço

Insira a descrição da imagem aqui

  1. ReferenceConfig Primeiro, o método ReferenceConfig # init chama o método Protocol # refer para gerar uma instância do Invoker, que é a chave para o consumo do serviço. Em seguida, converta o Invoker para a interface exigida pelo cliente (como GreetingService).
  2. O Invoker do protocolo Dubbo é convertido para a interface exigida pelo cliente, o que ocorre no método getProxy da classe de implementação estendida da interface ProxyFactory. Ele usa principalmente o proxy para converter a chamada para a interface de serviço para a chamada para o Invoker.

Acima: Para obter o conteúdo, consulte
"Análise detalhada do Apache Dubbo Core Technology Insider".
Se houver qualquer intrusão, entre em contato e exclua-a. O conteúdo é usado apenas para autogravação e aprendizagem. Se houver algum erro, por favor me corrija

Acho que você gosta

Origin blog.csdn.net/qq_36882793/article/details/114591565
Recomendado
Clasificación