Ein typischer Stapel für eine Webanwendung ist eine Datenbank, ein Server mit serverseitigem Code und ein Benutzer mit einem Browser mit HTML / CSS / JavaScript.
Vor umfangreichem AJAX wurde MVC, in dem der Controller der serverseitige Code war, gerullt. Ein Server musste Antwortanfragen für dynamische Webseiten weiterleiten (dh HTML-Lösungen mit Vorlagen wie JSP und ASP). Der Server koordiniert die Aufrufe der Datenbank und entscheidet, welche dynamische Seite zur Beantwortung der Seitenanforderung verwendet wird. Das Ergebnis all dessen ist, dass der Server letztendlich die Geschäftslogik enthielt, obwohl die Geschäftslogik nicht stark an die Idee gebunden ist, Seiten bereitzustellen.
Jetzt, da wir auf "Web 2.0" umsteigen, werden auf einem Server statische Seiten angezeigt, die JavaScript verwenden, um sich selbst zu füllen und die Darstellung zu ändern. Das kann im JavaScript sein. Das JavaScript implementiert häufig einen RESTful-Service, dh es gibt eine Datenbankabfrage an.
Der Server bleibt also den Aufgaben überlassen, die tatsächlichen Dateien bereitzustellen und AJAX-Anrufe zu beantworten. Das Beantworten von AJAX-Anrufen ist lediglich Sitzungsverwaltung und bietet Sicherheit. Und tatsächlich sollte ein Benutzer sogar Daten sehen können, die in der Datenbank angegeben werden sollten.
Sollte der Server von dort aus in die Rolle eines dummen Vermittlers verwiesen werden, der nur gelegentlich so etwas wie das Versenden einer E-Mail oder das Auslösen eines Webservices ausführt? Könnte Geschäftslogik alle in JavaScript leben (wenn es nicht geheim ist) oder in gespeicherten Prozeduren leben, wenn es ist?
Ist es sinnvoll, vielleicht sogar Server und Datenbanken zu kombinieren oder ERP-Lösungen wie SAP als Server zu fungieren?
Hier hast du es falsch verstanden. REST ist nicht CRUD.
Die von REST bereitgestellten Ressourcen sind nicht Ihre Datenbankeinträge. Es handelt sich um vollständig verwaltete Objekte, die sich gemäß Ihrer Geschäftslogik verhalten. Wenn der Server einen POST oder PUT empfängt, sollte er nicht nur validieren und speichern. Es muss alles ausführen, was für die Anwendung geeignet ist.
Einfaches Beispiel: Eine Twitter-ähnliche App empfängt Tweets als POST-Nachrichten auf einem bestimmten Container. Der Server analysiert dann den Kontext ("Wer bist du?", "Welcher Kanal ist das?") Und den Inhalt ("Irgendwelche Hashtags?", Textindizes usw.) und speichert dies alles in den jeweiligen Warteschlangen. Fügt wahrscheinlich einen Verweis direkt auf alle Ihre Follower hinzu.
Das ist eine Menge Arbeit, die über das einfache Hinzufügen der Ressource zum Container hinausgeht. Alles wird durch Ihre Geschäftslogik definiert. Und es gehört auf den Server.
quelle
Meine Bedenken hinsichtlich dieses Ansatzes können auf ein Missverständnis Ihres Designs zurückzuführen sein. Sie können mich also gerne abschießen.
Denken Sie jedoch an die Skalierbarkeit, Wartbarkeit und Sicherheit des Produkts.
Wenn Ihr Produkt massiv wächst, wird die Datenbank zum Engpass. Während "Leistung" vorschlägt, Geschäftslogik in gespeicherte Prozeduren zu integrieren, wird Ihr Datenbankserver zusätzlich mit CPU belastet, was den Tag vorverlegt, an dem der Server die maximale Kapazität erreicht. Im Gegensatz zu Webservern lassen sich ACID-Datenbanken mit paralleler Hardware nicht einfach skalieren. Wenn Ihr Produkt niemals so erfolgreich sein wird, ist dies kein Problem.
Der Gedanke, die Geschäftslogik in Javascript beizubehalten, das auf Webbrowsern ausgeführt wird, in denen verschiedene Browser unterschiedliche Javascriopt, mehrere Browserversionen usw. erfordern. Warum sollte dieses Problem komplizierter sein als es bereits ist?
Wie Javiar bereits sagte, ist die Verwendung eines REST-Ansatzes als Datenbank-API für Ihr Produkt wirklich nicht sinnvoll. Ein Vorteil einer REST-Schnittstelle besteht darin, dass andere Personen dann über verschiedene Möglichkeiten nachdenken, Ihre REST-Schnittstelle zu verwenden und abzufragen. Dies sind jedoch öffentliche Post-Business-Logikressourcen und keine Ressourcen für Tabellendatensätze auf niedriger Ebene. Der Gedanke, solche Datenabfragen auf niedriger Ebene über die HTTP-API verfügbar zu machen, klingt nach einem Sicherheitsalptraum.
quelle
Zwar gibt es viele Denkschulen, und sicherlich kann kein Weg allgemein als "der richtige Weg" bezeichnet werden, während alle anderen allgemein als "der falsche Weg" bezeichnet werden. Es gibt jedoch eine Reihe von Gründen, die Geschäftslogik auf der Serverseite zu isolieren und Zugriff auf diese Objekte und Dienste über einen RESTful-Dienst.
Die kurze Antwort lautet, dass es hauptsächlich um Risikomanagement sowie Leistungsüberwachung und -verbesserung geht.
Im Detail:
Der Hauptgrund Nummer 1 ist die Sicherheit. Den Kunden sollte niemals vertraut werden, dass sie etwas anderes als Müll an den Server senden. Wenn Sie die Sicherheitsaspekte auf der Serverseite beibehalten, können Sie das potenzielle Risiko eines betrügerischen Benutzers, der Ihr System beschädigt, eingrenzen. Denken Sie daran, dass Javascript vollständig clientseitig und trivial veränderbar ist, sodass Sie dem Ergebnis nicht vertrauen können.
Der Hauptgrund Nummer 2 ist die Trennung von Bedenken. Ihr Javascript-Programmierer ist möglicherweise kein Experte für Sicherheit, und Ihr Sicherheitsguru ist möglicherweise nicht so gut in Javascript. Indem Sie die Geschäftslogik von der Präsentationslogik isolieren, vermeiden Sie, diese Bedenken zu überschreiten, da das Javascript nicht auf Ressourcen zugreifen darf, die über seine Berechtigungsstufen hinausgehen, und Fehler erhalten, deren Behandlung im Rahmen des Skriptprogrammierers liegt. Ebenso wird der Sicherheitsmann kein Javascript debuggen, um zu sehen, wie die Sicherheit aufrechterhalten wird.
Der Grund Nummer 3 ist die Leistung. Geschäftslogik kann möglicherweise Server- und Datenbankressourcen beanspruchen. Indem Sie diese Logik von Ihren UI-Elementen isoliert halten, können Sie nur diesen Teil Ihrer Anwendung skalieren, wodurch Engpässe viel einfacher behoben werden können. Darüber hinaus ist es viel einfacher zu isolieren, welcher Geschäftsprozess Ihr System- oder Datenbank-Backend lädt, wenn die Geschäftsprozesse auf dem Server ausgeführt werden.
Eine Folge davon ist, dass häufig mehrere Geschäftsprozesse dieselben Daten verwenden. Daher können Sie das Caching auf der Serverseite implementieren, um die Gesamtsystemlast zu reduzieren, die möglicherweise nicht möglich / sicher ist, um clientseitigen Codezugriff zu ermöglichen.
Schließlich würde ich vorschlagen, dass Business Logic wirklich auf dem Server sein muss, um die ACID-Standards aufrechtzuerhalten. Ich erinnere mich, dass ich ein Abrechnungsprodukt gepflegt habe, das im Webbrowser ausgeführt wurde und nur eine Datenbankverbindung zum Server hatte. Wenn die tägliche Abrechnung (die an einem guten Tag eine Stunde oder länger dauern kann!) Unterbrochen wurde, z. B. weil der Browser geschlossen wurde oder abstürzte, konnte es mehrere Stunden dauern, bis das Chaos in der verbleibenden Datenbank behoben war in einem inkonsistenten Zustand. Denken Sie daran, dass dies auch Kreditkarten betraf, sodass die Abrechnungsunterlagen auch mit dem Verarbeiter verglichen werden mussten!
Die serverseitige Geschäftslogik ist meistens trivial, um ACID-Aktualisierungen sicherzustellen, da es Frameworks für jede Sprache gibt, um Transaktionen entweder auf Anwendungs- oder Datenbankebene zu verwalten. Wenn Sie dies über mehrere Updates von einem Webclient tun, erhalten Sie irgendwann einen inkonsistenten Status, der sich wahrscheinlich auf Ihre Anwendung auswirkt.
Während es verlockend sein kann, sich RESTful-Services einfach als eine Möglichkeit für den Zugriff auf die Datenbank vorzustellen, sollten Sie nicht in diese Falle tappen, da dies ein gutes Rezept für eine Katastrophe ist. Das Objektmodell, das Sie über einen RESTful-Service verfügbar machen, kann sich auf Ihre Datenbank beziehen, sollte jedoch Ihre Geschäftslogik wirklich kapseln, anstatt sie nur als CRUD-Engine zu verwenden.
quelle