{"id":34140,"date":"2019-10-31T21:56:35","date_gmt":"2019-10-31T18:56:35","guid":{"rendered":"https:\/\/prohoster.info\/blog\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\/"},"modified":"2019-10-31T21:56:35","modified_gmt":"2019-10-31T18:56:35","slug":"printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","title":{"rendered":"Principes de d\u00e9veloppement d'applications modernes par NGINX. Partie 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bonjour, amis. En attendant le lancement du cours <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/h4Ez\/\">\u00abD\u00e9veloppeur Backend en PHP\u00bb<\/a><\/noindex>, nous partageons traditionnellement avec vous la traduction de mat\u00e9riel utile.<\/p>\n<p>Le logiciel r\u00e9sout de plus en plus de t\u00e2ches quotidiennes, tout en devenant de plus en plus complexe. Comme l'a dit un jour Marc Andreessen, il absorbe le monde. <\/p>\n<p><img decoding=\"async\" alt=\"Principes de d\u00e9veloppement d&#039;applications modernes par NGINX. Partie 1\" src=\"\/wp-content\/uploads\/928924e3036beaac518dd4a2674a8a30.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn cons\u00e9quence, au cours des derni\u00e8res ann\u00e9es, les approches de d\u00e9veloppement et de livraison d'applications ont consid\u00e9rablement chang\u00e9. Ce furent des changements de port\u00e9e tectonique, qui ont abouti \u00e0 l'\u00e9mergence d'un ensemble de principes. Ces principes se sont r\u00e9v\u00e9l\u00e9s utiles pour former une \u00e9quipe, concevoir, d\u00e9velopper et livrer votre application aux utilisateurs finaux. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Les principes peuvent \u00eatre r\u00e9sum\u00e9s de la mani\u00e8re suivante : <i>l'application doit \u00eatre petite, r\u00e9seau et avoir une architecture ax\u00e9e sur le d\u00e9veloppeur<\/i>. En vous basant sur ces trois principes, vous pouvez cr\u00e9er une application robuste et compl\u00e8te qui peut \u00eatre livr\u00e9e rapidement et en toute s\u00e9curit\u00e9 \u00e0 l'utilisateur final, tout en \u00e9tant facile \u00e0 faire \u00e9voluer et \u00e0 \u00e9tendre.<\/p>\n<p><img decoding=\"async\" alt=\"Principes de d\u00e9veloppement d&#039;applications modernes par NGINX. Partie 1\" src=\"\/wp-content\/uploads\/9116869a53fb6cf89d92f1d507d7904f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nChacun des principes propos\u00e9s a un certain nombre d'aspects que nous discuterons pour montrer comment chaque principe contribue \u00e0 l'objectif final, qui est de livrer rapidement des applications fiables faciles \u00e0 entretenir et \u00e0 utiliser. Nous examinerons les principes en les comparant \u00e0 leurs oppos\u00e9s, afin de clarifier ce que signifie, disons, \u00abAssurez-vous d'utiliser le <i>principe de petitesse<\/i>\u00bb.<\/p>\n<p>Nous esp\u00e9rons que cet article vous incitera \u00e0 utiliser les principes propos\u00e9s pour construire des applications modernes, qui assureront une approche coh\u00e9rente de la conception dans le contexte d'une pile technologique en constante expansion. <\/p>\n<p>En appliquant ces principes, vous constaterez que vous suivez les derni\u00e8res tendances en mati\u00e8re de d\u00e9veloppement logiciel, y compris l'approche <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/devops\/\">DevOps<\/a><\/noindex> au d\u00e9veloppement et \u00e0 la livraison d'applications, l'utilisation de conteneurs (par exemple, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/docker\/\">Docker<\/a><\/noindex>) et de frameworks pour l'orchestration de conteneurs (par exemple, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/kubernetes\/\">Kubernetes<\/a><\/noindex>), l'utilisation de microservices (y compris l'Architecture Microservices <noindex>NGINX<\/noindex> et <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/what-is-a-service-mesh\/\">architecture de communication r\u00e9seau<\/a><\/noindex> pour les applications microservices.<\/p>\n<p><b>Qu'est-ce qu'une application moderne ?<\/b><\/p>\n<p>Applications modernes ? Pile moderne ? Que signifie exactement \u00abmoderne\u00bb ? <\/p>\n<p>La plupart des d\u00e9veloppeurs n'ont qu'une id\u00e9e g\u00e9n\u00e9rale de ce qui compose une application moderne, il est donc n\u00e9cessaire de d\u00e9finir clairement ce concept.<\/p>\n<p>Une application moderne prend en charge plusieurs clients, qu'il s'agisse d'une interface utilisateur utilisant la biblioth\u00e8que JavaScript React, d'une application mobile sur Android ou iOS, ou d'une application qui se connecte \u00e0 une autre via une API. Une application moderne implique un nombre ind\u00e9fini de clients pour lesquels elle fournit des donn\u00e9es ou des services.<\/p>\n<p>Une application moderne offre une API pour acc\u00e9der aux donn\u00e9es et services demand\u00e9s. L'API doit \u00eatre immuable et constante, et non \u00e9crite sp\u00e9cifiquement pour une requ\u00eate particuli\u00e8re d'un client donn\u00e9. L'API est accessible via HTTP(S) et permet d'acc\u00e9der \u00e0 toute la fonctionnalit\u00e9 disponible dans l'interface graphique ou l'interface en ligne de commande. <\/p>\n<p>Les donn\u00e9es doivent \u00eatre disponibles dans un format couramment accept\u00e9 et compatible, tel que JSON. L'API fournit des objets et des services dans une forme compr\u00e9hensible et organis\u00e9e, par exemple, les API RESTful ou GraphQL offrent une interface ad\u00e9quate.<\/p>\n<p>Les applications modernes sont construites sur une pile technologique moderne, et une pile moderne est celle qui prend en charge ces applications. Cette pile permet au d\u00e9veloppeur de cr\u00e9er facilement une application avec une interface HTTP et des points de terminaison API clairement d\u00e9finis. L'approche choisie permettra \u00e0 votre application d'accepter et d'envoyer des donn\u00e9es au format JSON sans difficult\u00e9. En d'autres termes, la pile moderne correspond aux \u00e9l\u00e9ments du Twelve-Factor App. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/microservices-reference-architecture-nginx-twelve-factor-app\/\">microservices<\/a><\/noindex>. <\/p>\n<p>Les versions populaires de ce type de pile sont bas\u00e9es sur <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-photoresizer\">Java<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-user-manager\">Python<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-photouploader\">N\u0153ud<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-album-manager\">Ruby<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-pages\">PHP<\/a><\/noindex> et <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-content-service\">Go<\/a><\/noindex>. L'Architecture Microservices <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-ingenious\">NGINX<\/a><\/noindex> incarne un exemple de pile moderne impl\u00e9ment\u00e9e dans chacun des langages mentionn\u00e9s.<\/p>\n<p>Notez que nous ne pr\u00f4nons pas exclusivement l'approche microservices. Beaucoup d'entre vous travaillent avec des monolithes qui doivent \u00e9voluer, tandis que d'autres s'attaquent \u00e0 des applications SOA qui se d\u00e9veloppent et \u00e9voluent pour devenir des applications microservices. Certains se dirigent vers l'utilisation d'applications sans serveur, et quelques-uns impl\u00e9mentent des combinaisons des m\u00e9thodes pr\u00e9c\u00e9dentes. Les principes \u00e9nonc\u00e9s dans cet article s'appliquent \u00e0 chacun de ces syst\u00e8mes avec quelques adaptations mineures. <\/p>\n<p><b>Principes<\/b><\/p>\n<p>Maintenant que nous avons une compr\u00e9hension g\u00e9n\u00e9rale de ce qu'est une application moderne et d'un stack moderne, il est temps de plonger dans les principes d'architecture et de d\u00e9veloppement qui vous seront utiles dans la cr\u00e9ation, la mise en \u0153uvre et la maintenance d'une application moderne.<\/p>\n<p>Un des principes se r\u00e9sume \u00e0 \u00ab cr\u00e9ez des applications petites \u00bb, appelons-le simplement <i>le principe de petitesse<\/i>. Il existe des applications incroyablement complexes compos\u00e9es de nombreux composants dynamiques. Par cons\u00e9quent, construire une application \u00e0 partir de petits composants discrets simplifie sa conception, son entretien et son utilisation en g\u00e9n\u00e9ral. (Notez que nous avons dit \u00ab simplifie \u00bb, et non \u00ab rend simple \u00bb).<\/p>\n<p>Le deuxi\u00e8me principe est que nous pouvons augmenter la productivit\u00e9 des d\u00e9veloppeurs en les aidant \u00e0 se concentrer sur les fonctionnalit\u00e9s qu'ils d\u00e9veloppent, tout en les lib\u00e9rant des soucis li\u00e9s \u00e0 l'infrastructure et au CI\/CD lors de la mise en \u0153uvre. En d'autres termes, notre approche <i>est ax\u00e9e sur les d\u00e9veloppeurs<\/i>.<\/p>\n<p>Enfin, tout ce qui concerne votre application doit \u00eatre connect\u00e9 \u00e0 un r\u00e9seau. Au cours des 20 derni\u00e8res ann\u00e9es, nous avons fait de grands progr\u00e8s vers un avenir r\u00e9seau, car les r\u00e9seaux sont devenus plus rapides et les applications plus complexes. Comme nous l'avons d\u00e9j\u00e0 \u00e9tabli, une application moderne doit \u00eatre utilis\u00e9e sur le r\u00e9seau par de nombreux clients diff\u00e9rents. L'application d'une pens\u00e9e r\u00e9seau dans l'architecture pr\u00e9sente des avantages significatifs qui s'harmonisent bien avec <i>le principe de petitesse<\/i> et le concept d'approche, <i>ax\u00e9e sur les d\u00e9veloppeurs<\/i>.<\/p>\n<p>Si, lors de la conception et de la mise en \u0153uvre de votre application, vous gardez ces principes \u00e0 l'esprit, vous b\u00e9n\u00e9ficierez d'un avantage indiscutable dans le d\u00e9veloppement et la livraison de votre produit.<\/p>\n<p>Examinons ces trois principes plus en d\u00e9tail.<\/p>\n<p><b>Le principe de petitesse<\/b><\/p>\n<p>Il est difficile pour le cerveau humain de traiter simultan\u00e9ment une grande quantit\u00e9 d'informations. En psychologie, le terme charge cognitive d\u00e9signe la quantit\u00e9 totale d'efforts mentaux n\u00e9cessaires pour conserver des informations en m\u00e9moire. R\u00e9duire la charge cognitive des d\u00e9veloppeurs est primordial, car cela leur permet de se concentrer sur la r\u00e9solution de probl\u00e8mes, au lieu de garder en t\u00eate le mod\u00e8le complexe actuel de l'application enti\u00e8re et des fonctionnalit\u00e9s en d\u00e9veloppement. <\/p>\n<p><img decoding=\"async\" alt=\"Principes de d\u00e9veloppement d&#039;applications modernes par NGINX. Partie 1\" src=\"\/wp-content\/uploads\/26df2016a46d8b82b45832fe1df9bf23.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Les applications sont d\u00e9compos\u00e9es pour plusieurs raisons :<\/p>\n<ul>\n<li>R\u00e9duction de la charge cognitive des d\u00e9veloppeurs ;<\/li>\n<li>Acc\u00e9l\u00e9ration et simplification des tests ;<\/li>\n<li>Livraison rapide des modifications dans l'application.<\/li>\n<\/ul>\n<p><\/i><br \/>\nIl existe plusieurs fa\u00e7ons de r\u00e9duire la charge cognitive des d\u00e9veloppeurs, et c'est ici que le principe de petitesse entre en jeu.<\/p>\n<p>Donc, trois fa\u00e7ons de r\u00e9duire la charge cognitive :<\/p>\n<ol>\n<li>R\u00e9duire les d\u00e9lais que les d\u00e9veloppeurs doivent prendre en compte lors de la cr\u00e9ation d'une nouvelle fonctionnalit\u00e9 - plus le d\u00e9lai est court, moins la charge cognitive est \u00e9lev\u00e9e.<\/li>\n<li>R\u00e9duire le nombre de lignes de code sur lesquelles ils travaillent simultan\u00e9ment - moins de code signifie moins de charge.<\/li>\n<li>Simplifier le processus d'apport de modifications incr\u00e9mentales \u00e0 l'application.<\/li>\n<\/ol>\n<p>\n<b>R\u00e9duction des d\u00e9lais de d\u00e9veloppement<\/b><\/p>\n<p>Retournons \u00e0 l'\u00e9poque o\u00f9 la m\u00e9thodologie <code>waterfall<\/code> \u00e9tait la norme dans le processus de d\u00e9veloppement, et les d\u00e9lais de six mois \u00e0 deux ans pour le d\u00e9veloppement ou la mise \u00e0 jour d'une application \u00e9taient monnaie courante. En r\u00e8gle g\u00e9n\u00e9rale, les ing\u00e9nieurs lisaient d'abord les documents pertinents, tels que le cahier des charges (PRD), la documentation syst\u00e8me (SRD), le plan d'architecture, et commen\u00e7aient \u00e0 assembler toutes ces informations dans un seul mod\u00e8le cognitif, selon lequel ils \u00e9crivaient du code. \u00c0 mesure que les exigences et, par cons\u00e9quent, l'architecture changeaient, il \u00e9tait n\u00e9cessaire de d\u00e9ployer des efforts consid\u00e9rables pour informer toute l'\u00e9quipe des mises \u00e0 jour du mod\u00e8le cognitif. Une telle approche pouvait, dans le pire des cas, paralyser le travail.<\/p>\n<p>Le plus grand changement dans le processus de d\u00e9veloppement d'applications a \u00e9t\u00e9 l'adoption de la m\u00e9thodologie agile. L'une des caract\u00e9ristiques principales de la m\u00e9thodologie <code>agile<\/code> est le d\u00e9veloppement it\u00e9ratif. En cons\u00e9quence, cela r\u00e9duit la charge cognitive des ing\u00e9nieurs. Au lieu d'exiger que l'\u00e9quipe de d\u00e9veloppeurs r\u00e9alise l'application en un seul cycle long, <code>agile<\/code> cette approche permet de se concentrer sur de petits volumes de code qui peuvent \u00eatre rapidement test\u00e9s et d\u00e9ploy\u00e9s, tout en obtenant \u00e9galement des retours. La charge cognitive d'une application est pass\u00e9e d'un d\u00e9lai de six mois \u00e0 deux ans avec une multitude de sp\u00e9cifications \u00e0 un ajout ou un changement de fonctionnalit\u00e9 de deux semaines, avec une compr\u00e9hension plus floue d'une grande application.<\/p>\n<p>D\u00e9placer le focus d'une application massive vers de petites fonctions sp\u00e9cifiques, qui peuvent \u00eatre termin\u00e9es en un sprint de deux semaines, avec un regard tourn\u00e9 vers une seule fonction du prochain sprint, repr\u00e9sente un changement significatif. Cela a permis d'accro\u00eetre la productivit\u00e9 du d\u00e9veloppement tout en r\u00e9duisant la charge cognitive, qui oscillait constamment.<\/p>\n<p>Dans la m\u00e9thodologie <code>agile<\/code> il est pr\u00e9vu que l'application finale sera une version quelque peu modifi\u00e9e du concept initial, d'o\u00f9 le fait que le point final du d\u00e9veloppement est n\u00e9cessairement ambigu. Seuls les r\u00e9sultats de chaque sprint sp\u00e9cifique peuvent \u00eatre clairs et pr\u00e9cis.<\/p>\n<p><b>Petites bases de code<\/b><\/p>\n<p>La prochaine \u00e9tape pour r\u00e9duire la charge cognitive consiste \u00e0 r\u00e9duire la base de code. En g\u00e9n\u00e9ral, les applications modernes sont massives \u2013 une application d'entreprise fiable peut contenir des milliers de fichiers et des centaines de milliers de lignes de code. Selon l'organisation des fichiers, les relations et d\u00e9pendances entre le code et les fichiers peuvent \u00eatre \u00e9videntes ou, au contraire, obscures. M\u00eame le d\u00e9bogage de l'ex\u00e9cution du code peut poser des probl\u00e8mes, selon les biblioth\u00e8ques utilis\u00e9es et dans quelle mesure les outils de d\u00e9bogage d\u00e9limitent les biblioth\u00e8ques\/paquets\/modules et le code utilisateur.<\/p>\n<p>Construire un mod\u00e8le mental op\u00e9rationnel du code de l'application peut prendre un temps consid\u00e9rable, et \u00e0 nouveau imposer une forte charge cognitive au d\u00e9veloppeur. Cela est particuli\u00e8rement vrai pour les bases de code monolithiques, o\u00f9 il y a une grande quantit\u00e9 de code dont l'interaction entre les composants fonctionnels n'est pas clairement d\u00e9finie, et o\u00f9 la s\u00e9paration des objets d'attention est souvent floue, car les fronti\u00e8res fonctionnelles ne sont pas respect\u00e9es. <\/p>\n<p>L'un des moyens efficaces de r\u00e9duire la charge cognitive des ing\u00e9nieurs est de passer \u00e0 une architecture microservices. Dans l'approche microservices, chaque service se concentre sur un ensemble de fonctions ; le sens du service est g\u00e9n\u00e9ralement d\u00e9fini et clair. Les fronti\u00e8res du service sont \u00e9galement claires \u2013 gardez \u00e0 l'esprit que la communication avec le service se fait via une API, donc les donn\u00e9es g\u00e9n\u00e9r\u00e9es par un service peuvent facilement \u00eatre transmises \u00e0 un autre.<\/p>\n<p>L'interaction avec d'autres services est g\u00e9n\u00e9ralement limit\u00e9e \u00e0 quelques services utilisateurs et \u00e0 quelques services fournisseurs, qui utilisent des appels API simples et clairs, par exemple via REST. Cela signifie que la charge cognitive sur l'ing\u00e9nieur est s\u00e9rieusement r\u00e9duite. La t\u00e2che la plus complexe reste \u00e0 comprendre le mod\u00e8le d'interaction des services et comment des choses comme les transactions se d\u00e9roulent entre plusieurs services. En fin de compte, l'utilisation de microservices diminue la charge cognitive en r\u00e9duisant la quantit\u00e9 de code, en d\u00e9finissant des fronti\u00e8res claires pour le service et en assurant une compr\u00e9hension des relations entre utilisateurs et fournisseurs.<\/p>\n<p><b>Petites modifications incr\u00e9mentales<\/b><\/p>\n<p>Le dernier \u00e9l\u00e9ment du principe <i>petitesse<\/i> \u2013 c'est la gestion des changements. Une tentation particuli\u00e8re pour les d\u00e9veloppeurs est de regarder la base de code (y compris, peut-\u00eatre, leur propre code plus ancien) et de d\u00e9clarer : \u00ab C'est nul, nous devons tout r\u00e9\u00e9crire. \u00bb Parfois, c'est la bonne d\u00e9cision, parfois non. Cela impose \u00e0 l'\u00e9quipe de d\u00e9veloppeurs le fardeau d'un changement global de mod\u00e8le, ce qui, \u00e0 son tour, entra\u00eene une charge cognitive massive. Il vaut mieux que les ing\u00e9nieurs se concentrent sur les modifications qu'ils peuvent apporter durant le sprint, afin de d\u00e9ployer en temps voulu les fonctionnalit\u00e9s n\u00e9cessaires, m\u00eame progressivement. Le produit final doit ressembler \u00e0 ce qui \u00e9tait initialement pr\u00e9vu, mais avec quelques modifications et des tests pour r\u00e9pondre aux besoins du client.<\/p>\n<p>Lors de la r\u00e9\u00e9criture de grandes portions de code, il est parfois impossible de livrer rapidement des modifications, car d'autres d\u00e9pendances du syst\u00e8me entrent en jeu. Pour contr\u00f4ler le flux de changements, on peut utiliser la masquage de fonctionnalit\u00e9s (feature hiding). En gros, cela signifie que la fonctionnalit\u00e9 est pr\u00e9sente en production, mais n'est pas accessible via des variables d'environnement (env-var) ou tout autre m\u00e9canisme de configuration. Si le code a pass\u00e9 tous les processus de validation, il peut se retrouver en production dans un \u00e9tat masqu\u00e9. Cependant, cette strat\u00e9gie ne fonctionne que si la fonction sera finalement activ\u00e9e. Dans le cas contraire, elle encombrera simplement le code et ajoutera une charge cognitive que le d\u00e9veloppeur devra g\u00e9rer pour travailler de mani\u00e8re productive. La gestion des changements et les modifications incr\u00e9mentales aident \u00e0 maintenir la charge cognitive des d\u00e9veloppeurs \u00e0 un niveau acceptable. <\/p>\n<p>Les ing\u00e9nieurs doivent surmonter de nombreuses difficult\u00e9s m\u00eame lors de l'implemendation de fonctionnalit\u00e9s suppl\u00e9mentaires simples. Du c\u00f4t\u00e9 de la direction, il serait judicieux de r\u00e9duire la charge inutile sur l'\u00e9quipe afin qu'elle puisse se concentrer sur les \u00e9l\u00e9ments cl\u00e9s de la fonctionnalit\u00e9. Voici trois choses que vous pouvez faire pour aider votre \u00e9quipe de d\u00e9veloppement :<\/p>\n<ol>\n<li>Utiliser une m\u00e9thodologie <code>agile<\/code>, pour limiter le temps durant lequel l'\u00e9quipe doit se concentrer sur les fonctions cl\u00e9s.<\/li>\n<li>R\u00e9ussir \u00e0 r\u00e9aliser votre application sous forme de plusieurs microservices. Cela limitera le nombre de fonctionnalit\u00e9s \u00e0 mettre en \u0153uvre et renforcera les fronti\u00e8res qui maintiennent la charge cognitive pendant le travail.<\/li>\n<li>Pr\u00e9f\u00e9rez les modifications incr\u00e9mentales aux changements majeurs et encombrants, modifiez de petits morceaux de code. Utilisez le masquage de fonctionnalit\u00e9s pour impl\u00e9menter des changements m\u00eame s'ils ne seront pas visibles imm\u00e9diatement apr\u00e8s leur ajout.<\/li>\n<\/ol>\n<p>\nSi vous appliquez le principe de la petitesse dans votre travail, votre \u00e9quipe sera beaucoup plus heureuse, pourra mieux se concentrer sur la mise en \u0153uvre des fonctionnalit\u00e9s n\u00e9cessaires et aura plus de chances de d\u00e9ployer rapidement des changements de qualit\u00e9. Cependant, cela ne signifie pas que le travail ne peut pas se compliquer ; au contraire, l'impl\u00e9mentation de nouvelles fonctionnalit\u00e9s peut n\u00e9cessiter la modification de plusieurs services, et ce processus peut \u00eatre plus complexe que dans une architecture monolithique. Quoi qu'il en soit, les avantages du principe de petitesse en valent la peine.<\/p>\n<p>Fin de la premi\u00e8re partie.<\/p>\n<p>Nous publierons bient\u00f4t la deuxi\u00e8me partie de la traduction, en attendant nous attendons vos commentaires et vous invitons \u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/mJ6e\/\">journ\u00e9e portes ouvertes<\/a><\/noindex>, qui aura lieu aujourd'hui \u00e0 20h00.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/452748\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f. \u0412 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u0443\u0440\u0441\u0430 \u00abBackend \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 PHP\u00bb, \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0441\u044c \u0432\u0441\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u041a\u0430\u043a \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0441\u043a\u0430\u0437\u0430\u043b \u041c\u0430\u0440\u043a \u0410\u043d\u0434\u0440\u0435\u0441\u0441\u0435\u043d, \u043e\u043d\u043e \u043f\u043e\u0433\u043b\u043e\u0449\u0430\u0435\u0442 \u043c\u0438\u0440. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043b\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-34140","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043e\u0442 NGINX. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:56:35+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:56:35+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Principes de d\u00e9veloppement des applications modernes de NGINX. Partie 1 | ProHoster","description":"Salut, les amis.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043e\u0442 NGINX. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:56:35+00:00","article:modified_time":"2019-10-31T18:56:35+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34140","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 18:05:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:27:30","updated":"2026-01-21 18:05:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/34140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=34140"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/34140\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=34140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=34140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=34140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}