Thématiques principales

Affichage des articles dont le libellé est WebServices. Afficher tous les articles
Affichage des articles dont le libellé est WebServices. Afficher tous les articles

samedi 26 janvier 2019

La haute disponibilité, les Webservices et JMS dans weblogic

Un article court aujourd'hui pour parler d'architecture JEE et de haute disponibilité dans le cadre JMS.

Nous avons déjà parlé du fonctionnement de JMS mais nous n'avons pas forcement traité la question de la haute disponibilité. Mais qu'est ce que la haute disponibilité?

La haute disponibilité [HD] est la capacité d'un système a fournir un service selon un taux de disponibilité pre-déterminer.

Cela semble un peu de la paraphrase mais cela se traduit par quelles solutions doivent ou peuvent être mises en oeuvre afin de garantir le rendu d'un service par un système?

Pour répondre a cette problématique, il existe une approche simple, la duplication. il suffit de fournir le service de manière répliquée de façon à palier à des éventuelles erreurs et crash.

Dans le cadre des systèmes a base de web-services, souvent la haute disponibilité est couplé a des systèmes de répartition de charge [weblogic-WS-LB]. Le flux http/https est adressé sur un load-balancer qui a pour charge de rediriger ces flux successivement sur les différents serveurs/containeurs d'un cluster construis pour rentre le service attendu.



lundi 14 janvier 2019

Server Web leger : Spark

Petit article pour parler rapidement d’un framework permettant de faire des webservice REST. Il s'appelle Spark [spark-rest] et non il n'a rien à voir avec le framework Big Data Spark [spark-bd] dont on parlera aussi prochainement.

Non ici on parle de Spark [spark-rest], un framework complet mais très simple à utiliser et très rapide à mettre en oeuvre. Il intègre un serveur web permettant l'écoute d’un port de connexion.

Le plus simple est de mettre en oeuvre. Commençons par importer l'artefact maven associé.


<dependency>
    <groupId>com.sparkjava</groupId>
    <artifactId>spark-core</artifactId>
    <version>2.8.0</version>
</dependency>

Ensuite tout passe par l’utilisation de la classe statique “spark.Spark”. Celle ci fourni les moyens d'écoute sur un port (reconfigurable)


Spark.port(port);

Ensuite il reste à définir le mapping entre url et path avec des méthodes à exécuter lors de l'utilisation de ces urls. Par exemple on peut faire à un appel d’une méthode sans paramètres:


Spark.get("/bundles", (request, response) -> this.bundleList(response));

Lorsqu'il y a des paramètres à manipuler alors on utilise la notation :variable, par exemple:


Spark.get("/bundle/:bundleName/:version", (request, response) -> this.bundleInfo(response,request.params(":bundleName"),request.params(":version")));

Il est bien sur possible d’utiliser d’autres primitives http que GET, comme POST, CREATE, DELETE. Je vous renvoie sur la doc pour ces points, n’en ayant pas eut besoin.

Ensuite il ne faut pas oublier que Spark est un serveur web et que du coup on peut aussi le configurer de façon à rendre accessible des ressources statiques. Pour cela on utilise la commande


Spark.staticFiles.externalLocation("/var/www/resources");

Voila j'avais parlé d'un article court, et avec ces quelques fonctions on peut déjà faire pas mal de choses. L'implémentation dont est extrait les exemples est dans le bundle OSGI tc-osgi-bundle-manager du depot Github [github]

Il est par contre à noter que ce code est voué à être déplacé dans un bundle dédié et qu’à terme il ne sera plus accessible à cette url. j’ajouterai une note à ce propos à ce moment là… ou pas… lol

En fait depuis il est dispo dans [gh-misc] et utilisé dans la composition docker associée [doc-spark]

Références

[spark-rest] http://sparkjava.com/
[spark-bd] http://spark.apache.org/
[github] https://github.com/collonville-tom/tc-equinox-loader/tree/master/tc-osgi-bundle-manager
[gh-misc] https://github.com/collonville-tom/tc-misc-osgi
[doc-spark] https://cloud.docker.com/u/collonvtom/repository/docker/collonvtom/tc-osgi-bundle-spark

dimanche 27 mai 2018

Robotframework

Nous avons vu dans un article précédent [18] les differents types de tests que l’on pouvait rencontrer dans le cadre du développement de système logiciel. Nous avions alors évoqué l’utilisation qui pouvait être fait de l’outil RobotFramework [1] sans être pour autant rentrer dans le détail de son utilisation.

Dans cet article je vous propose donc de nous y attarder afin de regarder son intérêt, ses cas d’utilisations classiques, son principe de fonctionnement, et ce que l’on peut en faire (et vous verrez on peut en faire beaucoup de choses)

Robot Framework est un orchestrateur de tests automatiques [1]. Son principe de base est assez classique car il comporte, comme beaucoup d’outils de test, de SuiteCases composés de TestCases. La différence majeur se trouve par contre dans une approche orientée données proposant la possibilité de définir des DSL (Domain Specific Language) pouvant être à la fois technique comme fonctionnel (on verra qu’il est préférable justement de séparer ces deux aspects)




mercredi 28 mars 2018

Architectures types

Lorsque nous nous sommes intéressé au pattern DAO [1], nous avons pu voir que les systèmes logiciels se conçoivent en définissant une architecture répondant au mieux aux besoins clients en usant de différentes stratégies en terme de solutions techniques [2] (les patterns de conceptions, les frameworks, etc…) et de méthodes [3] (IDM, Agilité, Scrum, etc...).

Ainsi, au fils des articles nous avons croisé un certain nombre de patterns ou de framework qui clairement nous simplifie la vie pour produire notre application. Cependant ce genre de concepts se focalisent exclusivement sur le logiciel lui même sans fournir de réponses à des besoins environnementaux qui peuvent être nombreux et contraignants

Ainsi par exemple, que faire lorsque le logiciel doit être capable de gérer un taux de connexion élevé? Comment garantir la monté en charge? Comment s’assurer de l'intégrité des données ? de leur disponibilités ? de leur sauvegarde? Comment garantir qu’il n’y aura pas d'interruption de service? A toutes ces questions, le logiciel seul ne peut y répondre en plus du besoin pour lequel il est produit. En effet, si techniquement on peut imaginer répondre à ces problématiques, cela nécessiterait des développement spécifiques très lourd en plus du métier pour lequel le logiciel doit être fait et comme nous l’avons vu précédemment, toutes les approches purement logiciel sont beaucoup trop auto-centré.

A cette problématique existe heureusement un solution et celle-ci relève en fait du bon sens. Ainsi, si un logiciel doit être conçu et architecturé, son environnement doit l'être aussi! Et les choix d’architectures (interne et externe au logiciel) doivent permettre à ces deux systèmes de cohabiter.

Nous allons donc prendre un peu de recul sur la conception logiciel elle même et nous placer au dessus des patterns de conception que nous avons vu jusque ici pour regarder le logiciel de façon plus global. L’objectif est toujours de considérer le logiciel avec ses interfaces mais aussi de regarder au delà de celles ci pour penser l’architecture dans son ensemble.

Reprenons pour commencer l’exemple très simple de notre article sur le DAO [1]. Nous avions vu l’une des architectures les plus typiques, l’architecture en 3 couches permettant de dissocier les préoccupations métiers des préoccupations de représentations (la couche presentation) des préoccupations de stockage (la couches de données).

Il est évident que cette approche a de nombreux avantages, dans la conception d’une part car les spécificités des besoins des différentes couches seront isolés et confiés aux experts des différents domaines associés à ses couches. Dans la maintenance également car l'indépendance permet de substituer n’importe quelle couche par d’autres implémentations équivalentes ou même d’autres solutions techniques, tant que les interfaces entre couches sont respectées. Enfin ce genre d’approche faisant consensus parmis les développeurs, elle permet la mise en place de standard tant au niveau méthodologique qu’au niveau technique et aujourd’hui, parler par exemple de l’utilisation d’une architecture JEE en 3 couches fait tout de suite référence aux technologies JSP, JSF, Servlet pour la couche présentation, JPA, Hibernate pour les couches données tout en exploitant des EJB pour les couches métiers. Bien sur le modèle en 3 couches a ses limites et souvent il est necessaire de considerer quelques couches supplémentaires en ajoutant une couche de sécurité entre la présentation et le métier et une couche de cache entre le métier et la couche de données. Nous en obtenons alors le modèle en 5 couches [5].


Bien sur on peut en déduire des modèles à n couches mais cette approche a elle même des limites car en augmentant le nombre de couches, on augmente également le temps de traversé des flux de contrôle et de données, occasionnant une chute des performances.

Pour répondre à cette problématique, heureusement il existe également des solutions. Le problème de l’architecture en couche est d'être vertical. Ainsi, une solution est de fournir des fonctionnalités transverses déployées de manière horizontale.

De façon à concevoir des architectures plus horizontale, une approche dite orientée service est possible ou SOA [7]. Celle ci est apparue peu avant 2000 et a largement bénéficié de l'émergence des webservices. Le principe de SOA est simple, il se base sur le principe du producteur consommateur avec comme produit le service.

Pour orchestrer ces communications [8], un annuaire (UDDI) permet la définition d’un référentiel des services accessibles sur un bus de communication servant de middleware (souvent un ESB mais pouvant reposer plus simplement sur le Web si la sécurisation est complètement pris en compte). Enfin tous ces éléments vont reposer sur le standard xml pour faciliter l'interopérabilité de la communication et l'échange des données en restant conforme aux contrats définis pour les services en exploitant des support de communication comme SOAP ou JMS.

L'intérêt de ce genre d’architecture est clairement la mise en place d’un découplage entre les fonctions fourni par les services permettant à des équipes différentes de les développer indépendamment, sur des cibles potentiellement hétérogènes (OS, frameworks, language). de plus cela permet de faire vivre dans le même environnement des applications requièrant les même services ou partiellement. De même faire évoluer ce type de système se résume alors à l’identification des services à exploiter et des nouveaux à déployer.

La réside la difficulté de cette approche. Il faut être capable de dimensionner correctement les services de façon à ce qu’ils soient ni trop simple au risque d'être trop exploité avec des risques notable de perte de performances (à noter qu’un service est censé être unique donc c’est à lui de gérer l’exploitation de la demande et la monté en charge) soit trop complexe et donc trop peu réutilisable. Les architectures orienté service sont donc souvent confronté aux problèmes de performances qui sont directement relié aux capacités réseaux et aux capacités en temps de réponse des plus fragiles des services du système ( qui peuvent en ralentir ou d'encombrer drastiquement le fonctionnement) A noter que ce n’est pas le seul point noir car, si ls SOA favorise la modularité et le reuse des services, cela ne favorise pas son evoluabilité. Toutes transformations dans la chaîne des processus EBP (Enterprise Business Process) utilisant les services entraînera de forte perturbation sur l’ESB.

Pour palier à ces défauts les microservices proposent de descendre encore en granularité dans la décomposition fonctionnelle. Ainsi un microservice va se réduire à ne répondre qu'à une et une unique fonction tout en simplifiant les protocoles de communication par l’utilisation de REST par exemple et en supprimant le principe de bus. L’idée principale est de produire une fournir un plus grand nombre de services (en comparaison à SOA) mais plus simple, élémentaire et donc plus indépendant. Cela va alors faciliter leur maintenance et leur interchangeabilité.
Les microservices ont, au delà des aspects techniques, des avantages même au niveaux processus car grâce à leur indépendance, il est possible de morceler plus le système et donc de le rendre plus facilement testable. Cela conduit même au rapprochement du développeur dans cette phase de test qui aura la possibilité d’isoler complètement le service qu’il doit produire (on le voit arriver la le docker? ). Finalement, grâce à cela, l’utilisation des microservices va déplacer nos problématiques précédentes de performance et de maintenance en une problématique d’interconnexion et de logique de définition de processus métier. Attention alors à ne pas tomber dans des architectures plat de spaghetti…[6]

Jusque là nous nous sommes projetés dans des architectures sans parler de la structure réseau sous-jacente. Bien sur aujourd’hui une application ne se pense plus de façon stand alone sur un serveur, elles se pensent embarquées dans un ou plusieurs serveurs d’applications répartis sur plusieurs serveurs physiques et les approches de types SOA ou Microservices se prêtent parfaitement à cela mais si l’on ne considère pas forcément ce type de solutions, pourquoi malgré tout choisir une architecture distribuée et/ou décentralisé?

En réalité la réponse est simple, et c’est toujours la même, une architecture bien pensé doit permettre d'éviter de construire des monolithes immaintenables (remarque, si ca nous fait évoluer...) et la décomposition est souvent la première des bonnes idées à avoir.

Nous avons vu que ces principes font parti intégrante des architectures précédentes. En fait si les architectures distribuées et/ou décentralisées sont intéressantes c’est parce que non seulement elle poussent à décomposer le problème et favoriser ainsi la réutilisabilité, la maintenabilité (le problème étant localement plus simple du coup) mais elles permettent aussi d'intégrer des solutions techniques répondant à des problèmes plus spécifiques et techniques exigés par le client comme des exigences de disponibilités, de montées en charges, de vitesse de traitement, etc...

source: Architecture fédérée

Par contre, il ne faut pas croire que parce que l’on va considérer une architecture distribuée et ou décentralisé, les problèmes sont terminées car cela peut aussi être une fausse bonne idées dans certains cas. En effet, souvent ce genre d'architecture nécessite d'incorporer au mieux des outils spécifiques permettant la gestion du problème considéré mais selon les cas, il faudra penser à des mécanismes spécifiquement développées par l'équipe de développement. Dans ce genre de cas, on s’engage souvent sur un chemin complexe car ce genre d'architecture ne sont pas simple à gérer soit même. Par exemple, si nous considérons le cas d’une architecture orienté données qu’est l’architecture fédérée, elle a pour objet de permettre la mise en collaboration de différentes bases de données pour donner l’illusion qu’elle n’en forme qu’une tout en leur permettant de rester indépendantes. Si l’idée est pertinente, dans la pratique (dans le cas de fédérations faiblement couplé), elle nécessite de constituer des vue spécifiques dans chacunes des bases, des schémas supplémentaires (privé : base initiale , export : données présenté aux autres bases, import : données reconstitué des autres base) et des mécanismes de reconstruction. Ce genre d’approche est très complexe à mener et doit être refait pour à chaque intégration d’une nouvelle base dans la fédération. Il sera probablement plus simple de réaliser une migration des données vers des bases repensées plus globalement.

Alors bien sur le cas des architectures fédérées n’est pas à généraliser et elle peuvent aussi trouver leur applications dans certains cas bien étudié. Il ne faut pas oblitérer que ce genre d’architecture permettent aussi de gérer des problématiques de redondances ou de répartition de charge pour obtenir des services en haute disponibilité.

Pour conclure cet article déjà assez long, on statuera sur le fait que toutes les architectures décrites jusqu'ici sont plutôt classiques alors aujourd’hui, de nouvelles architectures font leur apparition pour intégrer de nouveaux types de besoins comme l'intégration de service dans le cloud, le traitement de données massives, le besoin de procéder à des prévisions ou des profils de ventes grâce à du Big Data ou du Machine learning. Nous ne rentrerons pas dans le détails de celles ci maintenant mais nous y reviendrons.

Références:

[1] https://un-est-tout-et-tout-est-un.blogspot.fr/2018/03/design-pattern-dao.html
[2] https://un-est-tout-et-tout-est-un.blogspot.fr/2017/10/la-conception-logicielle.html
[3] https://un-est-tout-et-tout-est-un.blogspot.fr/2017/12/la-modelisation.html
[4] https://un-est-tout-et-tout-est-un.blogspot.fr/p/java.html
[5] https://jobprod.com/quelques-principes-darchitecture-dapplis-web-javajee/
[6] https://dzone.com/articles/microservices-vs-soa-is-there-any-difference-at-al
[7] https://www.piloter.org/techno/support/SOA.htm
[8] https://openclassrooms.com/courses/implementez-une-architecture-orientee-services-soa-en-java/mprendrecequecestunesoa

mercredi 21 mars 2018

JEE : Petite Intro

Nous avons traité dans quelques articles précédents de l'évolution de Java en partant de la version 1.4 jusqu'à presque aujourd’hui et la version 9 [1]. Il faut savoir qu’au fils de ces années, cette évolution a été suivi par sa version Entreprise. Celle ci nommé sous l’acronyme de J2EE (Java 2 Enterprise Edition) quand java n’en était encore qu'à la version 1.4, elle porte maintenant l’acronyme simplifié JEE (Java Enterprise Edition).

Ainsi avant d’entrer dans les détails techniques propres à cette technologie, je vous propose de faire un petit tour d’horizon des fonctionnalités offertes par cette version entreprise de Java [2].

Java pour l’entreprise est apparue en 1998 et a rapidement intégré les premières API importante du noyau JEE que l’on connaît encore bien aujourd’hui avec les :Servlets, JSP, EJB, JTA, JNDI, JavaMail et JMS (on notera aussi des extension JDBC car JPA n’existait pas encore et JAF).

Rapidement se sont greffés des API très connus comme la JSTL, JAXP (parseur xml) et moins connu comme JCA (Java Connector Architecture et non Java Cryptography Architecture de la version standard de Java) et JAAS (Java Authentication and Authorization Services qui en fait a ete ajoute au java standard mais qui va beaucoup plus etre utile sur les application web et donc JEE).

C’est avec la version 1.4 que J2EE a commencé à se segmenter autour de trois axes. Les techno Web (WebServices, XML, Servlets, JSP, JSTL et les nouvelles JSF), les technos d’entreprises ( avec les fameux et redoutés EJB 2) et enfin les technos de management et de sécurité (JMX et JACC mais oublions le…. ^^)

L’arrivée de Java 5 a été un bouleversement pour l'écosystème java. Java EE 5 a fait de même. La partie Web s’est enrichie de StAX pour le streaming Xml et de SAOP tandis que la partie Entreprise a enfin vu naître les EJB 3 et JPA (issu des techno Hibernate).

JEE 6 a introduit la notion de WebProfile permettant une simplification de la certification JEE pour les conteneurs applicatif leger. On a ainsi pu avoir des conteneurs d’applications se focalisant essentiellement sur le seul respect du web profile. Le WebProfile ne contient par définition que les parties cœurs de JEE, c’est à dire la partie Web (JSP,JSTL, Servlet, etc) en excluant la partie Web service et la Partie Entreprise, c’est à dire les EJB (en version simplifié “Lite”) JPA, et JTA. La version 6 de JEE a aussi amener de nouvelles API: un enrichissement de la partie Web Service avec JAX-RS et JAXM des ajouts dans la partie entreprise comme CDI (issu des technos Spring), les interceptons (équivalent aux filtres de la partie servlet) [3,4]

En 2013 est ensuite venu JEE 7 avec l’ambition de renouveler les technologies permettant la communication entre le front et le back. La partie Web a donc intégré un parseur JSON, l’API WebSocket (tout ça pour HTML5) et l'amélioration des servlets en proposant un mécanisme asynchrone et donc des outils pour gérer la concurrence au sein de la partie Entreprise. A cela, cette composante de JEE s’est également doté d’un mécanisme de Batch permettant l'exécution de traitement spécifique, parallélisable, etc… Donc pas de grosse révolution mais une volonté clairement affichée de suivre le mouvement, a un moment ou le monde du dev à basculer dans le BigData, le cloud, les archi distribuées, (l’IA), etc… [5]

Enfin Java EE 8 ! Sortie en septembre dernier [6], elle repose sur le socle de Java 9. Dans la continuité de JEE 7 ou l’on sentait bien une volonté de tendre vers les technologies Cloud, BD et distribué, celle ci propose des évolutions technique de l’existant et quelque nouveauté comme la prise en charge de la nouvelle norme HTTP/2 ou l'ajout de l'API JSON-B. Certains diront que son évolution a manqué le coche cette année mais JEE 9 étant prévu cette année, JEE 8 doit plutôt être vu comme un temps de pause et une bonne prise d’appuis (avec le passage à java 9 et ses modules) avant un nouveau rebond (espérons le!)

Voila, un petit tour d’horizon historique sur JEE qui n’engage que moi qui attend de voir ce que nous donnera les futur évolutions. En attendant celle-ci, je vous proposerai donc de poursuivre cet article par une liste d’articles traitant du contenu technique de JEE par la pratique. Cet article en fait donc une petite introduction que, j'espère, vous aurez appréciée.

Référence 

[1] https://un-est-tout-et-tout-est-un.blogspot.fr/p/java.html
[2] https://en.wikipedia.org/wiki/Java_EE_version_history
[3] http://alexander.holbreich.org/javaee5-vs-javaee6/
[4] https://blog.xebia.fr/2012/02/01/java-ee-6-une-plateforme-simple-et-legere-spring-na-qua-bien-se-tenir/
[5] http://blog.ippon.fr/2013/06/18/java-ee-7-plus-quun-nouveau-numero-de-version/
[6] http://www.oracle.com/technetwork/java/javaee/tech/index.html

vendredi 13 octobre 2017

Evolution Java 6

Je reviens avec les évolutions de Java  au fil du temps. Aujourd'hui nous allons nous intéresser aux évolutions de Java 6.

L'integration d'interpreteurs de script est une évolution tres intéressante dans l'optique de rendre interopérable Java avec les langages de scripting courant et de plus pour le rendre en plus extensible et capable de largement s’étendre.

Basiquement la plateforme n’intègre par défaut qu'un interpreteur Javascript  mais est extensible avec les langages comme perl, python, ou plus connu dans ce contexte Groovy.

Pour accéder a l'API on passe par la classe javax.script.ScriptEngineManager, exemple:


1
2
3
4
5
6
7
8
9
int val1 = 5;
int val2 = 12;
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.getBindings(ScriptContext.ENGINE_SCOPE).put("val1", val1);
engine.getBindings(ScriptContext.ENGINE_SCOPE).put("val2", val2);
Object result = engine.eval(" var sum= function(val1,val2){return val1+val2;};"
    + "sum(val1,val2);");
System.out.println("Résultat : " + result);

Maintenant en dehors de l’intégration possible d’interpréteur de script, globalement les évolutions de la version 6 de Java consiste essentiellement en des mise a jour ou en l'ajout d'API, aucune modification sensible du langage n'est a noter.

Une API pour le compilateur java pour les adeptes des outils de la compilation java dans Java Cette API se trouve dans le package javax.tools. L'idée principale est de permettre la recompile plus facile de code java directement sans avoir a passer par une plateforme intermédiaire (bash, etc...).

Accès Base de données : une mise a jour de JDBC qui passe a la version 4.0. Je ne rentre pas dans le détail, ce sujet pourra faire l'objet d'un autre billet.

API XML et WebServices. Sur ce point Java 6 opère une grosse évolution. Avec la mise a jour de JAXB et de JAX-WS en 2.0 accompagné des annotations qui vont bien, il est plus simple de mettre en place de façon standard un Webservice. A noter l’intégration de StAX comme parseur XML dont le fonctionnement se situe entre DOM et SAX en gardant que les avantages ainsi que XML Digital-Signature API permettant la sécurisation des WebServices. Je ne rentrerai pas la non plus dans le détail de ces API. Ceci pourra faire l'objet d'un futur billet.

Mise a jour AWT et SWING.... bon... ok

L'API Collection a été enrichi avec de nouvelles interfaces sur les files et sur la navigation dans les Map et les Set avec les implémentations en standard qui vont bien.

Coté Réseau et IO, on notera un enrichissement de la classe java.net.NetworkAdress pour fournir plus d'info réseau (masque reseau, adresse Mac...) et également plus de capacité de gestion des droits sur la classe java.io.File.

java.utils.ServiceLoader : Cette classe n'y parait pas mais a mon sens, elle est extrêmement importante car a elle seule elle permet de conjuguer l'injection de dépendance et le processeur d'annotations AT RUNTIME, ce qui permet de rendre l'utilisation des annotations beaucoup plus efficace et surtout utile plutôt que de juste en faire une utilisation de générateur de fichier de configuration. Je reviendrais la dessus car lorsque l'on traitera OSGI on y trouvera beaucoup d’intérêt. Petit avant gout de la chose ici dans cet article.

Voila, cet article est déjà fini, pas que les évolutions du langage java soit peu significative dans cette version mais il s'agit surtout d'une version ou il a ete important de consolider et de mettre a jour l'existant afin de fournir des fonctionnalités stables et pérennes. Apres les changements fournis avec la Version 5 il fallait bien cela!