[Marco Java] Llamada remota RPC

arquitectura RPC

1. Descripción general de RPC

RPC (Remote Procedure Call) se denomina llamada de procedimiento remoto. Utiliza la red para solicitar servicios desde una computadora remota. Puede entenderse como ejecutar una parte del programa en otra computadora remota. Después de enviar la solicitud de llamada a la computadora remota a través de la comunicación de red, esta parte del programa se ejecuta utilizando los recursos del sistema de la computadora remota y, finalmente, se devuelve el resultado de la ejecución en la computadora remota.

Las cinco partes principales de RPC

  • usuario (persona que llama al servicio)
  • talón de usuario (talón local de la persona que llama)
  • RPCRuntime (corresponsal de RPC)
  • server-stub (stub local en el lado del servidor)
  • servidor (servidor)

La persona que llama al servicio, el stub local de la persona que llama y una instancia de un paquete de comunicación RPC existen en la máquina de la persona que llama, mientras que el proveedor de servicios, el stub del proveedor de servicios y otra instancia del paquete de comunicación RPC existen en la máquina a la que se llama.

Una vez que se inicia el código del servidor, debe poder aceptar la solicitud de red de la persona que llama (como Netty, Tomcat)

A partir de un simple análisis de caso

  • El módulo Proveedor es el servidor, proporciona la implementación del servicio (interfaz), recibe la llamada (solicitud de red) de la persona que llama y devuelve el resultado de la ejecución.
  • El módulo Consumer es la persona que llama, que envía solicitudes al servidor y acepta los resultados de la ejecución.
  • El módulo común es un módulo público que proporciona definiciones de servicio (interfaz). Para uso de proveedores y consumidores
  • El módulo RPC es el marco de implementación de la arquitectura RPC.
    • Proporciona el inicio de los servicios de red (HttpServer)
    • Proporciona procesamiento de solicitudes de red (HttpServerHandler)
    • Proporciona una asignación entre los nombres de interfaz y las clases de implementación, lo que facilita encontrar rápidamente la clase de implementación correspondiente al método de llamada de solicitud de red (LocalRegister, aquí se usa el registro local)
    • Proporcione la encapsulación del nombre de la interfaz, el nombre del método, la matriz de tipo de parámetro y la matriz de parámetros en la solicitud de red (Invocación, necesidad de implementar la interfaz de serialización)
    • Proporcione una clase de fábrica de proxy para que Consumer cree un objeto de proxy y llame directamente al método en el servicio a través del objeto de proxy (ProxyFactory, implementado por la clase de proxy dinámica Proxy en JDK)

En segundo lugar, los puntos de desarrollo del marco RPC.

descubrimiento de servicios

Obtenga la dirección IP y el puerto (lista de URL) correspondiente al nombre de la interfaz de un centro de registro remoto (como Redis)

List<URL> urlList = RemoteRegister.get(interfaceClass.getName(), "1.0");

balanceo de carga

Load Balance (LoadBalance) proporciona muchos tipos de estrategias, aquí realiza una estrategia aleatoria

public class LoadBalance {
    
    

	public static URL random(List<URL> urls){
    
    
		Random random = new Random();
		int randomIndex = random.nextInt(urls.size());
		return urls.get(randomIndex);
	}
}

tolerancia a fallos de servicio

Manejo amigable de excepciones donde pueden ocurrir excepciones, como devolver información específica cuando falla una conexión de red

También puede llamar a la clase de implementación personalizada HelloServiceErrorCallback en la captura para llamar al método de devolución de llamada de error específico

//服务调用:发送请求
String result = null;
try {
    
    
    HttpClient client = new HttpClient();
    result = client.send(url.getHostname(), url.getPort(), invocation);
}catch (Exception e){
    
    
    return "服务调用失败!";
}

reintento de servicio

Cuando falla una llamada de servicio, puede intentar llamar a otros servicios en el clúster

simulacro de servicio

Si el código comercial del servidor aún no se ha desarrollado y la persona que llama necesita un resultado de retorno, se puede implementar con un simulacro.

En la lógica de llamada del objeto proxy, juzgue si hay información sobre el parámetro simulado y, de ser así, devuelva directamente la información en el simulacro.

String mock = System.getProperty("mock");
if( mock != null && mock.startsWith("return:")){
    
    
    String result = mock.replace("return:", "");
    return result;
}

3. Implementación de código de caso

Para obtener el código fuente, puedes ir a mi Github

Dependencias requeridas en el módulo RPC

<dependencies>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>9.0.43</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>
</dependencies>

Supongo que te gusta

Origin blog.csdn.net/Dae_Lzh/article/details/131943470
Recomendado
Clasificación