Preguntas frecuentes de OpenResty | Cómo se utiliza OpenResty en la práctica

API7.ai

February 10, 2023

OpenResty (NGINX + Lua)

  1. Algunas preguntas y respuestas sobre OpenResty, API Gateway y Lua
  2. Preguntas frecuentes de OpenResty | Permisos de procesos privilegiados, fase de ejecución y más
  3. Preguntas frecuentes de OpenResty | Estructura de red para pruebas, características relacionadas con SSL, DSL, herramienta ab
  4. Preguntas frecuentes de OpenResty | Carga dinámica, NYI y almacenamiento en caché de Shared Dict

Hasta ahora, hemos terminado la última sección de OpenResty, Microservices API Gateway. Felicitaciones por no quedarse atrás, aprender y practicar activamente, y dejar entusiastamente sus pensamientos.

He seleccionado algunas preguntas típicas e interesantes aquí para compartir con ustedes. Veamos estas 5 preguntas de hoy.

Pregunta 1: Cómo se usa OpenResty en la práctica

Descripción: El curso está casi terminado, y básicamente puedo entenderlo, pero mi propia práctica todavía es baja (actualmente no se usa en mi trabajo). porque no puedo usarlo en mi trabajo. Sin embargo, esta es una serie de artículos muy útil. Gracias al autor por seguir compartiendo, y lo introduciré más adelante en mi trabajo.

Me gustaría hablar sobre la introducción de OpenResty en el trabajo, un tema que vale la pena discutir.

OpenResty se basa en NGINX y agrega el módulo C lua-nginx-module y numerosas bibliotecas lua-resty, por lo que OpenResty es una buena alternativa para NGINX, que es la forma más económica de comenzar a usar OpenResty. Por supuesto, hay riesgos asociados con este proceso de reemplazo, por lo que debe tener en cuenta los siguientes tres puntos.

Primero, asegúrese de que la versión de NGINX en línea sea la misma que la versión principal de OpenResty, como OpenResty 1.15.8.1, que usa NGINX 1.15.8. Si la versión actual de NGINX en línea es más alta que la última versión de OpenResty, debe cambiar a OpenResty con precaución. Después de todo, OpenResty todavía es lento para actualizarse y está entre seis meses y un año detrás de la versión principal de NGINX. Si la versión de NGINX en línea es la misma o inferior a la de OpenResty, entonces tiene los requisitos previos para actualizar.

Segundo, pruebas. Las pruebas son uno de los aspectos más importantes. Hay poco riesgo en usar OpenResty para reemplazar NGINX, pero aún existen riesgos. Por ejemplo, si hay módulos C personalizados que necesitan ser compilados, la versión de openssl de la que depende OpenResty, y si el parche que OpenResty aplica a NGINX afectará el negocio. Necesita replicar parte del tráfico del negocio para verificar esto.

Tercero, cambio de tráfico. Después de que se apruebe la validación básica, aún necesita verificar el lanzamiento canario del tráfico real en línea. Para revertir rápidamente, podemos abrir algunos servidores nuevos para implementar OpenResty en lugar de reemplazar directamente el servicio original de NGINX. Si no hay problemas, podemos actualizar el archivo binario en caliente o eliminar y reemplazar gradualmente NGINX desde LB para actualizar.

Además de reemplazar NGINX, OpenResty tiene otros dos puntos de entrada fáciles: WAF y API gateways. Ambos son escenarios con altos requisitos de rendimiento y dinámica y tienen proyectos de código abierto correspondientes que se pueden usar de inmediato, lo cual cubrí en parte antes.

Si continuamos profundizando en OpenResty a nivel de negocio, debemos considerar más factores más allá de la tecnología, como si es fácil reclutar ingenieros relacionados con OpenResty, si OpenResty puede integrarse con los sistemas técnicos existentes de la empresa, etc.

En general, es una buena idea comenzar reemplazando NGINX y luego expandirse lentamente para usar OpenResty.

Pregunta 2: Encapsulación de bases de datos para OpenResty

Descripción: Según el artículo anterior, deberíamos usar .. (operador de concatenación de cadenas) lo menos posible, especialmente en la ruta crítica del código. Pero al manejar el acceso a la base de datos, necesito construir declaraciones SQL dinámicamente insertando variables en las declaraciones, lo que debería ser un escenario de uso común. Pero para este requisito, siento que la concatenación de cadenas es la forma más fácil, y no puedo pensar en otra forma simple y de alto rendimiento.

Puede analizarlo primero con SystemTap u otras herramientas que presentamos en los artículos anteriores para ver si la concatenación de declaraciones SQL es el cuello de botella del sistema. Si no lo es, no es necesario optimizarlo. Después de todo, la optimización prematura es la raíz de todos los males.

Si el cuello de botella es realmente la concatenación de declaraciones SQL, entonces podemos usar la declaración prepare de la base de datos para hacer la optimización o un array para hacer la concatenación. Pero el soporte de lua-resty-mysql para prepare está en estado TODO, por lo que solo podemos usar la concatenación de arrays. Este también es un problema común con algunas bibliotecas lua-resty, que implementan la mayor parte de la funcionalidad y funcionan normalmente, pero no se actualizan a tiempo. Además de la declaración prepare de la base de datos, lua-resty-redis no tiene soporte para cluster.

La concatenación de cadenas y las bibliotecas lua-resty son el tipo de problemas que OpenResty quiere resolver completamente con DSL: usar tecnología de compilación para generar automáticamente arrays para concatenar cadenas, ocultando estos detalles a los usuarios de nivel superior; usar DSL wirelang para generar automáticamente varias bibliotecas de comunicación de red lua-resty, eliminando la necesidad de escribirlas a mano.

¿Suena maravilloso, verdad? Pero debemos enfrentar un problema: el código generado automáticamente no es amigable para los desarrolladores. Si desea aprender o modificar el código generado, tiene que aprender tecnología de compilación y un DSL que puede no ser de código abierto, lo que hace que la barrera para participar en la comunidad sea cada vez más alta.

Pregunta 3: Marco web de OpenResty

Descripción: Quiero hacer un proyecto web con OpenResty, pero es doloroso principalmente porque no puedo encontrar un marco maduro, y necesito construir muchas ruedas. Por ejemplo, el problema de operación de la base de datos. No encontré una biblioteca de clases que pueda construir dinámicamente declaraciones SQL y operaciones coherentes. Entonces me gustaría preguntar al autor, ¿podría recomendar un buen marco web?

En el repositorio awesome-resty, podemos ver que hay una categoría especial para un marco web, hay 20 proyectos de código abierto, pero la mayoría de ellos están estancados. Entre ellos, Lapis, lor y vanilla son tres proyectos que puede probar para ver cuál es más adecuado.

De hecho, sin un marco web fuerte que lo respalde, OpenResty se ve abrumado al manejar proyectos grandes, lo cual es una de las razones por las que pocas personas usan OpenResty para sistemas de negocio.

Pregunta 4: ¿Cómo cambiar el content-length en el encabezado de respuesta después de modificar el cuerpo de la respuesta?

Descripción: Si necesito modificar el contenido del cuerpo de la respuesta, solo puedo hacer cambios en el filtro del cuerpo, pero esto hará que la longitud del cuerpo sea inconsistente con la longitud de content-length. ¿Cómo debo manejarlo?

En este caso, necesitamos establecer el encabezado de respuesta de longitud de contenido en nil en la fase de filtro de encabezado antes del filtro del cuerpo y no devolverlo y transmitir la salida en su lugar.

El siguiente es un código de ejemplo:

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 puede ver en este código, en la fase de filtro del cuerpo, ngx.arg[1] representa el cuerpo de la respuesta. Si agregamos la cadena abc después, el encabezado de respuesta de longitud de contenido será inexacto, por lo que podemos deshabilitarlo en la fase de filtro de encabezado.

Además, este ejemplo muestra cómo las diversas fases de OpenResty trabajan juntas, lo cual espero que note y piense.

Pregunta 5: Rutas de paquetes Lua en OpenResty

Descripción: lua_package_path parece estar configurado como la ruta de búsqueda de dependencias de Lua. Para content_by_lua_file, experimenté y descubrí que solo busca bajo el prefijo basado en la ruta relativa al archivo proporcionado por la directiva, no bajo lua_package_path. No sé si mi comprensión es correcta.

lua_package_path se usa para cargar módulos Lua, por ejemplo, cuando llamamos require 'cjson', iremos al directorio especificado en lua_package_path y buscaremos el módulo cjson. En contraste, content_by_lua_file va seguido de una ruta de archivo en el disco.

location /test {
     content_by_lua_file /path/test.lua;
 }

Si esta no es una ruta absoluta sino una ruta relativa.

 content_by_lua_file path/test.lua;

Entonces se hará una concatenación usando el directorio -p especificado al iniciar OpenResty para obtener la ruta absoluta.

Finalmente, les invito a seguir escribiendo sus preguntas en la sección de comentarios, y seguiré respondiéndolas. Espero que a través de la comunicación y las preguntas y respuestas, pueda ayudarlos a convertir lo que aprenden en lo que obtienen. También les invito a compartir este artículo para que podamos comunicarnos y mejorar juntos.