Komponenten einer Go Web Applikation

Datenfluss in einer Go Web-Applikation

  • Multiplexer leitet den Request als Aufruf an den passenden Handler weiter
  • Handler ist eine Go Function, die die Request Parameter verarbeitet und Daten für die Template Engine bereit stellt
  • Template Engine setzt die Daten in Platzhalter in einem Template ein und liefert einen Text zurück (meist eine HTML Seite)
  • Template ist eine Schablone zur Generierung von (HTML-) Text
Go Web-App Komponenten
Go Web-App Komponenten

Datenmodell in einer Go Web-Applikation

  • Das Datenmodell enthält die für die Applikation wesentlichen Informationen → Business Rules
    • Daten und ihre Beziehungen
    • Konsistenzregeln
    • Zugriffsberechtigungen
  • Die Handler implementieren die Geschäftsprozesse (Use Cases), die mit den Daten arbeiten
  • Die Daten werden in der Regel in einer Datenbank abgelegt
  • Go stellt effiziente Verfahren zur Arbeit mit Datenbanken zur Verfügung
Zugriff aus dem Handler auf das Datenmodell
Zugriff aus dem Handler auf das Datenmodell

Request Filter

  • Ein Request durchläuft in der Regel mehrere Filter, bevor er endgültig bearbeitet wird
    • Filter sind in Go Handler, die den Request bearbeiten und die weitere Behandlung beenden können
  • Wenn der Filter passiert ist, kommt der nächste Handler/Filter an die Reihe
  • Filter entsprechen in einem Schichtenmodell der Applikation verschiedenen Service-Schichten
    • Logging
    • Sitzungsverwaltung
    • Authentifizierung und Autorisierung
    • Cross Site Scripting Schutz
    • usw.

Die grünen durchgezogenen Pfeile in der Grafik zeigen den normalen Fluß der Requestbearbeitung. Filter können den Ablauf abbrechen und einen Fehler-Response zum Multiplexer zurückgeben.

Go Request Filter
Go Request Filter

Komponentenbibliotheken im gostip Beispiel

Im Beispielprojekt dieses Tutorials werden verschiedene open source Komponentenbibliotheken verwendet, die auf der Go Standardbibliothek aufbauen und diese erweitern. Ihre konkrete Anwendung ist ein in wesentlicher Inhalt des Tutorials.

Persistente Speicherung von Applikationsdaten mit GORM
The fantastic ORM library for Golang“ von Jinzhu speichert Go structs in relationale Datenbanken, erzeugt das Datenbankschema aus den Elementen der structs und macht auch sonst das Arbeiten mit der Datenbank einfacher.
Multiplexer, Session Management, CookiesGorilla Web Toolkit Logo
Das Gorilla Web Toolkit stellt zahlreiche Komponenten für Go Webapplikationen zur Verfügung. Im Demoprojekt wird gorilla/mux als Multiplexer, gorilla/sessions für die Sitzungsverwaltung und gorilla/securecookie verwendet.
Verkettung von Request Filtern, CSRF Schutz
Filterketten lassen sich gut mit justinas/alice von Justinas Stankevicius realisieren. Vom gleichen Entwickler wird auch die Bibliothek justinas/nosurf verwendet, um Cross Site Request Forgery Attacken auf die Webapplikation zu verhindern.
Konfiguration
Konfiguratiosdateien werden mit der universellen spf13/viper Bibliothek von Steve Francia eingelesen.

Go Templates für Single Page Applikationen mit jQuery und Bootstrap

Der Einsatz von Go Templates ist recht einfach, wenn jedes Template eine eigenständige dynamische HTML-Seite erzeugt. Aber auch für SPAs kann man sie gut einsetzen. Themen dazu:

Go Templates für jQuery load() Funktion
Die load() Funktion lädt neuen HTML-Inhalt vom Server in ein HTML Tag, z.B. in einen <div></div> Bereich. Dieses HTML lässt sich sehr gut mit einem Go Template erzeugen. Die dynamische Anpassung an die aktuellen Daten kann damit auf Server-Seite über das Template realisiert werden, die JavaScript Programmierung wird deutlich reduziert.
Function Maps
In Go Templates können selbst definierte Funktionen verwendet werden. Damit kann die recht eingeschränkte Parametrisierung von Templates für viele Anwendungsfälle wesentlich erweitert werden. Die Dokumentation von Function Maps ist allerdings etwas spärlich. Daher werden einige Beispiele vorgestellt.
Wiederverwendung von Template Dialogelementen
In Formularen kommen ähnliche Eingabeelemente in großer Zahl vor. Dafür kann man kleine, parametrisierte Templates schreiben, die den Seitenquellcode stark reduzieren und die Copy/Paste Redundanz im Code vermeiden.