Les frameworks RPC incluent : 1. RMI, invocation de méthode à distance ; 2. Hessian, invocation de méthode à distance basée sur HTTP 3. Dubbo, le framework RPC open source basé sur TCP de Taobao.
Les frameworks rpc sont :
RPC est l'abréviation de procédure à distance call , largement utilisé dans les applications distribuées à grande échelle, son rôle est de faciliter la division verticale du système et de faciliter son expansion. Il existe de nombreux frameworks RPC en Java, chacun avec ses propres caractéristiques. Les plus utilisés incluent RMI, Hessian, Dubbo, etc. Une autre fonctionnalité de RPC est qu'il peut multilingue. Cet article prend uniquement comme exemple le RPC dans le langage JAVA.
Il existe un diagramme de relation logique pour RPC, en prenant RMI comme exemple :
D'autres structures de framework sont similaires. La différence réside dans la méthode de sérialisation des objets, le protocole de communication pour la transmission des objets et la conception de gestion et de basculement du centre d'enregistrement (à l'aide de zookeeper).
Le client et le serveur peuvent s'exécuter dans différentes JVM. Le client n'a qu'à présenter l'interface et les données requises pour l'exécution sont toutes côté serveur. repose principalement sur la technologie. Il s'agit d'un protocole de sérialisation, de désérialisation et de transmission. En JAVA, il correspond à la sérialisation, la désérialisation et la transmission de données sérialisées. La sérialisation et la désérialisation de RMI sont natives de JAVA. La sérialisation et la désérialisation en Hessian sont privées, et le protocole de transmission est HTTP. La sérialisation de Dubbo peut être sélectionnée parmi une variété d'options. Le protocole de sérialisation de Hessian est généralement utilisé. framework NIO hautes performances Netty. Je m'y connais aussi en sérialisation, comme ProBuffer de Google, JBoss Marshalling et Apache Thrift, etc. J'ai déjà écrit un article de blog présentant ProBuffer
1. RMI (Remote Method Invocation)
Le propre outil d'invocation de méthode à distance de JAVA, mais il a certaines limites. Après tout, c'est la conception originale du langage JAVA. , les principes de nombreux frameworks étaient basés sur RMI. L'utilisation de RMI est la suivante :
Interface externe
<span style="font-size:12px;">public interface IService extends Remote { public String queryName(String no) throws RemoteException; }</span>
<.>Implémentation du service
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; // 服务实现 public class ServiceImpl extends UnicastRemoteObject implements IService { /** */ private static final long serialVersionUID = 682805210518738166L; /** * @throws RemoteException */ protected ServiceImpl() throws RemoteException { super(); } /* (non-Javadoc) * */ @Override public String queryName(String no) throws RemoteException { // 方法的具体实现 System.out.println("hello" + no); return String.valueOf(System.currentTimeMillis()); } }
Client RMI
import java.rmi.AccessException; import java.rmi.NotBoundException; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; // RMI客户端 public class Client { public static void main(String[] args) { // 注册管理器 Registry registry = null; try { // 获取服务注册管理器 registry = LocateRegistry.getRegistry("127.0.0.1",8088); // 列出所有注册的服务 String[] list = registry.list(); for(String s : list){ System.out.println(s); } } catch (RemoteException e) { } try { // 根据命名获取服务 IService server = (IService) registry.lookup("vince"); // 调用远程方法 String result = server.queryName("ha ha ha ha"); // 输出调用结果 System.out.println("result from remote : " + result); } catch (AccessException e) { } catch (RemoteException e) { } catch (NotBoundException e) { } } }
Serveur RMI
import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; // RMI服务端 public class Server { public static void main(String[] args) { // 注册管理器 Registry registry = null; try { // 创建一个服务注册管理器 registry = LocateRegistry.createRegistry(8088); } catch (RemoteException e) { } try { // 创建一个服务 ServiceImpl server = new ServiceImpl(); // 将服务绑定命名 registry.rebind("vince", server); System.out.println("bind server"); } catch (RemoteException e) { } } }
Gestion des enregistrements des services Le serveur est écrit dans le serveur et peut bien sûr être extrait en tant que service distinct. Dans certains autres frameworks, Zookeeper est souvent utilisé pour jouer le rôle de gestion des enregistrements.
2. Hessian (invocation de méthode à distance basée sur HTTP)
Basé sur la transmission du protocole HTTP, les performances sont également bon Ce n'est pas parfait. L'équilibrage de charge et le basculement dépendent de l'équilibreur de charge de l'application. L'utilisation de Hessian est similaire à RMI. La différence est que le rôle du registre est minimisé et utilise HessianProxyFactory pour créer un proxy. objet basé sur l'adresse configurée. En plus, présentez également le package Hessian Jar.
3. Dubbo (le framework RPC open source basé sur TCP de Taobao)
Un framework RPC hautes performances basé sur Netty, open source d'Alibaba Le principe général est le suivant :
Avant de comprendre Dubbo, vous devez d'abord avoir une compréhension approfondie de Zookeeper Une fois que vous aurez compris Zookeeper, Dubbo n'aura plus de secrets.
La description détaillée de Dubbo est très détaillée dans Taobao Open Source. Dubbo est utilisé dans de nombreux projets de production au travail, et de nombreux éléments doivent être pris en compte dans le processus, en particulier celui-ci. De nombreuses configurations et paramètres inappropriés seront ennuyeux. Il est préférable de le personnaliser et de l'optimiser en fonction du Dubbo open source existant.
Recommandations d'apprentissage gratuites associées :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!