RPC est l'abréviation des appels de procédure distante. Il est largement utilisé dans les applications distribuées à grande échelle. Sa fonction est d'aider la division verticale du système et de rendre le système plus facile à développer. Il existe de nombreux cadres RPC en Java, chacun avec ses propres caractéristiques, et ceux largement utilisés incluent RMI, Hessian, Dubbo, etc. Une autre caractéristique du RPC est qu'elle peut traverser les langues. Cet article ne prend que RPC dans la langue Java comme exemple.
Il existe un diagramme de relation logique pour RPC, en prenant RMI comme exemple:
D'autres structures de cadre sont similaires, les différences sont dans la méthode de sérialisation de l'objet, le protocole de communication pour transmettre l'objet, la gestion du centre d'enregistrement et la conception de basculement (en utilisant ZooKeeper).
Le client et le serveur peuvent s'exécuter dans différents JVM. Le client doit uniquement introduire des interfaces. L'implémentation de l'interface et les données requises lors de l'exécution sont toutes du côté du serveur. La principale technologie de dépendance de RPC est les protocoles de sérialisation, de désérialisation et de transmission. Java correspond à la sérialisation, à la désérialisation et à la transmission d'objets et à la transmission de données sérialisées. La sérialisation RMI et la désérialisation appartiennent à Java. La sérialisation et la désérialisation dans la Hesse sont privées, le protocole de transmission est HTTP et la sérialisation de Dubbo peut être sélectionnée de plusieurs manières. Généralement, le protocole de sérialisation Hessian est utilisé et la transmission est le protocole TCP, qui utilise le network NIO Framework à haute performance. En ce qui concerne la sérialisation, je sais également certaines choses, telles que Google's Probuffer, JBoss Marshalling, Apache Thrift, etc. J'ai déjà écrit un article de blog présentant Probuffer.
1. RMI (appel de méthode distante)
L'outil d'appel de méthode distant fourni avec Java a certaines limites. Après tout, c'était la conception de la langue java au début. Plus tard, les principes de nombreux cadres étaient basés sur RMI. L'utilisation de RMI est la suivante:
Interface externe
L'interface publique Iservice étend Remote {public String QueryName (String NO) lève RemoteException; } </span>Mise en œuvre du service
Importer java.rmi.RemoteException; Importer java.rmi.server.UnicastremoteObject; // Implémentation de service Classe publique ServiceIMPL étend UnicastremoteObject Implements Iservice {/ ** * / private static final long SerialVersionUID = 682805210518738166l; / ** * @Throws RemoteException * / Protected ServiceImpl () lève RemoteException {super (); } / * (non javadoc) * @see com.suning.ebuy.wd.web.iservice # queryName (java.lang.string) * / @Override public String QueryName (String no) lance RemoteException {// spécifique implémentation de la méthode System.out.println ("bonjour" + no); return String.ValueOf (System.CurrentTimeMillis ()); }}Client RMI
Importer java.rmi.RemoteException; Importer java.rmi.registry.locateRegistry; Importer java.rmi.registry.Registry; // RMI Server public class Server {public static void main (String [] args) {// registre Manager Registry registry = null; essayez {// Créer un Registry de service = locateRegistry.CreateRegry (8088); } catch (RemoteException e) {} try {// Créer un service ServiceImpl Server = new ServiceImpl (); // lie le service et nommez le registre.Rebind ("Vince", serveur); System.out.println ("Bind Server"); } catch (RemoteException e) {}}}Le gestionnaire d'enregistrement de service est écrit sur le serveur et, bien sûr, il peut également être extrait en tant que service distinct. Dans certains autres cadres, Zookeeper est souvent utilisé comme rôle de gestion d'enregistrement.
2. Hesse (appel de méthode distant basé sur HTTP)
Sur la base de la transmission du protocole HTTP, les performances ne sont pas parfaites. L'équilibrage de charge et le transfert de défaillance dépendent de l'équilibreur de charge de l'application. L'utilisation de Hessian est similaire à RMI. La différence est que cela minimise le rôle du registre. Grâce à l'appel d'adresse affiché, HessianProxyFactory utilise un objet proxy basé sur l'adresse configurée. De plus, le package JAR de Hessian est également introduit.
3. Dubbo (Open source du cadre RPC basé sur TCP sur Taobao)
Le cadre RPC haute performance basé sur Nio Framework Netty est open source par Alibaba. Le principe global est le suivant:
Avant de comprendre Dubbo, vous devez d'abord avoir une compréhension approfondie de Zookeeper. Après avoir compris Zookeeper, Dubbo n'aura pas de secrets.
Zookeeper est le centre d'enregistrement des services Dubbo. Le centre d'enregistrement basé sur la base de données de Dubbo n'a pas utilisé Zookeeper. Zookeeper est un cadre de service distribué. Il s'agit d'un stockage de données pour les services de répertoire de type arborescence et peut gérer les données en clusters. Il peut être utilisé comme centre d'enregistrement pour les services Dubbo. Dubbo peut effectuer un déploiement de cluster avec Zookeeper. Lorsqu'un fournisseur a un temps d'arrêt anormal tel que la panne de courant ou autre en direct, le centre d'enregistrement Zookeeper peut supprimer automatiquement les informations du fournisseur. Lorsque le fournisseur redémarre, il peut restaurer automatiquement les données d'enregistrement et les demandes d'abonnement.
La description détaillée de Dubbo est très détaillée dans l'open source de Taobao. Dans de nombreux projets de production, Dubbo est utilisé dans de nombreux projets de production. Au cours du processus, j'ai également trouvé beaucoup de choses auxquelles faire attention, en particulier les nombreuses configurations, qui ne sont pas correctement configurées, et il est préférable de les personnaliser et de les optimiser en fonction du Dubbo open source existant.