Découverte de RMI et des RPC

Remote Method Invocation s'incrit d'une manière générale dans les protocoles d'invocation de procédures à distance ou RPC pour l'accronyme anglais. L'idée principale est de mettre en place une infrastructure logicielle permettant de séparer une application monolithique effectuant sur plusieurs machine exécutant certaines parties de l'application.

L'objectif du TD est de comprendre les concepts majeurs associés aux RPC. Le principe vient initialement des langages imperatifs à fonction, mais se transpose parfaitement aux langages objets.

Transport de méthodes sur le réseau

Dans ce premier scénario, vous êtes une entreprise qui commercialise un logiciel de calcul numérique qui s'installe integralement sur le poste de travail. Ce logiciel utilise des classes qui implantent les fonctions mathématiques principales de votre logiciel. Le code simplifié de votre produit est le suivant.

package app;
public class Client {
  public static void main(String [] arg) {
    utils.Mathematicy mat = new utils.Mathematicy();
    System.out.println("-->" + mat.calcFactorielle(3);
  }
}

package utils;
public class Mathematicy {
  public int calcFactorielle (int i) {
    int val = 1;
    for (int t=i; t > 0; t--) {
      val = val * t;
    }
    return val;
  }
}

Votre entreprise décide d'embaucher un premier stagiaire spécialiste du réseau afin d'en faire une application distribuée entre deux noeuds.

Q1 : selon quels critères pouvez-vous distribuer cette application ?

Vous décidez de demander à votre stagiaire de réaliser un démonstrateur permettant, sans modifier le code initial pour éviter les bugs, de distribuer l'application sur deux neouds.

Q2 : donnez le code de distribution

Q3 : pourquoi réaliser ce code de distribution en Java est a priori plus simple que de le réaliser en C ?

RPC

Vous décider de continuer votre système distribué et décidez de l'étendre en le rendant adapatable à tous les cas d'usages.

Votre application vient d'évoluer, elle est toujours en cours de dévéloppement, mais vous décidez de continuer vos investigations. Voici le nouveau code d'évolution de votre application.

package app;
public class Client {
  public static void main(String [] arg) {
    utils.Mathematicy mat = new utils.Mathematicy();
    System.out.println("-->" + mat.calcFactorielle(3);
    System.out.println("--->" + mat.calcFibonnacci(new utils.MesEntiers(10));
  }
}

package utils;
public class Mathematicy {
  public int calcFactorielle (int i) {
    int val = 1;
    for (int t=i; t > 0; t--) {
      val = val * t;
    }
    return val;
  }

  public int calcFibonnaci(MesEntiers me) {
    // Cette fonction est en cours de développement
    return -1;
  }
}

package utils; 
public class MesEntiers {
  private int _entier;

  MesEntiers(int x) {
    this._entier = x;
  }
}

En quoi cette nouvelle implantation influence t'elle votre ancien code ? Que pensez-vous de la notion de couplage fort ?

L'année suivante votre entreprise décide d'embaucher un second stagiaire ayant un profil plus informatique, afin de découpler votre système. Vous décider que votre code lié au réseau ne doit être écrit qu'une seule fois pour toute.

Connaissant les éléments qui influencent votre code, proposez une approche générale permettant de rendre vos codes indépendant

Vous vous lancez dans votre solution technique.

Décrivez l'outil que vous développez.

Debreifing

  • Ajouter le principe de fonctionnement d'un annuaire
  • Décrire les systèmes d'invocation distante rpc / dcom / rmi / rest...
  • Comprendre les limites des approches

comments powered by Disqus