Ogury est la plateforme de data mobile qui permet d’accéder aux données comportementales des profils de plus de 400 millions de mobinautes répartis dans plus de 120 pays.
Une plateforme micro-services c’est cool et c’est à la mode … mais il y a aussi le revers de la médaille ! L’augmentation du traffic inter-services peut dégrader vos temps de réponses car les connexions HTTP sont lentes.
Cependant des solutions existent pour optimiser le trafic réseau, durant cette session, David et Carles vous parleront de la solution qu’ils ont expérimentée : gRPC.
David Caramelo, Développeur Craftsman passionné depuis 12 ans, actuellement Tech Lead full stack chez Ogury. David s'est forgé son expérience essentiellement dans des startups parisiennes comme Viadeo ou Ogury et dans des cabinets conseil IT comme Xebia.
Carles Sistaré, Architecte-Développeur dans les clouds, actuellement Tech Lead de la team Delivery et co-fondateur d’Ogury. Carles a évolué dans le monde de la AdTech en passant par Ad4Screen et en tant qu’amateur de l’open-source en tant que commiteur Node-Kafka et créateur du module grpc-promise.
Ogury est la plateforme de data mobile qui permet d’accéder aux données comportementales des profils de plus de 400 millions de mobinautes répartis dans plus de 120 pays.
Une plateforme micro-services c’est cool et c’est à la mode … mais il y a aussi le revers de la médaille ! L’augmentation du traffic inter-services peut dégrader vos temps de réponses car les connexions HTTP sont lentes.
Cependant des solutions existent pour optimiser le trafic réseau, durant cette session, David et Carles vous parleront de la solution qu’ils ont expérimentée : gRPC.
David Caramelo, Développeur Craftsman passionné depuis 12 ans, actuellement Tech Lead full stack chez Ogury. David s'est forgé son expérience essentiellement dans des startups parisiennes comme Viadeo ou Ogury et dans des cabinets conseil IT comme Xebia.
Carles Sistaré, Architecte-Développeur dans les clouds, actuellement Tech Lead de la team Delivery et co-fondateur d’Ogury. Carles a évolué dans le monde de la AdTech en passant par Ad4Screen et en tant qu’amateur de l’open-source en tant que commiteur Node-Kafka et créateur du module grpc-promise.
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearchMourad DACHRAOUI
Retour d'experience sur l'utilisation de spray dans le cadre de Mogobiz. Explication de la technique du "Magnet Pattern" et présentation des bénéfices de l'utilisation de Rx.
http://j.mp/psug43Xebia
Developpement web dynamique_Base de donnees.pdfrachidimstapha
MySQL has stand-alone clients that allow users to interact directly with a MySQL database using SQL, but more often, MySQL is used with other programs to implement applications that need relational database capability. MySQL is a component of the LAMP web application software stack (and others)
https://uii.io/3rFjIWMA0d
https://uii.io/3rFjIWMA0d
Objectif général : Prendre en main l’un des frameworks PHP les plus utilisés
Objectifs spécifiques
Faire correspondre une URL donnée à un traitement précis grâce au routage
Regrouper des traitements connexes grâce aux contrôleurs
Récupérer les données d’une requête http grâce à Request
Retourner des contenus aux formats texte, HTML, JSON, etc. grâce à Response
Intégrer des données dans des templates grâce à Blade
Interagir avec l’utilisateur grâce aux formulaires
Créer, mettre à jour et suivre les évolutions d’un schéma de base de données grâce aux migrations
Faciliter la communication avec une base de données grâce à Eloquent
Alphorm.com Support Formation Red Hat Administration Système III RHCSE-(Rh254)Alphorm
Formation complète ici :
http://www.alphorm.com/tutoriel/formation-en-ligne-red-hat-entreprise-linux-rhce-rh254
Après la formation Red Hat RH254 vous pourrez prétendre a se certifier RHCE
Durant cette formation Red Hat RH254 vous allez avoir les clés pour apprendre, comprendre et administrer un système RHEL 7 d’une manière professionnelle et dans des grandes architectures.
Ludovic vous apprendra, durant cette formation Red Hat RH254, comment :
utilser Systemd pour monter des systèmes de fichiers et gérer les ressources mémoire, cpu, etc …
Savoir-faire un basculement de ses serveurs sur IPV6
Mettre des services de haute disponibilité sur les liens réseaux
Mettre en œuvre des serveurs Virtual host et https sur votre serveur Web et sécurisé des espaces privées
Gérer les serveurs de noms dans votre entreprise avec Bind et unbound
Mettre en place une passerelle de courrier avec postfix
Améliorer la sécurité et configurer un Firewall pour votre réseau
Gérer des systèmes de gestion de base de données relationnelle avec MariaDB
Automatiser les taches et améliorer sa productivité avec les scripts Shell
Déployer rapidement des conteneurs virtuels avec la folie Docker et les Linux containers LXC
Comme à son habitude, Ludovic partagera avec vous toutes les astuces et bonnes pratiques avec plein de travaux pratiques.
Les Servlets
Cycle de vie d'une Servlet
Traitement des données de formulaires
Gestion de l'état avec cookies et sessions
Introduction aux JSP
Les balises JSP personnalisées
Règles de conception
Ce Support explique quelques concepts de base de NodeJS et montre comment mettre en oeuvre la technologie NodeJS pour développer la partie Backend d'une application.
Les vidéos des démonstrations sont publiées sur les adresse suivantes :
- https://www.youtube.com/watch?v=-X_C1tS5-9Y
- https://www.youtube.com/watch?v=rE-xRH28m0s
- https://www.youtube.com/watch?v=tnxjkTvWoKA
Cette série explique les éléments suivants :
- Architecture Web
- Modèles Multi-Threads avec les entrées sorties bloquantes
- Modèles Single Thread avec les entrées sortie non bloquantes
-Technologie Node JS
- Comment créer une simple application Node JS avec java Script
- Architecture du Framwork Express
- Comment créer une application NodeJS avec Type Script
- Comment écrire des tests unitaires avec Jest
- Quelques concepts sur MongoDb
- Comment Créer une API Rest avec NodeJS, Express et MongoDb
- Comment tester l'API Rest
- Comment Créer la partie FrontEnd avec Angular.
Même si la qualité audio n'est pas bonne, ses vidéos peuvent aider ceux qui débutent dans NodeJS en attendant d'autres vidéos avec plus qualité audio et de contenu.
Bonne lecture
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...Normandy JUG
Un petit tour des pratiques et outils de capacity planning. Graphite, JMX Trans, JMeter (sans frein à main), et leurs amis Amazon EC2, jenkins, VisualVM … Et en bonus la basic-web-perf application pour tester votre infrastructure à blanc !
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearchMourad DACHRAOUI
Retour d'experience sur l'utilisation de spray dans le cadre de Mogobiz. Explication de la technique du "Magnet Pattern" et présentation des bénéfices de l'utilisation de Rx.
http://j.mp/psug43Xebia
Developpement web dynamique_Base de donnees.pdfrachidimstapha
MySQL has stand-alone clients that allow users to interact directly with a MySQL database using SQL, but more often, MySQL is used with other programs to implement applications that need relational database capability. MySQL is a component of the LAMP web application software stack (and others)
https://uii.io/3rFjIWMA0d
https://uii.io/3rFjIWMA0d
Objectif général : Prendre en main l’un des frameworks PHP les plus utilisés
Objectifs spécifiques
Faire correspondre une URL donnée à un traitement précis grâce au routage
Regrouper des traitements connexes grâce aux contrôleurs
Récupérer les données d’une requête http grâce à Request
Retourner des contenus aux formats texte, HTML, JSON, etc. grâce à Response
Intégrer des données dans des templates grâce à Blade
Interagir avec l’utilisateur grâce aux formulaires
Créer, mettre à jour et suivre les évolutions d’un schéma de base de données grâce aux migrations
Faciliter la communication avec une base de données grâce à Eloquent
Alphorm.com Support Formation Red Hat Administration Système III RHCSE-(Rh254)Alphorm
Formation complète ici :
http://www.alphorm.com/tutoriel/formation-en-ligne-red-hat-entreprise-linux-rhce-rh254
Après la formation Red Hat RH254 vous pourrez prétendre a se certifier RHCE
Durant cette formation Red Hat RH254 vous allez avoir les clés pour apprendre, comprendre et administrer un système RHEL 7 d’une manière professionnelle et dans des grandes architectures.
Ludovic vous apprendra, durant cette formation Red Hat RH254, comment :
utilser Systemd pour monter des systèmes de fichiers et gérer les ressources mémoire, cpu, etc …
Savoir-faire un basculement de ses serveurs sur IPV6
Mettre des services de haute disponibilité sur les liens réseaux
Mettre en œuvre des serveurs Virtual host et https sur votre serveur Web et sécurisé des espaces privées
Gérer les serveurs de noms dans votre entreprise avec Bind et unbound
Mettre en place une passerelle de courrier avec postfix
Améliorer la sécurité et configurer un Firewall pour votre réseau
Gérer des systèmes de gestion de base de données relationnelle avec MariaDB
Automatiser les taches et améliorer sa productivité avec les scripts Shell
Déployer rapidement des conteneurs virtuels avec la folie Docker et les Linux containers LXC
Comme à son habitude, Ludovic partagera avec vous toutes les astuces et bonnes pratiques avec plein de travaux pratiques.
Les Servlets
Cycle de vie d'une Servlet
Traitement des données de formulaires
Gestion de l'état avec cookies et sessions
Introduction aux JSP
Les balises JSP personnalisées
Règles de conception
Ce Support explique quelques concepts de base de NodeJS et montre comment mettre en oeuvre la technologie NodeJS pour développer la partie Backend d'une application.
Les vidéos des démonstrations sont publiées sur les adresse suivantes :
- https://www.youtube.com/watch?v=-X_C1tS5-9Y
- https://www.youtube.com/watch?v=rE-xRH28m0s
- https://www.youtube.com/watch?v=tnxjkTvWoKA
Cette série explique les éléments suivants :
- Architecture Web
- Modèles Multi-Threads avec les entrées sorties bloquantes
- Modèles Single Thread avec les entrées sortie non bloquantes
-Technologie Node JS
- Comment créer une simple application Node JS avec java Script
- Architecture du Framwork Express
- Comment créer une application NodeJS avec Type Script
- Comment écrire des tests unitaires avec Jest
- Quelques concepts sur MongoDb
- Comment Créer une API Rest avec NodeJS, Express et MongoDb
- Comment tester l'API Rest
- Comment Créer la partie FrontEnd avec Angular.
Même si la qualité audio n'est pas bonne, ses vidéos peuvent aider ceux qui débutent dans NodeJS en attendant d'autres vidéos avec plus qualité audio et de contenu.
Bonne lecture
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...Normandy JUG
Un petit tour des pratiques et outils de capacity planning. Graphite, JMX Trans, JMeter (sans frein à main), et leurs amis Amazon EC2, jenkins, VisualVM … Et en bonus la basic-web-perf application pour tester votre infrastructure à blanc !
2. 50,
+%RXU]RXIL''RQVH]
2
Sommaire
■ Rappel et Limites des RPC (Remote Procedure Call)
■ Principe des RMI
■ Etapes de développement et d ’exécution
■ Paramètres des méthodes
■ Objet Activable
■ Personnalisation de la couche de transport
■ Ramasse-Miette distribuée
■ Autour des RMI
• CORBA, IIOP, EJB
3. 50,
+%RXU]RXIL''RQVH]
3
Rappel des RPC
■ RPC (Remote Procedure Call)
• modèle client/serveur
• appel de procédures à distances entre un client et un serveur
• le client appelle une procédure
• le serveur exécute la procédure et renvoie le résultat
• Outil USFJHQ
• génère la souche d ’invocation et le squelette du serveur
(en C, C++, Fortran, …)
• la souche et le squelette ouvre un socket BSD et encode/décode les paramètres
• Couche de présentation ;'5 (eXchange Data Representation)
format pivot de représentation des données de types primitifs et structurés
(tableau de longueur variable, structures) quelque soit
ªl ’architecture (Little Endian/Big Endian, IEEE, …)
ªle langage (ordre ligne/colonne dans les tableaux C et les tableaux Fortran)
ªou le système (ASCII, IBM ’ECDCII, ...)
4. 50,
+%RXU]RXIL''RQVH]
4
Limites des RPC
■ Limitations
• paramêtres et valeur de retour sont des types primitifs
• programmation procédurale
• dépendance à la localisation du serveur
• pas d ’ objet
• pas de « référence distante »
■ Evolutions
• CORBA
• Multilangage, multi-plateforme (architecture+OS), MuliVendeurs
• Java RMI
• mono-langage : Java, multiplateforme : de JVM à JVM
• DCOM / Object RPC / .NET Remoting
• multi-langages, plateforme Win32 principalement, il existe des implémentations (non
MicroSoft) pour Unix, Propriétaire
• .NET Remoting
• multi-langages (CLR), plateforme Win32 principalement
• Normalisé à l’ ECMA et à l’ ISO
• SOAP (Simple Access Object Protocol)
• multi-langages, multi-plateforme
• Réponse et requête en XML (DTD SOAP), Transport sur HTTP, IETF
5. 50,
+%RXU]RXIL''RQVH]
5
Principes des RMI
■ RPC à la Java
• invoquer de façon simple des méthodes sur des objets distribués.
■ Outils
• pour la génération des stub/skeleton, l ’ enregistrement par le nom, l ’activation
• Tous les détails ( connexion, transfert de données ..)
sont transparents pour le développeur grâce au stub/skeleton généré
■ Mono-langage et Multiplateforme.
• Java : de JVM à JVM OHVGRQQpHVHWREMHWVRQWODPrPHUHSUpVHQWDWLRQTTVOD-90
■ Orienté Objet
• Les RMIs utilisent le mécanisme standard de sérialisation de JAVA
pour l ’envoi d ’objets.
■ Dynamique
• Les classes des Stubs et des paramêtres
peuvent être chargées dynamiquement via HTTP (http://) ou NFS (file:/)
■ Sécurité
• un SecurityManager vérifie si certaines opérations sont autorisés par le serveur
7. 50,
+%RXU]RXIL''RQVH]
7
Structure des couches RMI (ii)
■ Souche RX6WXE (sur le client)
• représentant local de l’ objet distant qui implémente les méthodes
“exportées” de l ’ objet distant
• “marshalise” les arguments de la méthode distante et les envoie en un flot
de données au serveur
• “démarshalise” la valeur ou l ’objet retournés par la méthode distante
• la classe xx_Stub peut être chargée dynamiquement par le client (Applet)
■ Squelette RX6NHOHWRQ (sur le serveur)
• “démarshalise” les paramètres des méthodes
• fait un appel à la méthode de l’ objet local au serveur
• “marshalise” la valeur ou l ’objet renvoyé par la méthode
8. 50,
+%RXU]RXIL''RQVH]
8
Structure des couches RMI (ii)
■ Couche des références distantes
• traduit la référence locale au stub en une référence à l’ objet
distant
• elle est servie par un processus tier : rmiregistry
■ Couche de transport
• écoute les appels entrants
• établit et gère les connexions avec les sites distants
• java.rmi.UnicastRemoteObject utilise les classes Socket et
SocketServer (TCP)
• cependant d ’ autres classes peuvent être utilisées par la
couche transport (Compression sur TCP, SSL sur TCP, UDP)
13. 50,
+%RXU]RXIL''RQVH]
13
Création et manipulation d'
objets
distants
■ 5 Packages
• java.rmi : pour accéder à des objets distants
• java.rmi.server : pour créer des objets distants
• java.rmi.registry : lié à la localisation et au nommage d’objets distants
• java.rmi.dgc : ramasse-miettes pour les objets distants
• java.rmi.activation support pour l ’ activation d ’objets distants.
■ Etapes du développement
1- Spécifier et écrire l'
interface de l'
objet distant.
2- Ecrire l'
implémentation de cette interface.
3- Générer les Stub/Skeleton correspondants. (outil rmic)
■ Etapes de l ’exécution
4- Ecrire le serveur qui instancie l'
objet implémentant l'
interface,
exporte son Stub puis attend les requêtes via le Skeleton.
5- Ecrire le client qui réclame l ’ objet distant, importe le Stub
et invoque une méthode de l'
objet distant via le Stub.
14. 50,
+%RXU]RXIL''RQVH]
14
1- Spécifier l ’interface d'
un objet distant
■ Format
• l ’interface étend MDYDUPL5HPRWH
• les méthodes doivent pouvoir lever MDYDUPL5HPRWH([FHSWLRQ
■ Exemple
SDFNDJH H[DPSOHVKHOOR
SXEOLFLQWHUIDFH+HOOR H[WHQGV MDYDUPL5HPRWH^
SXEOLFVWDWLF ILQDO LQW (1 (QJOLVK
SXEOLF VWDWLF ILQDO LQW )5 )UHQFK
SXEOLF VWDWLF ILQDO LQW (6 6SDQLVK
6WULQJ VD+HOOR WKURZV MDYDUPL5HPRWH([FHSWLRQ
6WULQJ VD+HOOR 6WULQJ QDPH WKURZVMDYDUPL5HPRWH([FHSWLRQ
6WULQJ VD+HOOR 6WULQJ QDPH LQWODQJ WKURZVMDYDUPL5HPRWH([FHSWLRQ
`
15. 50,
+%RXU]RXIL''RQVH]
15
Implémentation de l ’objet distant
■ La classe HelloImpl
• doit implémenter l ’interface distante Hello
• et étendre une des sous-classes de java.rmi.server.RemoteServer
comme java.rmi.server.UnicastRemoteObject
■ java.rmi.server.UnicastRemoteObject
• sous classe le plus souvent utilisée
• offre toutes les fonctionnalités des classes distantes
• appelle la classe squelette pour la (dé)marshalisation
• utilise TCP/IP pour la couche transport
17. 50,
+%RXU]RXIL''RQVH]
17
La génération des Stub et Skeleton
■ L ’outil rmic génère
• la classe souche examples.hello.HelloImpl_Stub
• la classe squelette examples.hello.HelloImpl_Skel
à partir de l ’ implémentation examples.hello.HelloImpl
■ Exemple VRXV:LQ
VHW/$663$7+ /$663$7+PFODVVHV
MDYDF G?PFODVVHV +HOORMDYD
MDYDF G?PFODVVHV+HOOR,PSOMDYD
UPLF NHHSJHQHUDWHG GPFODVVHVH[DPSOHVKHOOR+HOOR,PSO
5HPDUTXH NHHSJHQHUDWHG à conserve les sources des Stub et Skeleton
18. 50,
+%RXU]RXIL''RQVH]
18
Implémentation
du serveur de l ’objet distant
• Crée un ou plusieurs objets distants (une ou plusieurs classes)
• Naming.bind() : les enregistre auprès du serveur de liaison
UPLUHJLVWU
■ Exemple
SDFNDJH H[DPSOHVKHOOR
SXEOLFFODVV +HOOR6HUYHU ^
SXEOLF VWDWLFYRLG PDLQ 6WULQJ DUJV@ ^DUJXPHQWO ¶K{WHSRUWGXUPLUHJLVWU
UpHHW,QVWDOOHXQ6HFXULW0DQDJHU
LI 6VWHPJHW6HFXULW0DQDJHU QXOO ^
6VWHPVHW6HFXULW0DQDJHU QHZMDYDUPL50,6HFXULW0DQDJHU `
WU ^
LQVWDQFLHO ¶REMHW
+HOOR,PSOREM QHZ +HOOR,PSO +HOOR(1
(QUHJLVWUHO ¶REMHWVRXVOHQRP+HOOR2EMHFWDXSUqVGHUPLUHJLVWU
MDYDUPL1DPLQJELQG DUJV@+HOOR2EMHFWREM
`FDWFK ([FHSWLRQH ^HSULQW6WDFN7UDFH `
``
• MDYDF G?PFODVVHV+HOOR6HUYHUMDYD
19. 50,
+%RXU]RXIL''RQVH]
19
Implémentation
du serveur de l ’objet distant
■ Remarques
• L ’ objet distant servi peut être d ’ une sous classe de HelloImpl
SXEOLFFODVV +HOOR(6,PSOH[WHQGV +HOOR,PSO ^
SXEOLF+HOOR(6,PSO WKURZV MDYDUPL5HPRWH([FHSWLRQ^VXSHU +HOOR(6 `
`
HWGDQV+HOOR6HUYHU
MDYDUPL1DPLQJUHELQG DUJV@+HOOR2EMHFWQHZ+HOOR(6,PSO
• Le serveur peut crée et enregistré
plusieurs objets appartenant à une ou plusieurs classes
• l ’enregistrement peut se faire auprès des plusieurs rmiregistry
20. 50,
+%RXU]RXIL''RQVH]
20
Implémentation
du serveur de l ’objet distant
■ Remarques
• il faut prévoir une procédure d ’arrêt (shutdown) du serveur
• Demande d ’ arrêt
Unix : kill SIGQUIT 12345
Win32 : ??
• Arrêt des objets UnicastRemoteObject
publicstaticvoidNaming.unbind(Stringname)
publicstaticbooleanUnicastRemoteObject.unexportObject(Remote, booleanforce)
• Dans les exemples et tutoriels, le serveur est constitué par la
méthode main(Stringargs[]) de l ’ implémentation HelloImpl
23. 50,
+%RXU]RXIL''RQVH]
23
L ’exécution
Coté Serveur
■ Le serveur de liaison rmiregistry
• expose un objet distant serveur de liaisons (de noms)
• le port de liaison par défaut est le port TCP 1099
KRVWUHJ! UPLUHJLVWU
A
KRVWUHJ! UPLUHJLVWU
A
KRVWUHJ! UPLUHJLVWU
• cet objet fait la correspondance entre nom et instance de Stub
enregistré par le(s) serveur(s) avec Naming.bind()
24. 50,
+%RXU]RXIL''RQVH]
24
L ’exécution Coté Serveur
L ’accès au serveur de liaison
■ La classe Naming
• encaspule le dialogue avec plusieurs objets serveur de liaison
• URL de liaison
rmi://hostreg:2001/Hello/World
rmi://:2001/Hello/World
//:2001/Hello/World
/Hello/World
• Méthodes Statiques
• ELQG 6WULQJ XUO 5HPRWH U UHELQG 6WULQJ XUO5HPRWH U XQELQG 6WULQJ XUO
enregistre/désenregistre un objet auprès du serveur
• 5HPRWHORRNXS 6WULQJXUO
retourne un stub
• 6WULQJ@ OLVW
liste les noms enregistrés
25. 50,
+%RXU]RXIL''RQVH]
25
L ’exécution Coté Serveur
L implantation du serveur de liaison
■ Les objets serveur de liaison
• réalise la correspondance nom avec stub
• Interface d ’ un objet serveur de liaison
• VXQUPLUHJLVWU5HJLVWU H[WHQGV MDYDUPL5HPRWH
• Implémentation par défaut de l ’ objet serveur de liaison
• VXQUPLUHJLVWU5HJLVWU,PSO
• Méthodes non statiques
• ELQG UHELQG XQELQG ORRNXS OLVW
■ La classe LocateRegistry
• localise ou active un objet serveur de liaison
• Méthodes Statiques
• 5HJLVWUFUHDWH5HJLVWU LQW SRUW
crée un objet serveur de liaison sur le port spécifié
• 5HJLVWUJHW5HJLVWU LQW SRUW
récupère l ’ objet serveur de liaison qui a été crée
29. 50,
+%RXU]RXIL''RQVH]
30
Le passage de paramètres
■ Les paramêtres des méthodes invoquées sur un objet
distant sont soit:
• une valeur de type Primitif
• La valeur est passée
• un objet d ’ une classe qui implemente l ’ interface Serialisable
(ou l ’ interface Externalizable)
• l ’ objet est sérialisé et envoyé à l ’ objet distant : le paramétre est alors
déserialisé pour l ’ objet d istant l ’ utilse
• un objet d ’ une classe qui implémente l ’ interface Remote
• c ’ est l ’ objet Stub qui est sérialisé et envoyé à l ’objet distant : quand l ’ objet
distant invoque un méthode sur le paramêtre, l ’ invocation est distante.
■ Une exception est levée
si un paramêtre ne rentre pas dans ces trois cas.
30. 50,
+%RXU]RXIL''RQVH]
31
Le passage de paramètres
■ Un exemple plus complexe
packageexamples.order;
publicclassOrderLineimplementsjava.io.Serializable{ // uneclassesérialisable
publicStringproductname;
publicint quantity;
}
packageexamples.order;
import java.util.Vector; // uneclassesérialisable
publicinterfaceOrder extendsjava.rmi.Remote{ // l ’interfacedistante
publicfloat price(Stringproductname, int quantity) throwsjava.rmi.RemoteException;
publicfloat price(Vector orderlines) throwsjava.rmi.RemoteException;
publicfloat price(OrderLine[] orderlines) throwsjava.rmi.RemoteException;
publicVector priceInDetail(Vector orderlines) throwsjava.rmi.RemoteException;
publicVector priceInDetail(OrderLine[] orderlines) throwsjava.rmi.RemoteException;
}
31. 50,
+%RXU]RXIL''RQVH]
33
Passage d ’un paramètre de classe
inconnue du serveur
• La sous classe d’un paramètre est inconnue du serveur
• le serveur charge la classe du sous-type inconnu
à partir du java.rmi.server.codebase du client à défaut du CLASSPATH
■ Voir : jdk1.2.2/docs/guide/rmi/codebase.htm
32. 50,
+%RXU]RXIL''RQVH]
34
Passage d ’un paramètre de classe
inconnue du serveur (i)
KRVWFOL
KRVWFOL
OLHQW+HOOROLHQW
OLHQW+HOOROLHQW
KRVWZZZ
KRVWZZZ
KWWSG
KWWSG
KRVWVHU
KRVWVHU
6HUYHXU+HOOR6HUYHU
6HUYHXU+HOOR6HUYHU
3DUDPFODVV
,PSO
OHFOLHQWLQYRTXH
XQHPpWKRGHDYHFXQSDUDPrWUH
LQFRQQXGXVHUYHXU
OH6WXE VpULDOLVHO·LQVWDQFHGX
SDUDPrWUH HWO·HQYRLHDXVHUYHXU
OHVHUYHXUFKDUJHODFODVVH
G ·DSUqVMDYDUPLVHUYHUFRGHEDVH
GXFOLHQW
DSSHOPpWKRGH
6RFNHW
,QVWDQFH
34. 50,
+%RXU]RXIL''RQVH]
36
Passage d ’un paramêtre de classe
inconnue du serveur - Exemple
packageexamples.bank;
O ¶LQWHUIDFHGXHU SDUDPrWUH GHODPpWKRGHFUHGLW
publicinterfaceAccount extendsSerializable{ float getBalance(); voidsetBalance(float amount); }
O ¶LQWHUIDFHGHO ¶REMHWGLVWDQW
publicinterfaceBankimplementsRemote{ voidcredit(Account acc, float amount); }
XQHVRXVFODVVHGH$FFRXQWLQFRQQXHGXVHUYHXU
publicclassCheckingAccount implementsexamples.bank.Account {
privateStringname; privatefloat balance;
publicCheckingAccount(Stringname, float initamount) {
this.name=name; this.balance=initamount; }
publicfloat getBalance(returnbalance;)
publicvoidsetBalance(float amount) { balance=amount; }
}
XQFOLHQW
examples.bank.Bankmybank=(Bank) java.rmi.Naming.lookup(//hostreg/MyBank);
examples.bank.Account accjohn=newCheckingAccount(john,1000.0);
mybank.credit(accjohn,2000.0);
35. 50,
+%RXU]RXIL''RQVH]
39
Passage d ’un Stub en paramêtre
■ Méthode 1
• Le Stub est celui d ’un objet distant déjà servi
■ Méthode 2 : Objet Distant Temporaire
• But:
• L ’objet distant est local au client et n ’ est utilisé que pour la durée
d ’ une ou plusieurs invocations distantes depuis le client
• Solution
• exporter l ’objet avec la méthode UnicastRemoteObject.exportObjet()
• l ’objet doit implémenter l ’ interface Unreferenced pour être ramassé
par le GC
40. 50,
+%RXU]RXIL''RQVH]
46
L ’activation d ’objets distants
■ Rappel (JDK1.1)
• l ’objet distant est actif au démarrage du serveur RMI
■ Motivation
• principe du démon inetd d ’ Unix
• Le démon rmid démarre une JVM qui sert l ’ objet distant seulement au
moment de l ’ invocation d ’ une méthode (à la demande) ou au reboot.
■ JDK1.2 introduit
• un nouveau package java.rmi.activation
• un objet activable doit dériver de la classe Activatable
• un démon RMI rmid
• qui active les objets à la demande ou au reboot de la machine
■ Info : jdk1.2.2docsguidermiactivation.html
■ Remarque : l’activition est très utilisée par JINI !
41. 50,
+%RXU]RXIL''RQVH]
47
Créer une implémentation activable
• La classe doit étendre MDYDUPLDFWLYDWLRQ$FWLYDEOH
et implémenter l ’interface distante
• La classe doit déclarer un constructeur avec 2 arguments
java.rmi.activation.ActivationID, java.rmi.MarshalledObject
SXEOLFFODVV +HOOR$FWLYDWDEOH,PSO
H[WHQGV MDYDUPLDFWLYDWLRQ$FWLYDWDEOH LPSOHPHQWV +HOOR ^
SULYDWHLQWGHIDXOWODQJ
SXEOLF $FWLYDWDEOH,PSOHPHQWDWLRQ $FWLYDWLRQ,' LG 0DUVKDOOHG2EMHFW GDWD
WKURZV MDYDUPL5HPRWH([FHSWLRQ ^
VXSHU LG
WKLVGHIDXOWODQJ ,QWHJHU GDWDJHW LQW9DOXH
`
LPSOpPHQWDWLRQGHVPpWKRGHV
SXEOLF6WULQJ VD+HOOR WKURZVMDYDUPL5HPRWH([FHSWLRQ ^«`
`
42. 50,
+%RXU]RXIL''RQVH]
48
Créer le programme d ’enregistrement
(Setup)
■ Rôle
• passer l ’ information nécessaire à l ’activation de l ’ objet
activable au démon rmid
puis enregistrer l ’ objet auprès de rmiregistry
■ Descripteur
• ActivationDesc: description des informations nécessaires à rmid
■ Groupes d’objets activables
• rmid active une JVM par groupe
• Les objets du même groupe partagent la même JVM
• ActivationGroup: représente un groupe d ’objets activables
• ActivationGroupDesc: description d ’un groupe
• ActivationGroupID: identifiant d ’un groupe
44. 50,
+%RXU]RXIL''RQVH]
50
Créer le programme d ’enregistrement
([HPSOH SDUWLH
// ledescripteur doit contenir lecodebasepour chercher lesclasses
Stringclasseslocation=http:/hostwww/hello/myclasses/;
// ledescripteur peut contenir unobjet sérialisablepour l ’initialisationdel ’objet ; datapeut
êtrenull
MarshalledObject data=newMarshalledObject (newInteger(Home.ES));
// créationd’undescripteur pour l ’objet activable
ActivationDescadesc=newActivationDesc
(agi, examples.hello.HelloActivatableImpl, classeslocation, data);
// enregistrement del ’objet auprèsdudémonrmid: récupérationd’unstub
Helloobj =(Hello)Activatable.register(adesc);
// enregistrement dustubauprèsdurmiregistry
Naming.rebind(//hostreg/HelloActiv, obj);
System.exit(0);
}
}
45. 50,
+%RXU]RXIL''RQVH]
51
Personnaliser la couche Transport des RMI
■ Rappel
• Par défaut, TCP est utilisé par la couche de transport RMISocketFactory
(classes java.net.Socket et java.net.SocketServer)
2 cependant dans les cas de Firewall/proxies, elle invoque les méthodes en
utilisant la méthode POST de HTTP.
• La propriété java.rmi.server.disableHttp=true désactive le tunneling HTTP
■ Motivation
• utiliser d ’ autres classes (que Socket et SocketServer)
basées sur
ª TCP pour de la compression, du chiffrage, …
ªRemarque : RMI over SSL utilise cette technique (voir l ’ exemple)
ª ou non (UDP)
■ ,QIRMGN?GRFV?JXLGH?UPL?UPLVRFNHWIDFWRUGRFKWPO
46. 50,
+%RXU]RXIL''RQVH]
52
Personnaliser la couche Transport des RMI
■ Etape 1
Écrire 2 sous classes de
MDYDUPL50,OLHQW6RFNHW)DFWRU
MDYDUPL50,6HUYHU6RFNHW)DFWRU
qui utilisent 2 autres classes de transport que
MDYDQHW6RFNHW
MDYDQHW6RFNHW6HUYHU
(voir cours Socket)
48. 50,
+%RXU]RXIL''RQVH]
54
Personnaliser la couche Transport des
RMI
■ Etape 2
Spécifier les factories dans le constructeur de l ’ objet distant qui
hérite de la classe 8QLFDVW5HPRWH2EMHFW
SURWHFWHG8QLFDVW5HPRWH2EMHFW LQW SRUW
50,OLHQW6RFNHW)DFWRU FVI
50,6HUYHU6RFNHW)DFWRU VVI
■ Exemple:
SXEOLF$FFRXQW,PSO WKURZV5HPRWH([FHSWLRQ ^
VXSHU QHZ RPSUHVVLRQOLHQW6RFNHW)DFWRU
QHZ RPSUHVVLRQ6HUYHU6RFNHW)DFWRU
«`
49. 50,
+%RXU]RXIL''RQVH]
55
RMI et SSL
■ Couche de transport custom
• SSLClientSocketFactory, SSLServerSocketFactory
• utilisent SSLSocket, SSLServerSocket (www.phaos.com)
■ voir
• jdk1.2.2docsguidermiSSLInfo.html
• jdk1.2.2docsguidermiPhaosExample.html
54. 50,
+%RXU]RXIL''RQVH]
60
Le glaneur de cellules distibué des RMI
java.rmi.dgc
■ Motivation pour un GC réparti
• ramasser les objets distants
qui ne sont plus référencés (i.e. plus de stub sur des clients)
■ Principe
• basé sur le comptage de références
• interagit avec les GCs locaux de toutes les JVM
• maintient des ZHDNVUHIHUHQFHV pour éviter le ramassage par le GC local
■ Remarque:
• en cas de partition du réseau, les objets peuvent être prématurément
ramassés
55. 50,
+%RXU]RXIL''RQVH]
61
Le glaneur de cellules distibué des RMI
java.rmi.dgc
■ Interface java.rmi.server.Unreferenced
packagejava.rmi.server;
publicinterfaceUnreferenced{ publicvoidunreferenced(); }
• Un objet distant peut être notifié quand il n ’ est plus référencé
• il doit implémenter l ’interface java.rmi.server.Unreferenced
• la méthode void unreferenced() est appelée par le DGC
quand il n ’ y a plus de référence.
56. 50,
+%RXU]RXIL''RQVH]
63
Détail d ’implantation
■ Coté serveur
• Une thread par appel d ’un client
• + la thread d ’ écoute des nouveaux appels sur le socket
• L ’ appel concurrent aux méthodes n ’ est pas synchronisé
• La synchronisation est à la charge du développeur
• Un couple hôte,port pour tous les objets par une JVM
8QGHURQVWUXFWLRQ
(QRQVWUXFWLRQ
59. 50,
+%RXU]RXIL''RQVH]
67
RMI et JINI
■ JINI
• mécanisme de courtage distribué (GLVFRYHUMRLQORRNXS)
• Courtage tolérant aux pannes (redondance)
• Recherche par rapport
à l’interface du service (nom+signature méthodes)
à des attributs qualifiants (Entry)
à des groupes
• Le client récupère la liste des objets distants (stub RMI)
potentiellement actifs ou activables offrant ce service
■ JERI : JINI Extensible Remote Invocation
• Rendre extensible les couches transfort et sérialisation des
RMI
• http://pandonia.canberra.edu.au/java/jini/tutorial/Jeri.html
60. 50,
+%RXU]RXIL''RQVH]
68
Ajout du J2SE 1.4
■ MDYDUPLVHUYHU50,ODVV/RDGHU6SL
• Délégation du chargement dynamique des classes
■ Support du POA (Portable Object Adapter)
pour rmic
• rmic -iiop -poa …
■ Génération d’IDL CORBA
• Pour l’ interopérabilité avec des serveurs CORBA via IIOP
• rmic -idl …
61. 50,
+%RXU]RXIL''RQVH]
69
Ajout du J2SE 1.5
■ Nouveautés dans le langage Java : les annotations
• Avant 1.5
publicinterfaceIHelloextendsRemote{
publicStringsayHello(Stringname) throwsRemoteException;
}
publicclassHelloimplementsIHello{
publicStringsayHello(Stringname) throwsRemoteException{
returnHello+name;
}}
• Avec les annotations du 1.5
publicclassHello{ // with1.5annotations
public#UHPRWH StringsayHello(Stringname) {
returnHello+name;
}}
■ Impact sur les outils de génération comme rmic
64. 50,
+%RXU]RXIL''RQVH]
73
Bibliographie
■ Spécification des RMI
• java.sun.com et jdk1.2.2/docs/guide/rmi/spec
■ Guide de la doc du JDK
• jdk1.2.2/docs/guide/rmi
■ Tutorial Java
• Trail sur les RMI et sur JINI (Objet activables)
• Online Training
• http://developer.java.sun.com/developer/onlineTraining/Programming/JDCBo
ok/rmi.html
■ Autres
• Jeremie : une implémentation OpenSource des RMI
• http://www.objectweb.org
65. 50,
+%RXU]RXIL''RQVH]
74
Bibliographie
■ Gilles Roussel, Étienne Duris, Java et Internet, Concepts et
programmation, Ed Vuibert, 01/2000, ISBN : 2-7117-8654-4
• le chapitre 11 détaille bien les RMI du JDK1.2 et notamment les objets activables
■ Elliotte Rusty Harold, Programmation Réseau avec Java, Ed O Reilly,
1997, ISBN 2-84177-034-6
• date un peu
■ Java Distributed Computing, Ed Oreilly existe en français
• date un peu
■ Robert Orfali, Dan Harkey, “ Client/Server Programming with Java and
Corba ”, 2ème édition, 1998, Ed Wiley, ISBN 0-471-24578-X.
• survol rapide
• comparaison intéressante avec les autres techniques (DCOM, CORBA, …)