Ist es normal, Backend- und Frontend-Webanwendungen vollständig zu entkoppeln und ihnen die Kommunikation mit der (JSON-) REST-API zu ermöglichen?

21

Ich erstelle eine neue Business-Webanwendung und möchte Folgendes erreichen:

  • Verwenden Sie die besten Technologien aus ihren jeweiligen Bereichen. Ich möchte ein zuverlässiges Backend-Framework mit solidem ORM. Und ich möchte das fortschrittlichste SPA-Framework (Single Page Application) mit den aktuellsten HTML- und Javascript-Funktionen für die Frontend-Anwendung
  • Bereitstellen von Back-End-Entitäten und Business-Services für die Verwendung aus verschiedenen Arten von Anwendungen - z. B. Webanwendungen, Mobilgeräten (Android) und möglicherweise anderen Typen (Smart Devices usw.)

Um beide Anforderungen zu erfüllen, bin ich geneigt, meine Anwendung in Backend- und Frontend-Anwendungen vollständig zu trennen und die Kommunikation zwischen ihnen mithilfe der REST-API (JSON) zu organisieren. Ist das ein vernünftiger Ansatz?

Eine solche Trennung ist keine offensichtliche Designlösung, da viele Webanwendungstechnologien integrierte Ansichtsebenen haben, in denen die serverseitige Anwendung die Generierung der Ansicht mehr oder weniger steuert und die Antworten aus der Ansicht teilweise verarbeitet (z. B. SpringMVC mit Ansichtsebene, PHP Yii mit Ansicht) Java JSF / Facelets speichert den Status ihrer Komponenten vollständig auf dem Server. Es gibt also viele Technologien, die eine stärkere Kopplung vorschlagen und eine schnellere Entwicklungszeit und einen gleichmäßigeren Pfadverlauf versprechen. Also - ich muss vorsichtig sein, wenn ich anfange, Technologien in einer Weise einzusetzen, die nicht weit verbreitet ist.

Soweit ich weiß, ergibt sich dann ein vollständig getrenntes SPA-Frontend normalerweise aus der Notwendigkeit, eine Drittanbieter-API zu verwenden. Aber ist ein solches Sounddesign entkoppelnd, wenn sowohl das Backend als auch das Frontend von einer Firma entwickelt werden?

Meine Wahl der Technologien ist derzeit Java / Spring-Backend und Angular2 / Web Components / Polymer für Frontend - wenn ich das sagen darf. Aber das ist für diese Frage irrelevant, weil es sich bei dieser Frage um allgemeine Gestaltung und nicht um die Wahl konkreter Technologien handelt?

An Herrn
quelle
8
(1). Ja. Es ist normal, dass wir noch ein paar Tage Zeit haben.
Laiv
5
(2). So - I must be cautious when starting to use technologies in manner which is not widely used.Ja, Sie müssen vorsichtig sein, wenn Sie vorhaben, Seide mit einem Hammer zu pechen. Vielleicht ist es nicht das richtige Werkzeug.
Laiv
3
Beachten Sie, dass eine solche rigorose Entkopplung erhebliche Entwicklungskosten im Voraus verursacht. Sie müssen einen konkreten Nutzen daraus ziehen.
USR
2
Beachten Sie auch, dass Sie Ihre Domain niemals direkt dem Browser aussetzen können. Dies führt zu Sicherheitsproblemen und die Daten werden nicht für die Anzeige geeignet formatiert. Sie müssen eine REST-Schnittstelle (Special Purpose) erstellen, damit JavaScript aufgerufen werden kann. Und das ist gekoppelt.
USR
1
Spring hat die Annotationen PathVariable, ResponseBody, RequestBody und RestController (Sie sollten sie auschecken). Sie machen die Entwicklung von Ajax-basierten JSON / REST-Webanwendungen sehr, sehr einfach, was Spring zu einem großartigen Backend für SPA macht. Ich bin der festen Überzeugung, dass die Trennung von Frontend und Backend die bessere Wahl ist: Die klassischen JSF-Anwendungen, mit denen ich das "Vergnügen" hatte, zu arbeiten, waren ein Chaos.
Traubenfuchs

Antworten:

14

Ist es normal, Backend- und Frontend-Webanwendungen vollständig zu entkoppeln und ihnen die Kommunikation mit der (JSON-) REST-API zu ermöglichen?

Ja es ist normal Dies ist jedoch nur dann normal, wenn Sie diese Art der Trennung benötigen und dieses Setup nicht in Ihrer gesamten Anwendung erzwingen.

Ein SPA bringt einige Probleme mit sich. Hier sind nur einige, die mir gerade in den Sinn kommen:

  • Es ist hauptsächlich JavaScript. Ein Fehler in einem Abschnitt Ihrer Anwendung kann dazu führen, dass andere Abschnitte der Anwendung aufgrund dieses Javascript-Fehlers nicht mehr funktionieren. Mit den vom Server gelieferten Seiten (SpringMVC, PHP usw.) laden Sie einen neuen Abschnitt.
  • CORS . Nicht zwingend erforderlich, aber häufig befindet sich das Back-End auf einem anderen Domain-Namen als das Front-End. Jetzt müssen Sie sich also mit Fragen der Browsersicherheit befassen.
  • SEO . Brauchst du das? Ist Ihre Site öffentlich? Google kann Javascript verstehen und versuchen, Ihre Website sinnvoll zu gestalten, aber Sie geben einem Bot im Grunde die Kontrolle und hoffen auf das Beste. Die Rücknahme der Kontrolle kann bedeuten, dass Sie sich auf andere Tools wie PhantomJS verlassen müssen .
  • separate Front-End-Anwendung bedeutet separate Projekte, Bereitstellungs-Pipelines, zusätzliche Tools usw .;
  • Sicherheit ist schwieriger, wenn sich der gesamte Code auf dem Client befindet.

Natürlich gibt es auch SPA-Vorteile:

  • Interagieren Sie vollständig im Front-End mit dem Benutzer und laden Sie die Daten nur nach Bedarf vom Server. So bessere Reaktionsfähigkeit und Benutzererfahrung;
  • Je nach Anwendung bedeutet eine auf dem Client ausgeführte Verarbeitung, dass Sie den Server für diese Berechnungen freigeben.
  • Bessere Flexibilität bei der Entwicklung von Back-End und Front-End (Sie können dies separat tun).
  • Wenn Ihr Back-End im Wesentlichen eine API ist, können Sie andere Clients wie native Android- / iPhone-Anwendungen vor sich haben.
  • Die Trennung erleichtert Front-End-Entwicklern möglicherweise die Ausführung von CSS / HTML, ohne dass eine Serveranwendung auf ihrem Computer ausgeführt werden muss.

Die Sache ist also, dass beide Ansätze Vor- und Nachteile haben (SPA vs. Serverseiten). Nehmen Sie sich etwas Zeit, um beide Optionen zu untersuchen, und wählen Sie sie dann entsprechend Ihrer Situation aus.

Bogdan
quelle
11
"Sicherheit ist schwieriger, wenn sich der gesamte Code auf dem Client befindet." Ähm, das ist kein großer Vorteil, im Gegenteil, Sicherheit ist einfacher, weil es sich um eine sehr klare Schicht handelt, die Sie schützen müssen und die logisch und leicht verständlich gestaltet ist.
David Mulder
3
@DavidMulder: Mit der klaren Ebene ist Sicherheit überhaupt schwieriger, aber einfacher, richtig zu machen. Ohne eine klare Unterteilung können Sie in kürzester Zeit etwas Plausibles, aber Falsches hervorbringen ;-)
Steve Jessop
1

Die Antwort auf Ihre Frage ist einfach. Ja. Was Sie vorschlagen, ist ein vernünftiger Ansatz. Aber ich denke, Sie möchten fragen, ob es ein besserer Ansatz ist, und leider kann keiner von uns dies für Sie beantworten. Die Faktoren umfassen zu viele Facetten, ohne dass sowohl Ihre Organisation als auch die Produktanforderungen offengelegt werden und keine wirklichen Schlussfolgerungen gezogen werden können. Ich denke du weißt sowieso schon was zu tun ist.

samazi
quelle
0

Normal mit Vorbehalten.

Front-End-Javascript-Frameworks sind in ihren Möglichkeiten begrenzt. Wenn Sie RAW-APIs für die Verwendung durch mehrere Anwendungen erstellen, müssen die RAW-API-Aufrufe in der Regel serverseitig verarbeitet werden, um Modelle anzuzeigen, die mit dieser bestimmten Anwendung funktionieren.

Daher könnte eine "normale" Architektur sein:

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

Wenn Sie nur eine Webanwendung haben, können Sie die Ebene "API Exposing Business Logic" ausschneiden und den serverseitigen Webcode die Geschäftslogik direkt aufrufen lassen.

Da Sie die Geschäftslogik in eine eigene Bibliothek unterteilt haben, ist sie immer noch von der Benutzeroberflächenlogik entkoppelt, und Sie können später jederzeit eine Serviceebene hinzufügen.

In ähnlicher Weise ist die HTTP-Kommunikation nicht eingeschränkt, da der API-Dienst vom serverseitigen Code aufgerufen wird. (obwohl das jetzt so ziemlich universell ist)

Wenn Sie das Javascript haben, rufen Sie denselben Host auf, von dem aus es bedient wird, und Sie müssen sich nicht mit cors herumschlagen

Ewan
quelle