48 votes

RMI vs. Web Services. Quelle est la meilleure solution pour le remoting Java2Java ?

Je suis novice en matière de services Web et de RMI et je me demande quel est le meilleur moyen de réaliser un remoting entre différentes applications Web, lorsque ces applications sont toutes écrites en Java, c'est-à-dire lorsque les différents langages de programmation n'ont pas d'importance (ce qui serait l'avantage des services Web).

D'une part, je suppose qu'il y a un surcoût de performance lors de l'utilisation des services web (quelqu'un a-t-il des chiffres pour le prouver ?), d'autre part, il me semble que les services web sont beaucoup moins couplés et peuvent être utilisés pour mettre en œuvre une architecture plus orientée services (SOA) (ce qui n'est pas possible avec RMI, n'est-ce pas ?).

Bien qu'il s'agisse d'une question assez générale, quel est votre avis ?

Gracias

35voto

Mario Ortegón Points 8563

Les services web permettent une architecture à couplage lâche. Avec RMI, vous devez vous assurer que les définitions de classes restent synchronisées dans toutes les instances de l'application, ce qui signifie que vous devez toujours les déployer toutes en même temps, même si une seule d'entre elles est modifiée (pas nécessairement, mais c'est souvent nécessaire à cause des UUID en série et autres).

Il n'est pas non plus très évolutif, ce qui peut poser problème si vous souhaitez disposer de répartiteurs de charge.

À mon avis, RMI fonctionne mieux pour les petites applications locales, qui ne sont pas liées à l'internet, mais qui doivent quand même être découplées. Je l'ai utilisé pour une application Java qui gère les communications électroniques et j'ai été assez satisfait des résultats. Pour d'autres applications qui nécessitent un déploiement plus complexe et qui fonctionnent sur l'internet, je préfère utiliser les services web.

10 votes

"De plus, il n'est pas très évolutif" Pourquoi pensez-vous qu'il n'est pas évolutif ?

2 votes

J'ai mis en avant le commentaire ci-dessus. Il faut être très précis lorsqu'on dit de quelque chose qu'il n'est pas évolutif, qu'il n'est pas prêt pour la production ou qu'il n'est pas adapté aux grandes applications

5 votes

J'ai mentionné plus haut que la raison pour laquelle je considère cela comme problématique est que les définitions des classes d'objets doivent rester synchronisées à travers tous les déploiements, ce qui signifie que vous devez être très attentif à ce que vous déployez ou très attentif à la manière dont vous étendez vos classes. Les deux choses, bien que faisables, conduisent souvent à des erreurs. Est-ce possible ? bien sûr ! Est-ce que cela fonctionnera ? bien sûr ! Est-ce que les utilisateurs feront des erreurs ? très certainement !

13voto

Martin Klinke Points 4157

L'utilisation des services Web ou d'une approche plus "native" dépend également de l'environnement. Si vous devez passer par un proxy ou un pare-feu d'entreprise, les services Web ont plus de chances de fonctionner puisqu'ils s'appuient uniquement sur HTTP. RMI nécessite l'ouverture d'un autre port pour votre application, ce qui peut s'avérer difficile (mais pas techniquement) dans certains environnements...

Si vous savez que cette question ne pose pas de problème, vous devriez envisager d'utiliser RMI. L'architecture SOA ne dépend pas tant de la technologie que d'une bonne conception des services. Si vous disposez d'un conteneur EJB, vous pouvez appeler des sessions beans via RMI et les exposer en tant que services web, si vous en avez vraiment besoin, d'ailleurs.

Les performances dépendent des données que vous envisagez d'échanger. Si vous souhaitez envoyer des réseaux d'objets complexes d'une application à l'autre, vous serez probablement plus rapide avec RMI, car les données sont transférées dans un format binaire (généralement). Si vous avez de toute façon un contenu textuel/XML, les services web peuvent être équivalents ou même plus rapides, puisque vous n'avez alors pas besoin de convertir quoi que ce soit (pour la communication).

HTH,
Martin

0 votes

J'ai un problème, les services web (textuels) peuvent être encore plus rapides que rmi. Donc, que se passera-t-il si nous utilisons des sérialiseurs/désérialiseurs ex:-jacson pour les deux extrémités. La sérialisation et la désérialisation ont un coût. Quel serait le coût global de la transmission ? Le processus global sera-t-il plus rapide que rmi ? C'est un problème que je rencontre dans le développement d'applications. Je vous remercie de votre attention.

0 votes

Bien expliqué, oui RMI est utilisé lorsqu'il est nécessaire de partager des objets complexes. Pour des informations textuelles, utilisez le protocole HTTP, utilisez REST ou SOAP pour des données faciles à lire.

11voto

Une chose qui favorise WS par rapport à RMI est que WS fonctionne sur le port HTTP 80/443 qui n'est normalement pas bloqué par les pare-feu, qui peut fonctionner derrière NAT, etc. RMI a un protocole réseau sous-jacent beaucoup plus complexe qui vous oblige à ouvrir les ports RMI, et peut également ne pas fonctionner si le client est protégé par un NAT. Deuxièmement, avec RMI, vous limitez votre champ d'action à la communication JAVA-JAVA, alors qu'avec Webservies, il n'y a pas de limitation de ce type. Il est beaucoup plus facile de déboguer les webservices par câble, car les données sont de type SOAP/HTTP, qui peuvent être facilement capturées à l'aide d'outils de reniflage pour le débogage. Je ne connais pas de moyen facile de le faire avec RMI. En outre, RMI est vraiment très ancien et n'a pas reçu beaucoup d'attention ces dernières années. Il était important à l'époque où CORBA était important, et RMI et CORBA sont des technologies vraiment obsolètes. La meilleure option est celle des webservices de type REST.

0 votes

Comme vous l'avez dit, l'utilisation d'outils de reniflage peut également être utilisée par d'autres pour trouver le transfert de données sensibles :)

6voto

Steve Moyer Points 4312

Mon expérience avec RMI et les services Web reflète vos suppositions ci-dessus. En général, les performances de RMI sont supérieures à celles des services web, si la communication doit porter sur des objets complexes. La spécification de l'interface JEE doit être explicitement spécifiée pour les services web.

Notez que les services Web sont interopérables alors que RMI ne l'est pas (en termes de technologies du client et du serveur). J'ai tendance à utiliser les services Web lorsque j'ai un ou plusieurs partenaires externes qui mettent en œuvre l'interface, mais RMI si je contrôle les deux extrémités de la connexion.

2voto

sammyo Points 245

RMI peut être la meilleure solution si vous avez besoin de maintenir un état complexe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X