FAQ do OpenResty | Como o OpenResty é usado na prática
API7.ai
February 10, 2023
- Algumas perguntas e respostas sobre OpenResty, API Gateway e Lua
- FAQ do OpenResty | Permissão de Processo Privilegiado, Fase de Execução e mais
- FAQ do OpenResty | Estrutura de Rede para Testes, Recursos Relacionados a SSL, DSL, Ferramenta ab
- FAQ do OpenResty | Carga Dinâmica, NYI e Cache de Shared Dict
Agora, concluímos a última seção sobre OpenResty, o Microservices API Gateway. Parabéns por não ficar para trás, aprender e praticar ativamente, e deixar seus pensamentos com entusiasmo.
Selecionei algumas perguntas típicas e interessantes para compartilhar com vocês. Vamos ver essas 5 perguntas de hoje.
Pergunta 1: Como o OpenResty é usado na prática
Descrição: O curso está quase terminando, e eu consigo entender basicamente, mas minha própria prática ainda é limitada (não é usado atualmente no meu trabalho). Porque não consigo usá-lo no trabalho. No entanto, esta é uma série de artigos muito útil. Agradeço ao autor por continuar a compartilhar, e vou apresentá-lo mais tarde no meu trabalho.
Gostaria de falar sobre a introdução do OpenResty no trabalho, um tópico que vale a pena discutir.
O OpenResty é baseado no NGINX e adiciona o módulo C lua-nginx-module
e várias bibliotecas lua-resty
, então o OpenResty é uma boa alternativa para o NGINX, que é a maneira mais barata de começar a usar o OpenResty. Claro, há riscos associados a esse processo de substituição, então você precisa estar ciente dos seguintes três pontos.
Primeiro, certifique-se de que a versão do NGINX online seja a mesma que a versão principal do OpenResty, como o OpenResty 1.15.8.1, que usa o NGINX 1.15.8. Se a versão atual do NGINX online for superior à versão mais recente do OpenResty, você precisa mudar para o OpenResty com cautela. Afinal, o OpenResty ainda é lento para atualizar e está seis meses a um ano atrás da versão principal do NGINX. Se a versão do NGINX online for a mesma ou inferior à do OpenResty, então você tem os pré-requisitos para atualizar.
Segundo, testes. Testes são um dos aspectos mais importantes. Há pouco risco em usar o OpenResty para substituir o NGINX, mas ainda existem riscos. Por exemplo, se há módulos C personalizados que precisam ser compilados, a versão do openssl
da qual o OpenResty depende, e se o patch que o OpenResty aplica ao NGINX impactará o negócio. Você precisa replicar parte do tráfego do negócio para verificar isso.
Terceiro, troca de tráfego. Após a validação básica ser aprovada, você ainda precisa verificar o lançamento canário do tráfego real online. Para reverter rapidamente, podemos abrir alguns novos servidores para implantar o OpenResty em vez de substituir diretamente o serviço NGINX original. Se não houver problemas, podemos fazer um hot upgrade do arquivo binário ou gradualmente remover e substituir o NGINX do LB para atualizar.
Além de substituir o NGINX, o OpenResty tem outros dois pontos de entrada fáceis: WAF e gateways de API. Ambos são cenários com alta demanda de desempenho e dinamicidade e têm projetos de código aberto correspondentes que podem ser usados prontamente, o que eu cobri parcialmente antes.
Se continuarmos a aprofundar o OpenResty no nível do negócio, precisamos considerar mais fatores além da tecnologia, como se é fácil recrutar engenheiros relacionados ao OpenResty, se o OpenResty pode ser integrado aos sistemas técnicos existentes da empresa, etc.
Geralmente, é uma boa ideia começar substituindo o NGINX e depois expandir lentamente o uso do OpenResty.
Pergunta 2: Encapsulamento de banco de dados para OpenResty
Descrição: De acordo com o artigo anterior, devemos usar o operador de concatenação de strings
..
o mínimo possível, especialmente no caminho crítico do código. Mas ao lidar com acesso a banco de dados, preciso construir instruções SQL dinamicamente inserindo variáveis nas instruções, o que deve ser um cenário de uso comum. Mas para essa necessidade, sinto que a concatenação de strings é a maneira mais fácil, e não consigo pensar em outra maneira simples e de alto desempenho.
Você pode primeiro analisar com SystemTap
ou outras ferramentas que apresentamos nos artigos anteriores para ver se a concatenação de instruções SQL
é o gargalo do sistema. Se não for, não há necessidade de otimizá-la. Afinal, a otimização prematura é a raiz de todo mal.
Se o gargalo for realmente a concatenação de instruções SQL, então podemos usar a instrução prepare
do banco de dados para fazer a otimização ou um array para fazer a concatenação. Mas o suporte para prepare
no lua-resty-mysql
está no status TODO
, então só podemos usar a concatenação de arrays. Este também é um problema comum com algumas bibliotecas lua-resty
, que implementam a maior parte da funcionalidade e funcionam normalmente, mas não são atualizadas em tempo hábil. Além da instrução prepare
do banco de dados, o lua-resty-redis
não tem suporte para cluster
.
A concatenação de strings e as bibliotecas lua-resty
são o tipo de problema que o OpenResty deseja resolver completamente com DSL - usando tecnologia de compilação para gerar automaticamente arrays para concatenar strings, ocultando esses detalhes dos usuários de nível superior; usando DSL wirelang
para gerar automaticamente várias bibliotecas de comunicação de rede lua-resty
, eliminando a necessidade de escrever manualmente.
Isso soa maravilhoso, certo? Mas precisamos enfrentar um problema: o código gerado automaticamente não é amigável para desenvolvedores. Se você quiser aprender ou modificar o código gerado, terá que aprender tecnologia de compilação e uma DSL que pode não ser de código aberto, o que torna a barreira para participar da comunidade cada vez mais alta.
Pergunta 3: Framework Web para OpenResty
Descrição: Quero fazer um projeto Web com OpenResty, mas é doloroso principalmente porque não consigo encontrar um framework maduro, e preciso construir muitas rodas. Por exemplo, o problema de operação de banco de dados. Não encontrei uma biblioteca que possa construir instruções SQL dinamicamente e operações coerentes. Então, gostaria de perguntar ao autor, você poderia recomendar um bom framework web?
No repositório awesome-resty
, podemos ver que há uma categoria especial para frameworks web, com 20 projetos de código aberto, mas a maioria está estagnada. Entre eles, Lapis
, lor
e vanilla
são três projetos que você pode tentar para ver qual é mais adequado.
De fato, sem um framework web forte para apoiá-lo, o OpenResty fica sobrecarregado ao lidar com grandes projetos, o que é uma das razões pelas quais poucas pessoas usam o OpenResty para sistemas de negócios.
Pergunta 4: Como alterar o content-length
no cabeçalho de resposta após modificar o corpo da resposta?
Descrição: Se eu precisar modificar o conteúdo do corpo da resposta, só posso fazer alterações no filtro de corpo, mas isso fará com que o comprimento do corpo seja inconsistente com o comprimento do content-length. Como devo lidar com isso?
Nesse caso, precisamos definir o cabeçalho de resposta content-length como nil na fase de filtro de cabeçalho antes do filtro de corpo e não retorná-lo, em vez disso, transmitir a saída.
Aqui está um exemplo de código:
server {
listen 8080;
location /test {
proxy_pass http://api7.ai;
header_filter_by_lua_block {
ngx.header.content_length = nil
}
body_filter_by_lua_block {
ngx.arg[1] = ngx.arg[1] .. "abc"
}
}
}
Como você pode ver neste código, na fase de filtro de corpo, ngx.arg[1]
representa o corpo da resposta. Se adicionarmos a string abc
após ele, o comprimento do cabeçalho de resposta será impreciso, então podemos desativá-lo na fase de filtro de cabeçalho.
Além disso, este exemplo mostra como as várias fases do OpenResty trabalham juntas, o que espero que você note e pense.
Pergunta 5: Caminhos de pacotes Lua no OpenResty
Descrição: O
lua_package_path
parece ser configurado como o caminho de pesquisa para dependências Lua. Paracontent_by_lua_file
, experimentei e descobri que ele só pesquisa no prefixo com base no caminho relativo ao arquivo fornecido pela diretiva, não nolua_package_path
. Não sei se minha compreensão está correta.
lua_package_path
é usado para carregar módulos Lua, por exemplo, quando chamamos require 'cjson'
, vamos ao diretório especificado em lua_package_path
e procuramos o módulo cjson
. Em contraste, content_by_lua_file
é seguido por um caminho de arquivo no disco.
location /test {
content_by_lua_file /path/test.lua;
}
Se este não for um caminho absoluto, mas um caminho relativo.
content_by_lua_file path/test.lua;
Então, será feita uma concatenação usando o diretório -p
especificado na inicialização do OpenResty para obter o caminho absoluto.
Finalmente, você é bem-vindo a continuar a escrever suas perguntas na seção de comentários, e continuarei a respondê-las. Espero que, através da comunicação e Q&A, eu possa ajudá-lo a transformar o que você aprende em algo que você obtém. Você também é bem-vindo a compartilhar este artigo para que possamos nos comunicar e melhorar juntos.