ruby-on-rails - rails - ruby rackup
¿Qué es el middleware cuando se hace referencia en el contexto de Ruby on Rails? (5)
A menudo escucho el término ''middleware'' en el contexto de Ruby on Rails. ¿Qué es exactamente? ¿Puedes dar ejemplos específicos?
El middleware Rails le permite capturar la solicitud o respuesta antes de que llegue a Rails, y modificarla. (Estás en el medio entre Rack y Rails). Por ejemplo, puede tomar cada respuesta que devuelva un tipo mime "imagen / png" y agregarle una marca de agua antes de permitir que se mueva hacia el Rack para servir. O puede filtrar las solicitudes que no le gustan por algún motivo (no autorizado, no tiene un encabezado) y nunca dejar que toquen los rieles. O puede agregar un encabezado a una solicitud entrante antes de pasarlo a los rieles. O puede tomar una respuesta proveniente de rieles, y si es "text / html" puede comprimir html (eliminar espacios en blanco, etc.) antes de pasar a la salida. (Estaba experimentando con él en http://github.com/maxim/html_press )
Estas pequeñas aplicaciones son muchas y están conectadas como "middleware".
Imagina que quieres crear un servicio de caché. Este servicio de almacenamiento en caché sería independiente de la aplicación, por lo que podría usarlo con muchas aplicaciones. También te gustaría soportar muchos servidores web diferentes.
¿Observa cómo se asienta en el medio entre el servidor y el marco? Es un ejemplo de middleware. No es lógica de la aplicación y tampoco es realmente una red de bajo nivel, pero proporciona un servicio en algún punto intermedio. Algunos ejemplos son QoS (calidad de servicio), seguridad, almacenamiento en caché, ...
Sería bueno si su servicio fuera compatible con todos los n servidores populares (y algunos de los no tan populares) (thin, webrick). Si los apoyara a todos, más personas podrían usar su maravilloso software. Podría ver que hacer que esto sucediera sería un verdadero obstáculo, tendría que admitir cada servidor con un código especial específico del servidor.
Ahora, eso es solo la mitad del problema porque también hay varios marcos web. Rails es el gorila de 500 libras, pero hay otros marcos, como Merb y Sinatra . El soporte de estos en su servicio de almacenamiento en caché es otra de las m cosas diferentes para apoyar. Ahora estás apoyando nxm diferentes caminos. Qué lata.
Entrar en Rack Rack se encuentra entre los marcos y los servidores y le brinda una interfaz para codificar su servidor de almacenamiento en caché. Si los servidores y los marcos admiten el bastidor, y la mayoría lo hace, su servicio solo necesita ser compatible con la interfaz del bastidor y usted obtiene soporte para todos los marcos y servicios compatibles con el bastidor. (Es un poco como el látex compilando en dvi y luego convirtiendo la dvi en ps, pdf, ...). No necesita un convertidor de Merb a WEBrick y otro de Sinata a Thin. Si su servicio de almacenamiento en caché admite el rack, está aislado de las diferencias.
Con esta "cintura estrecha", donde todos los marcos-m se juntan antes de bifurcarse en n-servidores entre la aplicación y el servidor, también puede ver cómo proporciona un buen lugar para agregar funcionalidades como enrutamiento, registro, servicio estático que evita el Lentitud de su marco interpretado, etc.
Middleware está relacionado con Rack, la API estándar de Ruby para aplicaciones web. Como las aplicaciones de Rails son aplicaciones de Rack en estos días, se aplican a ambas.
El middleware de rack es todo entre los servidores de aplicaciones (Webrick, Thin, Unicorn, Passenger, ...) y la aplicación real, como la aplicación Rails. Es la pipeline entre el servidor de aplicaciones web y la aplicación en sí.
La entrada a una aplicación de Rack es un "entorno" que contiene todos los detalles de la solicitud HTTP (y más). La salida es una respuesta HTTP. Las capas de middleware son como filtros que pueden modificar la entrada, la salida o ambos. Rails usa middleware para implementar algunas de sus características (caché de consultas, almacenes de cookies, expansión del método http), pero puede agregar el suyo propio.
El middleware de Rack es una forma efectiva de reutilizar el comportamiento simple relacionado con la web en aplicaciones web que usan Rack, independientemente del marco subyacente. Si una parte de su aplicación agrega funcionalidad, pero no es responsable de una respuesta HTTP , califica como middleware de Rack.
Algunos ejemplos de cosas que podría implementar como middleware de Rack incluyen:
- Almacenamiento en caché HTTP (lado del servidor y lado del cliente)
- Explotación florestal
- Autenticación
- Vigilancia
- Filtrado de encabezado HTTP
Vea también esta pregunta SO .
Explicación a un niño de 4 años:
¿Recuerdas el juego: "Susurros chinos" que jugaste de niño? (no pretendía el racismo, en realidad era como se llamaba el juego en mi época). Quiere decirle a un amigo, que se sienta en el otro extremo de la línea, un mensaje especial. pero no puede decírselo directamente: debe pasar su mensaje de persona a persona hasta que finalmente lo reciba.
Pero más a menudo que no encontrará que los cambios en el mensaje ocurren a medida que pasa por la cadena, hasta que llega al punto final. Por ejemplo:
- Originador : "Siempre recordará esto como el día en que casi atrapó al Capitán Jack Sparrow".
- Persona 1: continúa: "Siempre recordarás el día en que casi atrapaste al Capitán Jack Sparrow".
- Persona 2: continúa: "Siempre recordarás el día en que casi atrapaste al Capitán Jack Sparrow".
- Persona 3 - pasa: "Recordarás el día en que atrapaste al capitán Jack Sparrow".
- Persona 4 - pasa: "Recordarás al Capitán Jack Sparrow".
- Mensaje final recibido : “Recordar”
El software intermedio es básicamente la gente que se encuentra entre usted, el originador del mensaje y el mensaje final que se recibió: ¿nota cómo pueden cambiar o filtrar el mensaje? Eso es un poco de lo que se trata el middleware en pocas palabras. Por supuesto, la anología es tensa, pero esperamos que esto le brinde una base para comprender las respuestas más técnicas de arriba.