Diseño de contenedores web
El desarrollo de un contenedor web implica muchas tecnologías en diferentes niveles, como el conocimiento de la capa de comunicación, el conocimiento del nivel de lenguaje del programa, etc., y un contenedor web disponible es un sistema relativamente grande, y lleva mucho tiempo explicarlo claramente. Este artículo tiene como objetivo introducir cómo diseñar un contenedor web, solo discutir las ideas de implementación y no implica demasiadas implementaciones específicas. Romperlo en varios módulos y componentes. Cada módulo de componente es responsable de diferentes funciones. La siguiente figura enumera algunos componentes básicos e introduce cada componente.
Conectarse al receptor
La responsabilidad principal es escuchar si hay una conexión de socket de cliente y recibir el socket, y luego entregar el socket al ejecutor de tareas (grupo de subprocesos) para su ejecución. Lea continuamente los enchufes desde la parte inferior del sistema, haga el menor procesamiento posible y luego tírelos al grupo de hilos. ¿Por qué enfatizar la necesidad de lidiar con lo menos posible? Esto está relacionado con los problemas de rendimiento del sistema, y el procesamiento excesivo afectará seriamente el rendimiento. Debido a que generalmente solo hay un receptor (un hilo es responsable de la recepción del socket), es probable que tenga un impacto en la duración de cada proceso de recepción. Por lo tanto, el receptor realiza un trabajo muy poco y simple, manteniendo solo algunas variables de estado, la operación de acumulación de la puerta de control de flujo, la operación de recepción del ServerSket, estableciendo algunas propiedades del zócalo recibido, colocando el enchufe recibido en el grupo de rosca y algún manejo de excepciones. Otra lógica que tarda mucho en procesarse se entrega al grupo de subprocesos, como leer los datos subyacentes del enchufe, analizar los paquetes de protocolo HTTP y responder a algunas operaciones del cliente, etc.
Controlador de número de conexión
Para una máquina, el tráfico total de solicitudes de acceso tiene un período máximo y el servidor tiene un límite físico. Para garantizar que el servidor web no se elimine, debemos tomar algunas medidas para protegerlo y prevenirlo. El tráfico aquí debe explicarse un poco más sobre el número de conexiones de socket, que controla el tráfico controlando el número de conexiones de socket. Un método efectivo es adoptar el control de flujo, que es como agregar una puerta a la entrada del flujo. El tamaño de la puerta determina el tamaño del flujo. Una vez que se alcanza el flujo máximo, la puerta se cerrará y dejará de recibir hasta que haya un canal inactivo. Los contadores se pueden implementar utilizando el marco AQS de JDK.
Fábrica de socket
Las diferentes ocasiones de uso pueden requerir diferentes niveles de seguridad. Por ejemplo, cuando las transacciones relacionadas con el pago, la información debe encriptarse antes de enviar, lo que también implica el proceso de negociación clave, mientras que en otras ocasiones ordinarias, no hay necesidad de cifrar el paquete. Reflexionar a la capa de aplicación es un problema de usar HTTP y HTTPS.
En pocas palabras, el protocolo TLS/SSL proporciona servicios de autenticación para cada comunicación ① para autenticar la legalidad de la identidad de la entidad de esta sesión. ② Proporcionar servicios de cifrado, y el fuerte mecanismo de cifrado puede garantizar que los mensajes durante la comunicación no se descifren. ③ Proporcione servicios a prueba de manipulaciones, use el algoritmo hash para firmar mensajes y asegurarse de que el contenido de comunicación no esté manejado por la verificación de las firmas.
El protocolo HTTP corresponde al socket, mientras que HTTPS corresponde a SSLSocket. Cómo generar enchufes y sslsockets se entrega a la fábrica de socket.
Definder de la tarea - Tarea
Defina las tareas que se ejecutarán y dígale al grupo de subprocesos qué tipo de tareas se ejecutará. La tarea se divide principalmente en tres puntos: procesar enchufes y responder a los clientes, disminuir el contador de recuento de conexión y cerrar el enchufe. Entre ellos, el procesamiento de el socket es el más importante y el más complejo. Incluye leer la secuencia de bytes de socket subyacente, analizar el mensaje de solicitud de protocolo HTTP (análisis de la línea de solicitud, encabezado de solicitud, cuerpo de solicitud y otra información), obtener la ruta basada en el análisis de la línea de solicitud para encontrar los recursos del proyecto web en el host correspondiente y ensamblar el mensaje de respuesta del protocolo HTTP de acuerdo con los resultados del procesamiento y la salida al cliente.
Ejecutor de tareas
Un grupo de subprocesos con un número máximo y mínimo de subprocesos se denomina "ejecutor de tareas" porque el grupo de subprocesos puede considerarse como comenzando varios hilos para detectar continuamente una cola de tareas, y una vez que se debe ejecutar una tarea, se ejecutará. El número máximo y mínimo del límite de subprocesos, el límite de tiempo de recuperación de subprocesos redundante, la acción de rechazo realizada por el grupo de subprocesos cuando el número máximo de subprocesos excede, etc.
Lectura de mensajes
Se utiliza para leer paquetes del cliente al sistema operativo subyacente y proporcionar un mecanismo de almacenamiento en búfer. Copie el mensaje a desbuf.
Salida de mensajes
Se utiliza para escribir paquetes procesados por contenedores web al sistema operativo y proporcionar un mecanismo de almacenamiento en búfer. Escriba la salida del mensaje en el sistema operativo a través del búfer.
Filtro de entrada
En este proceso de lectura, se desea un procesamiento adicional, y estos procesos adicionales pueden hacerse de manera diferente según diferentes condiciones. Teniendo en cuenta el desacoplamiento y la extensión del programa, se introducen filtros. Solo después de las operaciones de filtrado podemos llegar a Desbuf a través de capas de filtros. Este proceso es como agregar niveles de procesamiento. Las operaciones correspondientes se realizarán después de pasar por los niveles, y finalmente se completarán los datos de origen a los datos de destino.
Filtro de salida
Es similar a la función de filtro de entrada y se usa cuando la salida del mensaje.
Analizador de mensajes
Proporciona la capacidad de analizar varias partes del protocolo HTTP.
Generador de solicitud
De acuerdo con la idea orientada al objeto, los atributos y los campos de protocolo relacionados con la solicitud en cada proceso de solicitud se abstraen en un objeto de solicitud. Incluye tres partes: línea de solicitud, encabezado de solicitud y cuerpo de solicitud. Qué valores se necesitan durante el procesamiento se pueden obtener directamente del objeto de solicitud. Proporciona conveniencia para implementar los estándares de servlet.
Generador de respuesta
Correspondiente a la solicitud, se requiere un generador de objeto de respuesta. Incluye tres partes: fila de respuesta, encabezado de respuesta y cuerpo de respuesta. Los valores relevantes en el resultado de procesamiento se pueden establecer directamente en el objeto de respuesta. Proporciona conveniencia para implementar los estándares de servlet.
Mapeador de dirección
Un mapeador de direcciones es un enrutador que solicita y recursos. Se asigna un acceso solicitado de acuerdo con la ruta para encontrar el recurso de la respuesta al cliente solicitante.
ciclo vital
Para modularizar aún más, todo el contenedor tiene muchos componentes, lo que puede requerir diferentes eventos en diferentes momentos y requerir un ciclo de vida para administrar todos los componentes de manera unificada. Por ejemplo, la inicio, la parada y el cierre de todos los componentes se separan del manejo unificado de los ciclos de vida, lo que puede facilitar el manejo del ciclo de vida de estos componentes. Espero hacer algo antes y después de que algo sucede en cierto estado. Agregue un oyente de ciclo de vida para lograr con gracia.
Gerente de JMX
Monitoreo y administración del estado de operación del sistema, rendimiento del servidor, recopilación de parámetros relacionados con el servidor, carga JVM, número de conexión web, grupo de subprocesos, grupo de conexión de base de datos, administración de caché, recarga del archivo de configuración, etc. Puede proporcionar una administración visual remota, con un alto rendimiento en tiempo real. También proporciona una solución para la gestión de sistemas distribuidos.
Cargador web
Webloader se utiliza para cargar proyectos de aplicaciones web. Un contenedor web puede contener varias aplicaciones web. Para lograr el aislamiento entre Lib y Servlet, se debe utilizar un cargador de clase diferente, cargador de clases, para cada aplicación web, y estos cargadores de clase no son relaciones entre padres y hijos, para lograr un efecto de aislamiento de clase, es decir, la LIB de una aplicación web no será utilizada por otras aplicaciones web.
Gerente de sesión
El gerente de sesión administra principalmente sesiones, que incluyen: ① Generar SessionIds. En general, las cookies o URL no tienen valores de JSesionID, y el SessionId debe regenerarse como SessionID. ② Muchas sesiones de clientes se guardan en el servidor. Para las sesiones de tiempo de espera, debe limpiar regularmente para asegurarse de que la memoria del servidor no se desperdicie. ③ Para algunas sesiones importantes, se pueden persistir en el disco y se pueden volver a cargar en la memoria para su uso cuando sea necesario.
Registro de ejecución
Registre algunas advertencias, excepciones y errores en tiempo de ejecución.
Registro de acceso
El registro de acceso generalmente registra la información relacionada con el acceso del cliente, incluida la IP del cliente, el tiempo de solicitud, el protocolo de solicitud, el método de solicitud, el número de bytes de solicitud, el código de respuesta, la ID de sesión, el tiempo de procesamiento, etc. El registro de acceso puede contar el número de usuarios visitantes, las reglas de distribución del tiempo de acceso, pasatiempos personales, etc., y estos datos pueden ayudar a las empresas a tomar decisiones en sus estrategias operativas.
Gerente de seguridad
Un proyecto web se ejecuta en una plataforma de contenedores web, que es como integrar una aplicación en una plataforma para ejecutar. Para que el programa integrado se ejecute normalmente, la plataforma debe poder ejecutarse de manera segura y normalmente. Y para garantizar que la plataforma no se vea afectada por aplicaciones integradas en la mayor medida, los dos logran el efecto del aislamiento en cierta medida. Al inicio, el archivo de política se especifica por -djava.security.manager -djava.security.policy == web.policy, que define varios permisos.
Monitoreo de operaciones y administración remota
Proporciona una plataforma que puede monitorear el estado de ejecución de los contenedores web en tiempo real y puede administrarse de forma remota.
Grupo
Generalmente hay dos tipos de grupos: ① Clusters de equilibrio de carga, que generalmente usan un cierto algoritmo de distribución para distribuir uniformemente el tráfico de acceso a cada máquina en el clúster para su procesamiento. ② Clusters de alta disponibilidad, la comunicación de clúster conecta varias máquinas. Este tipo de clúster se centra más en garantizar la disponibilidad externa de todo el clúster a través de la conmutación automática o la transferencia de tráfico después de que falla una máquina en el clúster.
En general, las solicitudes web son apátridas y pueden agruparse directamente, pero la sesión implica la estado y requiere el uso de la tecnología de comunicación de clúster para copiar sesiones. Las tecnologías relacionadas incluyen multidifusión y unidifusión.
Motor de servlet
El motor Servlet utiliza la reflexión para generar objetos en el Servlet y JSP en la aplicación web y los coloca en el grupo de objetos de servlet, y llama a los métodos correspondientes de acuerdo con la situación real. La aplicación web coloca el procesamiento de la lógica comercial en el método Dopost o del perro. Cuando el contenedor web procesa la solicitud, la procesará de acuerdo con la lógica de procesamiento definida aquí, y se responderá al cliente de respuesta.
Compilador JSP
Según la especificación, JSP finalmente se compila en la ejecución de Servlet, por lo que el archivo JSP debe compilarse de acuerdo con la especificación. El compilador JSP en realidad traduce la sintaxis JSP y la procesa de acuerdo con la sintaxis JSP.
Un contenedor web básicamente contiene las funciones de los componentes introducidos anteriormente. Puede crear un contenedor web que permita que su web se ejecute de acuerdo con la implementación de cada módulo de componente.
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!