Envoy e Apache APISIX: Outra Maneira de Implementar Envoy Filter

API7.ai

December 16, 2020

Technology

Formas de implementar o filtro Envoy

Filtro Envoy

O Envoy é um proxy de camada 7 e barramento de comunicação projetado para grandes arquiteturas orientadas a serviços modernas. Um mecanismo de cadeia de filtros plugável permite que filtros sejam escritos para realizar diferentes tarefas e inseridos no servidor principal.

Filtro Envoy

Método de expansão

Os filtros existentes podem não atender às necessidades personalizadas do usuário. Nesse caso, o Envoy precisa ser estendido. Personalize novos filtros de acordo com a cadeia de filtros existente para atender às necessidades de customização.

Os desenvolvedores podem estender o Envoy de três maneiras:

Dificuldade de InícioEstabilidadeEficiência de DesenvolvimentoImplantação e Compilação
C++AltaEstávelBaixaTempo longo para compilar
LuaBaixaEstávelAltaNão precisa compilar, implanta diretamente
WASMMédia-AltaIncertaDepende da linguagemTempo de compilação depende da linguagem
  1. Usando C++ para estender

Neste método, o código C++ é escrito diretamente com base no Envoy para aprimoramento funcional. Após implementar um filtro personalizado, o novo arquivo binário é recompilado para concluir a atualização. Existem dois problemas com essa abordagem:

  • Limitado pela linguagem C++, dificuldade de início, escassez de desenvolvedores.
  • Aumenta a complexidade de implantação, operação, manutenção e atualizações. O Envoy se tornará cada vez mais pesado, e cada alteração requer a recompilação do arquivo binário, o que não é favorável à iteração e gerenciamento.
  1. Usando Lua para estender

O Lua foi criado para ser embutido em aplicações, fornecendo recursos de extensão e personalização flexíveis, e é amplamente utilizado.

O Filtro Lua permite que scripts Lua sejam executados durante o processo de solicitação e resposta. As principais funcionalidades atualmente suportadas incluem: inspeção de cabeçalhos, corpo e trailers durante o fluxo de solicitação ou resposta; modificação de cabeçalhos e trailers; bloqueio e bufferização do corpo completo da solicitação/resposta para inspeção; realização de uma chamada HTTP assíncrona para um host upstream; realização de uma resposta direta e pular iterações adicionais de filtro, etc.

Atualmente, muitas pessoas distribuem código Lua diretamente na configuração, o que não é favorável à organização e gerenciamento do código, e é difícil compartilhar com outros para formar um ecossistema.

  1. Usando extensão WASM

Os desenvolvedores podem escrever filtros em sua própria linguagem de programação, compilá-los no formato WASM usando ferramentas e incorporá-los ao Envoy para execução.

Atualmente, suporta poucas linguagens, e usar essas linguagens para extensão ainda não é tão simples. Por outro lado, muitas pessoas ainda têm reservas sobre o WASM e podem não usá-lo diretamente.

Solução Apache APISIX

Com base na análise acima, podemos ver que o Lua é muito adequado para estender o Envoy, é fácil de aprender e a eficiência de desenvolvimento é extremamente alta. Como está embutido no Envoy, não há sobrecarga adicional de rede, e o desempenho é bom.

A comunidade Apache APISIX propõe sua própria solução baseada em Lua, que é fornecer uma biblioteca básica poderosa e flexível para implementar todos os plugins do Apache APISIX e plugins que serão desenvolvidos no futuro para rodar no Envoy. Os desenvolvedores também podem desenvolver seus próprios plugins personalizados com base nesta biblioteca básica.

O Apache APISIX é um gateway API dinâmico, em tempo real e de alto desempenho, baseado na biblioteca Nginx e Lua. O Apache APISIX fornece recursos avançados de gerenciamento de tráfego, como balanceamento de carga, upstream dinâmico, lançamento canário, circuit breaker, autenticação, observabilidade e muito mais.

Exemplo

Por favor, verifique o repositório para o código específico e como executar: https://github.com/api7/envoy-apisix.

A configuração relevante do Envoy é a seguinte:

Defina um Filtro:

http_filters:
  - name: entry.lua
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
      source_codes:
        entry.lua:
          filename: /apisix/entry.lua

Habilite o Filtro para uma rota e configure-o com metadados:

routes:
  - match:
      prefix: "/foo"
    route:
      cluster: web_service
    typed_per_filter_config:
      envoy.filters.http.lua:
        "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.LuaPerRoute
        name: entry.lua
    metadata:
      filter_metadata:
        envoy.filters.http.lua:
          plugins:
            - name: uri-blocker
              conf:
                rejected_code: 403
                block_rules:
                  - root.exe
                  - root.m+

Como funciona

Não precisamos fazer grandes alterações no Envoy, apenas algumas otimizações que são adequadas para necessidades públicas.

Nós protegemos as diferenças de plataforma para a camada de plugin. Todas as interfaces que precisam ser usadas são abstraídas no framework subjacente, que chamamos de apisix.core, para que todos os plugins possam rodar no Envoy e no Apache APISIX ao mesmo tempo.

Diagrama de Arquitetura

Usamos o exemplo anterior para mostrar como o plugin funciona:

Fluxo de trabalho do plugin

Primeiro passo, ler a configuração

Configuramos através de metadados para determinar quais plugins precisam rodar em cada rota e qual configuração é para cada plugin. No exemplo, configuramos o plugin uri-blocker para a rota cujo prefixo é /foo, bem como a regra de bloqueio do plugin e o status de resposta quando um bloqueio é necessário.

Segundo passo, analisar a solicitação

Encapsulamos os dados da solicitação do cliente em ctx para que possam ser usados diretamente em todo o processo.

Terceiro passo, executar o plugin

Determinamos se precisamos bloquear esta solicitação combinando as regras configuradas e o uri obtido. Se um bloqueio for necessário, chamamos respond para responder diretamente, caso contrário, deixamos passar.

Perspectivas futuras

Cada vez mais plugins APISIX estão disponíveis para rodar no Envoy, e finalmente todos os plugins APISIX (mesmo aqueles que serão desenvolvidos no futuro) estarão disponíveis para rodar no Envoy.

Ao mesmo tempo, esperamos poder trabalhar com a comunidade Envoy na direção do Filtro Lua, otimizar e melhorar o Filtro Lua, aumentar as capacidades de expansão do Envoy e reduzir a dificuldade de expansão do Envoy.

Tags: