Est-il normal de découpler complètement les applications Web dorsales et frontales et de leur permettre de communiquer avec l'API REST (JSON)?

21

Je crée une nouvelle application web d'entreprise et je souhaite atteindre:

  • Utilisez les meilleures technologies de leurs domaines respectifs. Je veux un framework backend fiable avec un ORM solide. Et je veux le framework SPA (application de page unique) le plus avancé avec l'utilisation des fonctionnalités HTML et Javascript les plus récentes pour l'application frontend
  • Exposer des entités back-end et des services commerciaux à utiliser à partir de différents types d'applications - par exemple, des applications Web, mobiles (Android) et éventuellement d'autres types (appareils intelligents, etc.)

Donc - pour satisfaire les deux exigences, je suis enclin à séparer complètement mon application dans les applications backend et frontend et à organiser la communication entre elles à l'aide de l'API REST (JSON). Est-ce une bonne approche?

Une telle séparation n'est pas une solution de conception évidente, car de nombreuses technologies d'application Web ont des couches de vue intégrées où l'application côté serveur contrôle plus ou moins la génération de la vue et gère partiellement les réponses de la vue (par exemple SpringMVC avec couche de vue, PHP Yii avec vue , Java JSF / Facelets enregistre complètement l'état de leurs composants sur le serveur). Ainsi, il existe de nombreuses technologies qui proposent un couplage plus fort et promettent un temps de développement plus rapide et un parcours plus standard. Donc - je dois être prudent lorsque je commence à utiliser des technologies d'une manière qui n'est pas largement utilisée.

Si je comprends bien, le frontend SPA complètement séparé découle généralement de la nécessité d'utiliser une API tierce. Mais le découplage sonore est-il si le backend et le frontend sont développés par une seule entreprise?

Mon choix de technologies est actuellement Java / Spring backend et Angular2 / Web Components / Polymer pour frontend - si j'ai le droit de le dire. Mais cela n'est pas pertinent pour cette question, car cette question concerne la conception générale et non le choix des technologies concrètes?

TomR
la source
8
(1). Oui. Il est maintenant normal de passer des jours dans cette direction.
Laiv
5
(2). So - I must be cautious when starting to use technologies in manner which is not widely used.Oui, vous devez être prudent si vous prévoyez d'utiliser un marteau pour poinçonner la soie. Ce n'est peut-être pas le bon outil.
Laiv
3
Sachez que le découplage d'une manière aussi rigoureuse engendre des coûts de développement initiaux importants. Vous devez en tirer une valeur concrète.
usr
2
Notez également que vous ne pouvez jamais exposer directement votre domaine au navigateur. Cela crée des problèmes de sécurité et les données ne seront pas correctement formatées pour l'affichage. Vous devrez créer une interface à usage spécial (REST) ​​juste pour que JavaScript appelle. Et c'est couplé.
usr
1
Spring a les annotations PathVariable, ResponseBody, RequestBody et RestController (vous devriez les vérifier). Ils rendent le développement d'applications Web JSON / REST basé sur Ajax très, très facile, ce qui fait de Spring un excellent backend pour SPA. Je crois fermement que séparer le frontend et le backend de cette façon est le meilleur choix: les applications JSF classiques avec lesquelles j'ai eu le "plaisir" de travailler étaient un gâchis.
Traubenfuchs

Réponses:

14

Est-il normal de découpler complètement les applications Web dorsales et frontales et de leur permettre de communiquer avec l'API REST (JSON)?

Oui c'est normal. Mais ce n'est normal que si vous avez besoin de ce type de séparation et que vous ne forcez pas cette configuration dans votre application globale.

Un SPA est livré avec quelques problèmes qui lui sont associés. En voici quelques-unes qui me viennent à l'esprit:

  • c'est principalement JavaScript. Une erreur dans une section de votre application peut empêcher les autres sections de l'application de fonctionner en raison de cette erreur Javascript. Avec les pages servies depuis le serveur (SpringMVC, PHP, etc.), vous rechargez une nouvelle section;
  • CORS . Pas nécessairement obligatoire mais souvent le back-end est sur un nom de domaine différent du front-end. Alors maintenant, vous devez faire face aux problèmes de sécurité du navigateur;
  • SEO . As tu besoin de ça? Votre site est-il public? Google peut comprendre Javascript et essayer de donner un sens à votre site, mais vous donnez essentiellement le contrôle à un bot et espérez le meilleur. Reprendre le contrôle peut signifier devoir recourir à d'autres outils comme PhantomJS .
  • une application frontale distincte signifie des projets distincts, des pipelines de déploiement, des outils supplémentaires, etc.;
  • la sécurité est plus difficile à faire lorsque tout le code est sur le client;

Bien sûr, il y a aussi des avantages SPA:

  • interagir complètement dans le front-end avec l'utilisateur et charger uniquement les données nécessaires depuis le serveur. Donc meilleure réactivité et expérience utilisateur;
  • selon l'application, certains traitements effectués sur le client signifient que vous épargnez le serveur de ces calculs.
  • avoir une meilleure flexibilité dans l'évolution du back-end et du front-end (vous pouvez le faire séparément);
  • si votre back-end est essentiellement une API, vous pouvez avoir d'autres clients devant lui comme des applications natives Android / iPhone;
  • la séparation pourrait rendre plus facile pour les développeurs front-end de faire CSS / HTML sans avoir besoin d'avoir une application serveur en cours d'exécution sur leur machine.

Donc, la chose est qu'il y a des avantages et des inconvénients aux deux approches (pages SPA vs pages serveur). Passez un peu de temps à rechercher les deux options, puis choisissez en fonction de votre situation.

Bogdan
la source
11
"la sécurité est plus difficile à faire lorsque tout le code est sur le client;" ehm, ce n'est pas un gros avantage au contraire, la sécurité est plus facile à faire, car c'est une couche très claire que vous devez protéger, qui est conçue de manière logique et facile à comprendre.
David Mulder
3
@DavidMulder: avec la couche claire, la sécurité est plus difficile à faire, mais plus facile à faire correctement. Sans division claire, vous pouvez concocter quelque chose de plausible mais de mal en un rien de temps ;-)
Steve Jessop
1

La réponse à votre question est simple. Oui. Ce que vous proposez, c'est une bonne approche. Mais alors, ce que je pense que vous voulez demander, c'est si c'est une meilleure approche, et malheureusement, aucun de nous ne peut y répondre pour vous. Les facteurs impliqués couvrent trop de facettes. Sans divulguer tout sur votre organisation et les exigences du produit, aucune conclusion réelle ne peut être tirée. Je pense que vous savez déjà quoi faire de toute façon.

samazi
la source
0

Normal avec des mises en garde.

les frameworks javascript frontaux sont limités dans ce qu'ils peuvent faire. Si vous créez des API brutes à utiliser par plusieurs applications, elles nécessitent généralement un certain traitement côté serveur des appels d'API bruts dans les modèles de vue qui fonctionnent avec cette application particulière.

Par conséquent, une architecture «normale» pourrait être:

database
business logic services (dll)
api exposing business logic
server side website exposing viewmodels and functionality via json rest endpoints
client side javascript implementing ui

Maintenant, si vous ne disposez que d'une seule application Web, vous pouvez couper la couche «API exposant la logique métier» et demander au code Web côté serveur d'appeler directement la logique métier.

Parce que vous avez séparé la logique métier dans sa propre bibliothèque, elle est toujours découplée de la logique d'interface utilisateur et vous pouvez toujours ajouter une couche de service plus tard.

De même, comme le service api est appelé par le code côté serveur, vous n'êtes pas limité par la communication http. (bien que ce soit à peu près universel maintenant)

De plus, le fait que javascript appelle le même hôte à partir duquel il est servi signifie que vous n'avez pas à vous promener avec des cors

Ewan
la source