Proceso de solicitud web en profundidad

Prólogo

Con el advenimiento de la Web 2.0, la arquitectura de la red Internet ha evolucionado a partir de la tradicional C/Sarquitectura de la transformación de una forma más cómoda y eficiente B/Sarquitectura, B / S arquitectura simplifica en gran medida la dificultad de las aplicaciones de red del usuario, mejorar la experiencia del usuario.

B/S La arquitectura trae los siguientes dos beneficios:

  • El cliente utiliza un navegador unificado ( Browser). Debido a la unidad del navegador, no se requieren configuraciones especiales ni conexiones de red. Además, la naturaleza interactiva del navegador hace que sea muy fácil para los usuarios usarlo, y la herencia del comportamiento del usuario es muy fuerte, es decir, siempre que el usuario haya aprendido a navegar por Internet, sin importar qué aplicación se use, una vez que se haya aprendido, tiene la experiencia de usar cualquier otro servicio de Internet. .
  • El servidor ( Server) se basa en uno unificado HTTP. Es diferente de la arquitectura C / S tradicional que usa un protocolo de capa de aplicación personalizado. El uso de un HTTP simplifica el modo de desarrollo unificado, y tiene una gran cantidad de servidores basados en HTTP, como Apache, Nginx, Tomcaty así sucesivamente, estos servidores pueden utilizar directamente, no sólo eso, incluso el marco general para el desarrollo de servicios también pueden utilizar directamente, sin necesidad de desarrollar por separado tales como Spring, Spring MVC, MyBatisy así sucesivamente, podemos centrarnos en los servicios de lógica de negocio, que también simplifica nuestro trabajo de desarrollo.

Descripción general de la arquitectura de red B / S

B/Sprotocolo de capa de aplicación unificada basada HTTPinteractuar con los datos, con los más C/Sdiferentes aplicaciones a largo conexión a Internet modo interactivo utilizados. HTTPPor lo general, se utiliza un método de comunicación de conexión corta sin estado. Normalmente, una solicitud completa una interacción de datos, y luego la conexión de comunicación se desconecta esta vez. El uso de este método puede responder efectivamente a más solicitudes de usuarios.

Cuando la entrada en el navegador antoniopeng.com este URLtiempo y pulse Intro, muchas operaciones se producen:

Diagrama conceptual de la solicitud de red de arquitectura B / S

  1. En primer lugar, una petición DNSpara resolver el nombre de dominio que corresponde a la IPdirección.
  2. Entonces, de acuerdo a esta IPdirección para encontrar el servidor correspondiente en Internet, puesto en marcha una (/ POST / GET ...) petición al servidor. El servidor devuelve los recursos de datos predeterminados al usuario accedido, y también puede haber una lógica empresarial muy complicada en el lado del servidor.
    • Puede haber muchos servidores, y un dispositivo de equilibrio de carga (como Nginx) distribuye todas las solicitudes de los usuarios de manera uniforme.
    • Y si los datos solicitados se almacenan en la memoria caché o en un archivo estático, o en la base de datos.
  3. Por último, cuando los datos de vuelta al navegador, resolución de encontrar algunos recursos estáticos (tales como CSS,, JS) IMGiniciará tiempo adicional HTTPsolicitud, y estas solicitudes son propensos a estar en CDNel, entonces el CDNservidor procesará estas solicitudes.

Cómo hacer una solicitud

El problema es simple y compleja, simplemente significa que cuando estamos en un conjunto de datos del navegador URL, pulse la tecla ENTER para iniciar esta HTTPsolicitud, pronto será capaz de volver a ver el resultado de esta solicitud. Complejo significa que la solicitud puede iniciarse sin la ayuda de un navegador.

Y una HTTPconexión es esencialmente una Socketconexión, entonces podemos simular completamente el navegador para iniciar una HTTPpetición. Apache HttpClientUn proceso se lleva a cabo por un programa abierto HTTPpetición kit de herramientas.

Lo siguiente se basa en una HttpClientllamada de ejemplo:

Introducir dependencias

En pom.xmlel complemento org.apache.httpcomponents:httpclientdependiente

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.5</version>
</dependency>复制代码

Crear solicitud HTTP Obtener

El código de implementación es el siguiente

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

public class MyTest {
    public static void main(String[] args) {
        get();
    }

    private static void get() {
        // 创建 HttpClient 客户端
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // 创建 HttpGet 请求
        HttpGet httpGet = new HttpGet("http://www.baidu.com");
        // 设置长连接
        httpGet.setHeader("Connection", "keep-alive");
        // 设置代理(模拟浏览器版本)
        httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
        // 设置 Cookie
        httpGet.setHeader("Cookie", "UM_distinctid=34342706a09352-0376059833914f-3c604504-1fa400-16442706a0b345; CNZZDATA1262458286=1603637673-1530123020-%7C1530123020; JSESSIONID=805587506F1594AE02DC45845A7216A4");

        CloseableHttpResponse httpResponse = null;
        try {
            // 请求并获得响应结果
            httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            // 输出请求结果
            System.out.println(EntityUtils.toString(httpEntity));
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 无论如何必须关闭连接
        finally {
            if (httpResponse != null) {
                try {
                    httpResponse.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (httpClient != null) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}复制代码

Además de Javala utilización de muy comunes HttpClientherramientas, además de la línea de comandos del curlsistema, a través del rizo + URL simplemente puede iniciar una HTTPpetición

  • Ingrese el comando
curl https://www.baidu.com复制代码
  • Devolver resultados de datos HTML
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>鐧惧害涓€涓嬶紝浣犲氨鐭ラ亾</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=鐧惧害涓€涓?class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>鏂伴椈</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>鍦板浘</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>瑙嗛</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>璐村惂</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>鐧诲綍</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">鐧诲綍</a>');
                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">鏇村浜у搧</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>鍏充簬鐧惧害</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>浣跨敤鐧惧害鍓嶅繀璇?/a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>鎰忚鍙嶉</a>&nbsp;浜琁CP璇?30173鍙?nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>复制代码

Análisis HTTP

Para entender HTTPlo más importante es estar familiarizado con HTTPel HTTP Header, que controla la transmisión de datos. Lo más importante, controla el comportamiento de representación del navegador y la lógica de ejecución del servidor. Por ejemplo, cuando el servidor no tiene los datos solicitados por el usuario, devolverá un código de estado 404, diciéndole al navegador que no hay datos para solicitar, generalmente el navegador mostrará un mensaje de error muy poco dispuesto a ver "Esta página no existe".

Encabezados de solicitud HTTP comunes

Encabezado de solicitud Explicación
Aceptar-Charset Especifique el juego de caracteres recibido por el cliente
Aceptar-Codificación Especifique una codificación aceptable (por ejemplo, Accept-Encoding: gzip.deflate)
Aceptar lenguaje Especifique un lenguaje natural (por ejemplo, Accept-Language: zh-cn)
Anfitrión Especifique el host y el número de puerto del recurso solicitado (por ejemplo, Host: www.baidu.com)
Agente de usuario El cliente le dice al servidor el sistema operativo, el navegador y otros atributos.
Conexión Especifica si se mantiene la conexión actual (por ejemplo, Conexión: Keep-Alive)

Encabezados de respuesta HTTP comunes

Encabezado de respuesta Explicación
Servidor Nombre del servidor (por ejemplo, Servidor: nginx / 1.17.6)
Tipo de contenido El tipo de entidad enviada al destinatario (por ejemplo, Tipo de contenido: texto / html; charset = GBK)
Codificación de contenido Correspondiente a Accept-Encoding, la codificación adoptada por el servidor
Lenguaje de contenido Correspondiente a Accept-Language, el lenguaje natural utilizado por el recurso
Largancia de contenido Longitud del cuerpo
Mantener viva El tiempo para mantener la conexión (como Keep-Alive: timeout = 5)

Códigos de estado HTTP comunes

Código de estado Explicación
200 Solicitud exitosa
302 Salto temporal
400 La solicitud del cliente tiene un error de sintaxis que el servidor no puede reconocer
403 El servidor recibe la solicitud, pero se niega a proporcionar el servicio, es decir, no tiene autorización.
404 El recurso solicitado no existe
500 Se produjo un error inesperado en el servidor

Ver información HTTP

Miran una HTTPpetición de los encabezados de solicitud y los encabezados de respuesta pueden abrir un navegador a través de tecla de acceso directo F12 herramienta para la depuración de vista, por ejemplo, estamos visitando www.baidu.com, pulse F12 y abrir la Networkbarra de depuración para ver este HTTP Headercontenido

Información del encabezado HTTP

Mecanismo de almacenamiento en caché del navegador

Al ver una página Web se encuentran, por lo general a considerar es que el navegador no se almacena en caché, por lo que la práctica general es pulsar Ctrl + F5la combinación de teclas, una vez más solicitar esta página, así que asegúrese de que la solicitud es la última página. Porque la prensa Ctrl + F5combinaciones de teclas directamente en el destino URLenvía una solicitud, en lugar de utilizar los datos de la caché del navegador.

Como se muestra en la figura, esta solicitud no llegó al servidor, utilizando los datos en caché del navegador

El encabezado de solicitud HTTP devuelve datos en caché

Pulse la Ctrl + F5combinación de teclas para actualizar la página, se encuentra en HTTPel encabezado de la solicitud es por lo general más de dos parámetros, a saber, Cache-Control:no-cachey Pragma:no-cachelos parámetros de la función del contenido solicitado no está almacenado en caché

Después de presionar Ctrl + F5 para actualizar la página, el encabezado de solicitud HTTP devuelve los datos más recientes

Resolución de nombre de dominio DNS

Internet es publicar por URL (Uniform Resource Locator) y solicitar recursos, y URLla necesidad de resolver el nombre de dominio en IPuna dirección para establecer una conexión con el host remoto, cómo resolver un nombre de dominio en una dirección IP pertenece al ámbito de trabajo de la resolución de DNS.

Cuando el usuario ingresa a www.baidu.com en el navegador, los pasos de trabajo de la resolución DNS son los siguientes

Proceso de resolución de DNS

  1. Primero, el navegador verificará si hay una dirección IP resuelta correspondiente a este nombre de dominio en el caché. Si hay en el caché, este proceso de análisis finalizará. Caché de nombres de dominio límite de tiempo puede TTLser propiedades del conjunto.
  2. Si la memoria caché del navegador no lo hace, se comprueba el sistema operativo si existe el nombre de dominio correspondiente DNSlos resultados analíticos, en Windows puede C:\Windows\System32\drivers\etc\hostsser establecido archivo, en Linux este perfil es /etc/hosts, para modificar este archivo también puede configurar los resultados IP de resolución de nombres.
  3. Si los pasos anteriores no pueden completar la resolución del nombre de dominio, realmente solicitará al servidor de nombres de dominio que resuelva el nombre de dominio. El sistema operativo primero enviará Local DNS Serverel nombre de dominio al servidor de nombres de dominio en la región. Por ejemplo, se accede a la red del campus de la escuela, a continuación, el servidor de nombres de dominio local es, sin duda, en su escuela, si usted está en un acceso comunitario a Internet, entonces este Local DNS Serveres el proveedor de la aplicación para proporcionar acceso a Internet (Telecom, China Mobile y China Unicom), Por lo general, en un rincón de la ciudad, no muy lejos.
  4. Si Local DNS Servertodavía no ha golpeado directamente a ROOT DNS Server(dominio raíz del servidor de nombres) solicitud de resolución.
  5. El servidor de nombres de dominio raíz devolverá al servidor de nombres de dominio local una gLTD Serverdirección del nombre de dominio consultado (servidor de nombres de dominio primario), que gLTDes un servidor de nombres de dominio de nivel superior internacional, como .com, .cnetc.
  6. Local DNS Server(Servidor de nombres de dominio local) de nuevo se acaba de regresar de gTLD Serverenvío de una solicitud.
  7. Aceptado la solicitud gTLD Serverpara encontrar y devolver el nombre de dominio que corresponde a la Name Serverdirección del servidor DNS, esto Name Serveres por lo general el nombre de dominio del servicio de registro (como Ali nube - millones netos).
  8. Name ServerY a continuación, consulta los nombres de dominio de almacenamiento y tabla de asignación de IP, en circunstancias normales, para obtener los registros de nombres de dominio IP, junto con una TTLvuelta al valor Local DNS Server(servidor de nombres local).
  9. Local DNS ServerCaches correspondencia entre el nombre de dominio y IP, caché por el tiempo TTLde control de valor, el resultado final del análisis se devuelve al usuario.

Resolución de nombre de dominio

Los registros de resolución de nombres de dominio se dividen principalmente en registros A, registros MX, registros CNAME, registros NS y registros TXT.

  • Un registro: especifique la dirección IP correspondiente al nombre de dominio (varios nombres de dominio se pueden resolver a la misma IP, y una IP solo puede apuntar a un nombre de dominio).
  • Registro MX: apunte el servidor de correo bajo otro nombre de dominio a su propio servidor de correo.
  • Registro CNAME: apunte un nombre de dominio a otro nombre de dominio.
  • Registro NS: especifique el servidor de resolución DNS.
  • Registro TXT: establezca una descripción para un nombre de host o nombre de dominio.

Mecanismo de trabajo CDN

CDNEs decir, la red de distribución de contenido, principalmente almacena en caché los datos estáticos en el sitio web, como CSS, JS, IMG y otros datos. Después de una petición de usuario para iniciar el contenido dinámico servidor maestro, entonces la CDNdescarga de datos estática, lo que acelera la velocidad de datos de la página web de contenido descargado.

En general, CDNpara lograr escalabilidad, seguridad, fiabilidad, varios objetivos. Los pasos de trabajo son los siguientes:

Flujo de trabajo de CDN

  • En primer lugar, la Local DNS Serversolicitud de apertura de un servidor DNS local, por lo general después volver resolución iterativa para el proveedor de servicios de registro de nombres de dominio para resolver.
  • Generalmente hay un DNSanálisis del servidor de nombres de dominio volverá a CNAMEresolver a otro nombre de dominio, el nombre de dominio, finalmente, será dirigido a CDNGlobal en el DNSservidor de equilibrio de carga, y luego por GTMacuerdo con acceder a la dirección de un usuario, recientemente devuelto al usuario del acceso CDNnodo.
  • Para obtener CDNel resultado del análisis, el usuario directamente al CDNnodo de acceso a los archivos estáticos, y si este nodo en el archivo solicitado no existe, será volver a la estación de origen para obtener el archivo, y luego devueltos al usuario.

Balanceo de carga

El equilibrio de carga ( Load Balance) es equilibrar y distribuir tareas de trabajo a múltiples unidades de operación para realizar tareas juntas.

Puede mejorar la velocidad de respuesta del servidor y la eficiencia de utilización, evitar un solo punto de falla del software y resolver problemas de congestión de la red.

Generalmente hay tres arquitecturas de equilibrio de carga:

  • Balanceo de carga de enlace: las ventajas son: no es necesario pasar por otros servidores proxy, por lo general, la velocidad de acceso será rápida, la desventaja es que hay un caché, es difícil actualizar la estructura de resolución de nombres de dominio a tiempo.
  • Cluster de equilibrio de carga
    • Equilibrio de carga de hardware: la ventaja es que el rendimiento es muy bueno y la desventaja es que es muy costoso y no se puede expandir dinámicamente.
    • Equilibrio de carga de software: la ventaja es que el costo es muy bajo, y la desventaja es que una sola solicitud de acceso generalmente pasa por varios servidores proxy, lo que aumenta el retraso de la red.
  • Equilibrio de carga del sistema operativo: utilice interrupciones suaves o duras a nivel del sistema operativo para lograr el equilibrio de carga, como configurar varias tarjetas de red.

CDN aceleración dinámica

Principio técnico: En CDNel DNSanálisis posterior detección de vínculos dinámicos a la fuente para encontrar el mejor camino, a continuación, todas las peticiones DNS la programación prevista en esta ruta seleccionada volver a la fuente, acelerando así la eficiencia de acceso del usuario.

detección de enlace: En cada CDNdescarga de un determinado tamaño de archivo de la estación desde el nodo de origen para ver que vinculan el tiempo total más corto, por lo que se puede formar una lista de enlaces, y luego unirse a DNSla resolución, a la actualización Local DNS Server.

  • Autor: Peng Chao
  • Este artículo apareció por primera vez en un blog personal: antoniopeng.com/2020/04/07/…
  • Aviso de derechos de autor: Todos los artículos en este blog usan el acuerdo de licencia CC BY-NC-SA 4.0 a menos que se indique lo contrario. Reproducido por favor, especifique de Chao Peng | Blog !

Supongo que te gusta

Origin juejin.im/post/5e9471826fb9a03c930572dd
Recomendado
Clasificación