Intro
Lorsque l’on dit Microsoft Azure, ou simplement Azure, Java n’est pas la première chose qui vient à l’esprit. Nous verrons pourquoi ce n’est pas tout à fait exact, nous jetterons un coup d’œil à la relation entre Java et Microsoft et, surtout, nous découvrirons ce qu’Azure peut offrir aux développeurs Java.
Java & Microsoft
La relation entre Java et Microsoft n’est pas aussi récente qu’on pourrait le croire. Par exemple, en 1996, Microsoft a proposé Visual J++, un langage conforme aux spécifications du langage Java, qui a ensuite été remplacé par C#.
Aujourd’hui, Microsoft contribue à l’OpenJDK et fournit également ses propres binaires, via sa distribution. Vous pouvez aussi consulter le repo git.
En parallèle, Microsoft organise la Java Devs Conférence (JDConf) réunissant développeurs Java expérimentés et des champions de Java pour discuter d’une série de sujets d’actualité. Nombreux d’entre eux sont d’ailleurs recrutés par l’entreprise. Evidemment, Microsoft se rapproche bien de la communauté Java, et propose un portail dédié à Java où vous pouvez vous lancer.
On note aussi que Microsoft utilise Java en interne, bien que dans une mesure limitée, par exemple dans son moteur de recherche Bing, dans Yammer ainsi que dans LinkedIn.
Mais pourquoi investir ce temps et cet argent avec Java ? Eh bien, en bref, Azure.
Azure
Pour rappel, Azure est la solution cloud de Microsoft, lancée en 2008 et fournissant maintenant un grand ensemble de services allant de “Infrastructure as à Service” (IaaS), “Platform as a Service” (PaaS), à “Software as a Service” (SaaS). Des services divers tels que l’IA, Authentitcation, CDN, IoT et DevOps sont également au catalogue. Au moment de la rédaction de cet article (2022), la part de marché d’Azure est d’environ 21% selon statista.com.
Microsoft encourage activement les développeurs (et les entreprises) de divers stacks technologiques, y compris Java, à migrer leurs applications vers Azure et à faciliter la migration autant que possible.
Dans la suite, je vais vous présenter ce que propose Azure étant susceptible nous, développeurs Java, de nous intéresser.
Architectures d’Applications Courantes
Dans l’univers Java, le spectre des architectures est très large, allant des applications monolithiques qui sont les plus courantes aux applications N-tiered en passant par les Service Oriented Applications (SOA) et les microservices. Nous avons également du “serverless” et “batch jobs”. Dans des prochains articles, nous examinerons de plus près chaque architecture et ses avantages et inconvénients.
Bien que Spring Framework soit le framework le plus populaire, que vous construisiez un monolithe, des microservices ou une optimisation pour le cloud. Tous les frameworks récents se développent rapidement et proposent une approche cloud-first et native comme Quarkus et Micronaut.
Les applications Web Java sont généralement déployées sur des serveurs Web tels que Tomcat (serveur par défaut pour Spring Boot), WebLogic d’Oracle et JBoss de Red Hat et autres.
Je vais vous présenter les différentes options de déploiement, allant de celles où vous avez le plus de contrôle sur les éléments à celles où vous déléguez le plus de responsabilités à Azure. L’avantage de ce dernier étant de ramener des fonctionnalités supplémentaires (gestion de scalabilité, mise à jour des runtime, …).
Déploiements sur Azure
Azure offre aux développeurs Java de nombreuses options pour déployer son application. En termes de « cloud », ces options varient entre IaaS et PaaS. En termes simples, IaaS et PaaS reflètent la part de l’infrastructure ou du logiciel géré par Azure ou par les développeurs. Voici les services les plus courants :
- Machines Virtuelles
- Azure App Services
- Conteneurs
- Fonctions
- Spring Apps (anciennement Azure Spring Cloud)
Machines Virtuelles
La façon la plus simple de passer au cloud consiste à créer une machine virtuelle (VM), c’est-à-dire une machine qui vit dans les centres de données de Microsoft plutôt que on-premise (nos propres serveurs). Cette option vous donne un maximum de contrôle et de flexibilité, car vous pouvez personnaliser presque tout sur la machine et son matériel en fonction de la charge de travail dont vous avez besoin. Mais cela signifie également que vous devrez installer votre propre serveur d’applications et gérer toutes les mises à jour nécessaires (OS compris).
Le passage aux machines virtuelles vers le cloud est le moyen le plus rapide de migrer vers une infrastructure sur le cloud et peut constituer une première étape lorsqu’une migration avait été décidée. Cette opération est connue sous le nom de « lift and shift ».
Azure App Services
Les services d’applications Azure vous offrent un environnement prêt dans lequel il vous suffit pratiquement de déployer votre binaire. Les runtimes nécessaires à l’appli comme le JDK pour Java et le serveur applicatif sont gérés par Azure ce qui allège la charge du développeur (installation, configuration, etc.). Vous pouvez choisir un serveur d’applications tels que JBoss/Tomcat, ou simplement déployer un jar autonome comme pour les applications Spring Boot. En d’autres termes, la machine, le système d’exploitation et le serveur d’applications seront transparents et entièrement gérés par Azure.
Les App Services acceptent également une image docker à publier.
Conteneurs
Une autre option pratique consiste à utiliser des conteneurs, et à cette fin, Azure propose Azure Container Instances, Container Apps et Kubernetes Service comme version de l’infrastructure de conteneurs gérés ou « managed ». En gros, vous pouvez créer votre conteneur en utilisant Docker comme d’habitude, puis le déployer et l’exécuter dans Azure en utilisant l’un de ces services. OpenShift de Red Hat est également disponible comme option.
Azure Spring Apps (anciennement Azure Spring Cloud)
L’un des choix les plus récents et les plus élaborés pour votre application est Spring Apps. Il est particulièrement adapté aux architectures microservices. En plus de l’environnement physique et le système d’exploitation, Azure gère les services Spring et fournit un grand nombre d’outils de surveillance et de diagnostic. En gros, le développeur se concentre sur le développement de ces diffèrents services et puis sur la config.
Bien que son nom suggère des applications Spring Java, Spring Apps prend également en charge les applications .Net à l’aide de Steeltoe, un logiciel open-source conçu spécifiquement pour les microservices.
Fonctions
Imaginez une fonction unique comme dans votre code, mais sur un serveur quelque part et appelée après un certain trigger. C’est exactement ce que sont les fonctions Azure. Vous vous concentrez donc sur la logique encapsulée dans cette fonction, sans se soucier de l’environnement d’exécution. Les fonctions peuvent s’exécuter quasiment dans n’importe quel runtime (vous pouvez ajouter le vôtre si ce dont vous avez besoin n’est pas fourni). Cette solution est particulièrement adaptée aux applications évènementiels, « event-driven apps ».
Jakarta EE (anciennement Java EE)
Dans certains cas, vous avez une application Jakarta EE et vous devez la déployer sur un serveur d’application spécifique, que ce soit dans une VM, un conteneur ou d’autres services gérés par Azure. Pour ce genre de scénarios, Microsoft ajoute des modèles dans son store et travaille avec les éditeurs comme Red Hat par exemple pour optimiser le processus de déploiement sur JBoss.
Avantages de Délégation Azure
Scalabilité
Plus Azure prend en charge de choses, plus il rend la scalabilité facile à mettre en place. Etant une caractéristique essentielle de toute offre de cloud, la scalabilité est la capacité à s’adapter lorsque la charge augmente. Dans Azure, toutes les options que nous avons parcourues sont dotées de fonctions de scalabilité, qui vous permettent de faire évoluer votre système à la demande ou en fonction de critères que vous définissez. Par exemple, vous pouvez augmenter le nombre de machines virtuelles ou créer davantage d’instances d’App Services ou de conteneurs lorsque certaines conditions changent. Ces conditions peuvent être définies à l’aide de nombreux paramètres tels que la charge du processeur ou le nombre de requêtes.
Monitoring
Azure offre des fonctionnalités de surveillance puissantes pour ses services qui vous permet de surveiller les performances et la disponibilité de vos applications en temps réel, ainsi que de suivre et d’analyser les logs pour le dépannage et le débogage. Azure fournit également des alertes et des notifications pour vous informer des problèmes potentiels ou des changements dans l’état de leurs systèmes. On trouve généralement ces fonctionnalités sous l’onglet « insights » de tous les services qu’on a abordés. Dans le cas de Spring Services, cette partie est très élaborée et permet d’avoir une vision globale, précise et en temps réels de vos services.
Dans l’ensemble, ces fonctionnalités de surveillance aident à garantir la fiabilité et les performances des applications, et permettent d’offrir une meilleure expérience à vos clients.
Tooling
Plugins pour IDE
Afin d’accompagner les développeurs, un certain nombre d’outils facilitent l’intégration du cloud avec les différents outils de développement. Microsoft a créé des plugins Azure pour les IDE Java les plus populaires qui vous permettent de créer, développer, configurer, tester et déployer sans quitter votre IDE. Pour l’instant, nous disposons de plugins pour IntelliJ, Eclipse et VS code.
Maven Plugins
Si vous utilisez Maven dans vos projets Java, ce qui est fort probable, vous avez à votre disposition des plugins Maven pour Azure App Services (Web Apps), Azure Functions et Azure Spring Apps.
DevOps
Et si vous utilisez Azure DevOps pour construire/déployer votre application, vous pouvez ajouter des tâches spécifiques aux projets Java : des tâches Maven pour interagir avec Maven et Java Tools Installer pour définir votre variable d’environnement et le JDK cible.
Migration d’une Application
À la suite de tout cela si l’expérience vous tente alors pourquoi pas migrer votre application. La recommandation de Microsoft pour la migration d’une application existante vers le cloud est de suivre un processus en 4 étapes :
- Déterminez le type d’application, qu’il s’agisse d’une application Spring, d’un jar déployable, d’une application Jakarta EE… etc.
- Choisissez le(s) service(s) Azure de destination qui correspondent le mieux à votre application, comme les solutions que nous avons mentionnées précédemment.
- Vérifiez les connexions de votre application aux services on-premises afin de pouvoir fournir les services de connectivité Azure nécessaires.
- Évaluez la capacité actuelle de votre système pour avoir une vision claire de votre matériel actuel ainsi que de la moyenne, du pic de la charge et de l’utilisation des ressources correspondantes. Cela vous aidera à mieux choisir le matériel et les services Azure ainsi que vos options de scalabilité.