Seit Go 1.22 bietet die Standardbibliothek bessere Unterstützung für Routing
- Früher musste Routing manuell behandelt werden, jetzt lässt es sich mit
mux.HandleFunc einfach umsetzen
- Durch das Hinzufügen einer Login-Middleware kann die Sicherheit verbessert werden
Wichtiger Hinweis zum eingebauten Router: Weiterleitungen durch abschließenden Slash
- Wenn der Pfad
/records/ angelegt wird, wird eine Anfrage an /records auf /records/ umgeleitet
- Dadurch kann der Request-Body einer POST-Anfrage verloren gehen und die Anfrage in eine GET-Anfrage umgewandelt werden
- Die Lösung ist, API-Endpunkte wie
POST /records statt POST /records/ zu verwenden
Automatische Generierung von Datenbank-Abfragecode mit sqlc
- Das Tool sqlc wurde entdeckt, mit dem sich SQL-Abfragen schreiben lassen, ohne ein ORM lernen zu müssen
- Geschriebene SQL-Abfragen werden automatisch in Go-Code umgewandelt
- So lassen sich benötigte SQL-Abfragen einfach schreiben, ohne in der Dokumentation eines ORM nachschlagen zu müssen
Tipps zur Optimierung von sqlite
- Für die Datenbank ein Schreibobjekt verwenden und
db.SetMaxOpenConns(1) setzen
- Um die Lesegeschwindigkeit zu erhöhen, separate DB-Objekte für Schreiben und Lesen verwenden
- Zwei Tabellen, die keinen JOIN benötigen, können in getrennte Datenbanken gelegt und unabhängig verbunden werden
Konfiguration des GC-Speicherlimits in Go 1.19
- Wenn alle Go-Projekte auf VMs mit relativ wenig Speicher wie 256 MB oder 512 MB ausgeführt wurden, trat das Problem auf, dass Anwendungen immer wieder durch OOM beendet wurden
- Aufgrund der Standardkonfiguration des Garbage Collectors darf Speicher bis zum Doppelten der aktuellen Heap-Größe zugewiesen werden
- In Go 1.19 wurde eine Möglichkeit hinzugefügt, die Anwendung anzuweisen, den GC auszuführen, sobald ein bestimmter Speicherverbrauch erreicht ist
- Nachdem das GC-Speicherlimit auf 250 MB gesetzt wurde, traten OOM-Abbrüche seltener auf
export GOMEMLIMIT=250MiB
Warum Websites mit Go bauen
- Deployment ist mit einer einzelnen statischen Binärdatei einfach
- Es gibt einen eingebauten Webserver, der produktionsreif ist, sodass kein WSGI oder Ähnliches konfiguriert werden muss
- Die Toolchain von Go ist einfach zu installieren und zu verwenden
- Das Senden von HTTP-Antworten ist unkompliziert, was die Wartung von Projekten erleichtert
- Da
net/http in der Standardbibliothek enthalten ist, lassen sich Websites ohne zusätzliche Bibliotheken erstellen
- Auch systemnahe Aufgaben lassen sich leicht erledigen
- Alles wirkt so, als wäre es darauf ausgelegt, Projekte einfach handhabbar zu machen
Noch ungelöste Probleme
- Dinge, die in Go noch nicht viel ausprobiert wurden
- Rendern von HTML-Templates
- Implementierung eines echten Login-Systems
- Implementierung von CSRF
- Generell werden Projekte, die Login/CSRF usw. benötigen, nicht begonnen, weil unklar ist, wie sich sicherheitskritische Funktionen richtig umsetzen lassen
Es ist spannend, neue Go-Features zu sehen
- Die beiden in diesem Text erwähnten Go-Features (
GOMEMLIMIT und Routing) wurden in den letzten Jahren neu hinzugefügt
- Wahrscheinlich sollte den Release Notes neuer Go-Versionen mehr Aufmerksamkeit geschenkt werden
2 Kommentare
sqlc ist wirklich großartig.
Hacker-News-Kommentare
embednicht erwähnt wurde.Contexthinzuzufügen, damit sie abgebrochen werden kann.sqlchat einige wichtige Einschränkungen und kleinere Unannehmlichkeiten, daher sollte man vor der Nutzung die Liste der Issues prüfen.GOMAXPROCSpassend gesetzt werden, um CPU-Throttling zu vermeiden.GOMEMLIMITmuss man sich weniger Sorgen um die GC machen.html/templateist seltsam und hat viele Probleme, daher sollte man es besser nicht verwenden.Templbevorzugt.muxgewöhnt, hatte aber die Funktionen der neueren Releases nicht beachtet.nil-Problem werden selbst einfache Aufgaben kompliziert.BEGIN CONCURRENTlässt sich die Parallelität verbessern.