¿Quién puede explicar en un lenguaje sencillo lo que es el marco de RPC?

Autor: Hong Chuntao
enlace: https: //www.zhihu.com/question/25536695/answer/221638079
Fuente: sabemos casi
con derechos de autor por el autor. reimpresión comercial póngase en contacto con el autor autorizada, reimpresión no comercial por favor indique la fuente.

No fue invitado, una ola de respuesta fuerte. Hablemos de principios. RPC llamada de procedimiento local es de funcionar como una llamada local a la misma función de ajuste remoto. Antes de la RPC estudio, echamos un vistazo a cómo el tono de una llamada local. Supóngase que se desea llamar a una función Multiply para calcular el resultado lvalue * rvalue de :. 1 int Multiply (int L, int R & lt) {
2 int Y = L * R & lt;
. 3 retorno Y;
. 4}
5.
6 int lvalue = 10;..
. 7 int rvalue = 20 es;
. 8 = int l_times_r la Multiply (lvalue, rvalue.);
A continuación, la octava fila, que en realidad realiza las siguientes operaciones: lvalue y empuje rvalue en el valor de la función Multiply, el valor de la extracción de la pila 10 y 20, que imparten l y 2 del código para realizar fila r, l calcula * r, y el resultado de la presencia de y y en la pila, y luego regresar la línea Multiply 8, el valor de retorno se extrae de la pila 200, y la asignación a la etapa 5 anterior se realiza l_times_r llamada de procedimiento local. (20.190.116 Nota: Los pasos anteriores son sólo ilustrativas de los principios a menudo se puede hacer en la optimización del compilador de hecho, parámetros y valores de retorno en el caso de almacenar menos directamente en un registro, sin la necesidad de impulsar el proceso de hacer estallar necesidad aún. para llamar, pero no la operación directamente en línea. principio Lejos, este 5-paso no es un problema.) ha traído nuevos problemas en la llamada remota llamada a procedimiento remoto, que necesitamos para llevar a cabo el cuerpo de la función es en una máquina remota es decir, Multiplicar se ejecuta en otro proceso. Esto trae varios temas nuevos: mapeo de la identificación de llamada. decirnos cómo tenemos que llamar a la máquina remota Multiplicar, en lugar de la opción Agregar o FooBar ella? En una llamada local, el cuerpo de la función se especifica directamente por el puntero de función, que llamamos Multiplicar, el compilador le ayudará automáticamente a nosotros llamamos el puntero de función apropiada. Sin embargo, en la llamada de larga distancia, el puntero de función no es suficiente, ya que el espacio de direcciones de ambos procesos son completamente diferentes. Así, en el RPC, todas las funciones deben tener su propia identificación. Esta identificación es la única certeza en todos los procesos. El cliente al realizar una llamada a procedimiento remoto, debe incluir esta identificación. A continuación, también necesitamos el cliente y el servidor, respectivamente, para mantener una función {<-> ID de llamada} tabla de correspondencia. Ambas tablas no necesitan necesariamente idénticas, pero la misma función que la correspondiente identificación de llamada deben ser los mismos. Cuando un cliente necesita una llamada remota, comprobará esta tabla, encontrar la adecuada identificación de llamada, y luego pasarlo al servidor, el servidor también look-up table para determinar la función de la necesidad del cliente a la llamada, a continuación, realizar la adecuada código de función. Serialización y de-serialización. El cliente cómo los parámetros pasados ​​a la función de control remoto que? En una llamada local, sólo tenemos que argumentos en la pila, y luego déjese función de ir a leer la pila en la línea. Sin embargo, en la llamada a procedimiento remoto, el cliente con el servidor es un proceso diferente, no a través de la memoria de parámetros de paso. Y a veces el cliente y el servidor no están utilizando el mismo lenguaje (como el uso del lado del servidor C ++, Java o un cliente con Python). Esta vez tenemos que poner el cliente primer argumento convertido en un flujo de bytes, transcurrido después del final del servicio, entonces el flujo de bytes en un formato que se puede leer. Este proceso se llama serialización y de-serialización. Del mismo modo, el valor devuelto por el servidor también puede requerir proceso de deserialización serialización. La transmisión por red. Las llamadas de larga distancia a menudo se utilizan en la red, cliente y el servidor están conectados a través de una red. Todos los datos se transmiten a través de la red son necesarios, y por lo tanto hay una necesidad de una capa de transporte de red. La red de transporte a las necesidades a nivel de byte de parámetro después de la ID de llamada y la corriente en serie con el servidor, y luego llama a la parte de atrás serializada resultado al cliente. Mientras tanto se puede completar, se puede usar como la capa de transporte. Por lo tanto, en realidad se utiliza el protocolo no está limitada, para completar la línea de transmisión. Aunque la mayoría marco RPC utiliza el protocolo TCP, UDP, pero en realidad lata, y GRPC simplemente utilizar HTTP2. Java Netty también pertenecen a esta capa de las cosas. Con estos tres mecanismos, RPC será capaz de lograr el proceso específico es el siguiente: // Client-side Después de la serialización de bytes de parámetros ID y pasa al servidor, y luego llama al resultado de ese entonces por entregas al cliente. Mientras tanto se puede completar, se puede usar como la capa de transporte. Por lo tanto, en realidad se utiliza el protocolo no está limitada, para completar la línea de transmisión. Aunque la mayoría marco RPC utiliza el protocolo TCP, UDP, pero en realidad lata, y GRPC simplemente utilizar HTTP2. Java Netty también pertenecen a esta capa de las cosas. Con estos tres mecanismos, RPC será capaz de lograr el proceso específico es el siguiente: // Client-side Después de la serialización de bytes de parámetros ID y pasa al servidor, y luego llama al resultado de ese entonces por entregas al cliente. Mientras tanto se puede completar, se puede usar como la capa de transporte. Por lo tanto, en realidad se utiliza el protocolo no está limitada, para completar la línea de transmisión. Aunque la mayoría marco RPC utiliza el protocolo TCP, UDP, pero en realidad lata, y GRPC simplemente utilizar HTTP2. Java Netty también pertenecen a esta capa de las cosas. Con estos tres mecanismos, RPC será capaz de lograr el proceso específico es el siguiente: // Client-side
// int l_times_r = Call (SERVERADDR, Multiplicar, lvalue, rvalue)

  1. Esta llamada se asigna a un identificador de llamadas. Se supone que cuando la cadena con el más sencillo método de identificación de llamadas
  2. El ID de llamada, y la serialización lvalue rvalue. Sus valores pueden envasarse directamente en forma binaria
  3. 2. El paquete de datos obtenido a SERVERADDR, que requiere el uso de la red de capa de transporte
  4. Esperar a que el servidor devuelva resultados
  5. Si la llamada servidor tiene éxito, entonces el resultado será deserialized y cesionarios l_times_r

// del lado del servidor

  1. Mantenida localmente un puntero a la función de identificación de llamadas call_id_map mapa, puede std :: mapa <std :: string, std :: función <>>
  2. A la espera de una solicitud
  3. Después de obtener un paquete de solicitud de deserializar dar Call ID
  4. Al observar call_id_map dar el puntero de función que corresponde
  5. Después lvalue y rvalue deserializan función se multiplican en una llamada local, los resultados obtenidos
  6. Después de la secuencia de resultados devueltos por la red al cliente
    de manera de lograr un marco RPC, de hecho, simplemente presione el anterior procesos para lograr básicamente completado. En el que: la identificación de llamada cuerdas función de mapeo se pueden usar directamente, también puede utilizar el ID de número entero. tabla de asignación general es una tabla hash. deserialización serialización puede escribir su propia, o puede utilizar FlatBuffers protobuf similares. Las bibliotecas pueden escribir su propia toma de red de transmisión, o utilizar asio, ZeroMQ, Netty y similares. Por supuesto, también hay algunos de los detalles se pueden llenar, tales como la forma de hacer frente a los errores de red, cómo prevenir los ataques, ¿cómo el control de flujo, y así sucesivamente. Pero con más de arquitectura, que puede ser sostenida añadió. Por último, estamos interesados en lata mirada a sí mismo en una pequeña pero excelente tinyrpc biblioteca RPC (hjk41 / tinyrpc), la comprensión de cómo funciona para RPC es muy bueno.
Publicado 26 artículos originales · ganado elogios 0 · Vistas 8158

Supongo que te gusta

Origin blog.csdn.net/lynchyueliu/article/details/104940636
Recomendado
Clasificación