Envoy e Apache APISIX: Outra Maneira de Implementar Envoy Filter
API7.ai
December 16, 2020
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.
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ício | Estabilidade | Eficiência de Desenvolvimento | Implantação e Compilação | |
---|---|---|---|---|
C++ | Alta | Estável | Baixa | Tempo longo para compilar |
Lua | Baixa | Estável | Alta | Não precisa compilar, implanta diretamente |
WASM | Média-Alta | Incerta | Depende da linguagem | Tempo de compilação depende da linguagem |
- 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.
- 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.
- 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.
Usamos o exemplo anterior para mostrar como o plugin funciona:
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.