Sie sind hier
E-Book

RESTful Go APIs

Design und Implementierung leichtgewichtiger Hypermedia Services

AutorRalf Wirdemann
VerlagCarl Hanser Fachbuchverlag
Erscheinungsjahr2019
Seitenanzahl194 Seiten
ISBN9783446459786
FormatPDF/ePUB
KopierschutzWasserzeichen/DRM
GerätePC/MAC/eReader/Tablet
Preis34,99 EUR
RESTFUL GO APIS //
- Go und REST kompakt - alle wesentlichen Konstrukte der Programmiersprache Go und der Prinzipien von REST werden anschaulich und praxisnah erklärt.
- Lernen Sie anhand eines durchgängigen Beispiels, wie die Entwicklung von RESTAPIs in Go funktioniert.
- Erfahren Sie, wie die entwickelte API mit Hilfe hexagonaler Architekturprinzipien refaktorisiert und testbar gemacht wird.
- Lernen Sie, wie die entwickelte API zu einer Hypermedia API wird und damit zu einer »echten« REST API.
- Erlernen Sie die Grundlagen der Absicherung und Skalierung von APIs in Go und bereiten Sie API so für den Produktivbetrieb vor.
Alle bauen APIs. Grob geschätzt bestehen 80% der heute entwickelten Anwendungen im Kern aus einer oder mehreren serverseitigen Komponenten, die Geschäftslogik kapseln und diese ihren Clients über eine RESTful API zur Verfügung stellen. Ist das REST-Paradigma einmal verstanden, dann sind REST-APIs klar und einfach zu benutzen.
Go ist eine einfache, kompilierte und hoch performante Programmiersprache, die sich hervorragend für die Entwicklung von REST-APIs eignet. Eigenschaften, wie leichte Erlernbarkeit, ein simples und leistungsfähiges Concurrency-Modell, sehr guter HTTP-,REST- und JSON-Support, Cross-Plattform Fähigkeit, einfaches Deployment sowie hoch performante Binaries zeichnen Go aus.
Dieses Buch richtet sich an serverseitige Web-Entwickler und führt die wesentlichen Aspekte der REST-Entwicklung in Go anhand eines zunächst einfachen und im Verlauf des Buches komplexer werdenden Beispiels ein. Nach der Lektüre ist der Leser in der Lage, produktionsreife REST-APIs in Go zu entwickeln, zu deployen und zu betreiben.
Die Wahl des Namens 'APIs' statt 'Microservices' ist Absicht, um sich erstens vom gegenwärtigen Hype um Microservices abzusetzen und zweitens auch das große Feld monolithischer Anwendungen mit einzubeziehen.
Das Buch gliedert sich in drei Teile, von denen Teil 1 und 2 unverzichtbar sind. Teil 3 hat offenen Charakter und kann im Verlauf der Entstehung wachsen oder sich verkleinern.

Ralf Wirdemann ist erfahrener Software-Coach mit dem Schwerpunkt agile Softwareentwicklung. Er hat Scrum bereits in einer Reihe von Projekten eingeführt. Er ist Autor zahlreicher Fachartikel und gefragter Sprecher auf Konferenzen.

Kaufen Sie hier:

Horizontale Tabs

Leseprobe
2Go

Go ist eine schlanke Programmiersprache und kommt mit 25 Keywords aus. Go ist weder ausdrücklich funktional noch ausdrücklich objektorientiert. Dennoch lassen sich beide Paradigmen in Go umsetzen. Dieses Kapitel führt in die Grundlagen der Programmiersprache Go ein.

Das Kapitel beginnt mit der Installation einer Go-Entwicklungsumgebung und der Beschreibung des Go-Workspace. Anschließend werden die Basiskonstrukte von Go beschrieben: Packages strukturieren Go-Dateien auf oberster Ebene und definieren die Sichtbarkeit enthaltener Elemente. Funktionen implementieren Programmlogik mithilfe von Schleifen, Bedingungen und Variablen. Typen stehen entweder in Form von Standard- oder benutzerdefinierten Typen zur Verfügung.

Nach Einführung dieser grundlegenden und aus anderen Programmiersprachen bekannten Sprachkonstrukte fährt das Kapitel mit den Besonderheiten von Go fort: Pointer, Interfaces und Methoden. Pointer ermöglichen die explizite Unterscheidung von Werte- und Referenztypen. Interfaces trennen Schnittstelle und Implementierung von Typen. Methoden implementieren Funktionen auf benutzerdefinierten Typen, die auf Instanzen des jeweiligen Typs gebunden werden.

Im letzten Abschnitt werden mit Arrays und Maps zwei der neben den Standardtypen wichtigsten Go-Typen beschrieben. Arrays implementieren typisierte Listen fester Länge. Maps dienen der Verwaltung typisierter Key-/Value-Paare.

2.1Installation

Go-Distributionen stehen zum Binär-Download für MacOS, Windows und Linux unter https://golang.org/dl/ bereit. Unter MacOS wird die Go-Distribution nach /usr/local/go installiert. Damit die Go-Tools im Terminal funktionieren, muss die PATH-Variable um den Pfad /usr/local/go/bin erweitert werden. Führen Sie das Go-Tool in einem neuen Terminalfenster mit dem Parameter version aus:

$ go version go version go1.11 darwin/amd64

Entspricht die Ausgabe dem Beispiel, dann hat alles funktioniert, und die Go-Entwicklungsumgebung steht bereit. Weitere Installationshinweise sowie Anleitungen für die Go-Installation unter Windows und Linux finden Sie hier https://golang.org/doc/install.

2.2Der Go-Workspace

Das grundlegende Konzept einer Go-Entwicklungsumgebung ist der Go-Workspace. Der Go-Workspace ist ein zentrales Verzeichnis, das über die Umgebungsvariable GOPATH referenziert wird. Unterhalb des GOPATH finden sich die drei Unterverzeichnisse bin, pkg und src:

bin/ restvoice pkg/ linux_amd64/ github.com/rwirdemann/restvoice/ usecase.a src/ github.com/rwirdemann/restvoice/ main.go usecase/ create_invoice.go

Go-Programmewerden compiliert und zu einem statischen Binary gelinkt. Die resultierende Binärdatei landet im Verzeichnis bin des Go-Workspace. Zusammengehörige Dateien, sogenannte Packages, werden zu einer package. a-Datei übersetzt und in eines der plattformspezifischen Unterverzeichnisse von pkg abgelegt. Das Unterverzeichnis src enthält die Dateien mit den Go-Sourcen, geordnet in Unterverzeichnisse, die die Package-Struktur widerspiegeln.

Die zugrunde liegende Idee des Go-Workspace ist, dass alle Projekte inklusive der benötigten Abhängigkeiten an zentraler Stelle abgelegt werden. Projekte werden schnell gefunden und können sich benötigte Bibliotheken teilen. Die Nutzung mehrerer Workspaces ist durch die Verwendung der Umgebungsvariable GOPATH einfach möglich.

Der Go-Workspace ist prinzipiell eine gute Idee, birgt aber auch eine Reihe praktischer Probleme. So ist es nicht ohne Weiteres möglich, unterschiedliche Versionen eines Packages im selben Workspace zu verwalten. Es ist auch nicht möglich, eine Bibliothek zu veröffentlichen, die eine bestimmte Version einer abhängigen Bibliothek benötigt.

Mit Version 1.5 wurde Go um eine Dependency-Management-Technik, das sogenannte Vendoring erweitert. Mit Vendoring kann man einem Projekt weitere Abhängigkeiten aus einem projektlokalen vendor-Verzeichnis zufügen. Seit Go-Version 1.11 steht mit Go Modules eine Ablösung des Vendoring ins Haus. Die Beispiele in diesem Buch funktionieren GOPATH-basiert. Die Beschäftigung mit Vendoring oder besser Go Modules ist an dieser Stelle nicht erforderlich. Spätestens wenn es in die Praxis geht, müssen Sie sich mit dem Thema Dependency Management beschäftigen. Das Go-Wiki enthält eine gute Einführung zur Funktionsweise und Benutzung von Go Modules [ The18].

2.3Test der Installation

Erstellen Sie den Go-Workspace mit den drei Unterverzeichnissen bin, pkg und src und exportieren Sie dessen Verzeichnis in der Umgebungsvariable GOPATH:

$ cd $HOME $ mkdir -p go/bin go/pkg go/src $ export GOPATH=$HOME/go

Anschließend wird im Verzeichnis src eine Datei main.go mit folgendem Inhalt erstellt:

1 package main 2 3 func main() { 4 println("Hello, Jo") 5 }

Die Funktion main im Package main ist der Einstiegspunkt in ein Go-Programm und wird beim Start des Programms ausgeführt. Das Kommando go run compiliert und führt das Programm aus:

$ cd $GOPATH/src $ go run main Hello, Jo

Das Kommandozeilentool go ist das zentrale Werkzeug einer Go-Distribution. Entsprechend parametrisiert lassen sich damit alle wichtigen Entwicklungsaufgaben ausführen. Einige Beispiele:

go build main.go # Übersetzt und legt das Binary im aktuellen Verzeichnis ab go install main.go # Übersetzt und legt das Binary im Verzeichnis "bin" ab go test # Führt die Tests im aktuellen Package aus

Ein vollständige Dokumentation der Go-Tools finden Sie unter https://golang.org/cmd/go.

2.4Programmstruktur

Go-Quellcode ist auf Dateien mit dem Suffix .go verteilt. Die Struktur einer Go-Datei wird auf oberster Ebene durch sechs Keywords bestimmt:

package import var const type func

Das erste Statement einer Go-Datei ist immer package, gefolgt von einem oder mehreren import-Statements zum Import referenzierter Packages. Anschließend folgen Variablen- und Konstantendeklarationen sowie Typ- und Funktionsdefinitionen in beliebiger Reihenfolge und Anzahl.

2.5Packages

Go-Files werden in Packages organisiert. Alle Dateien eines Verzeichnisses gehören zum selben Package. Der letzte Teil des Pfadnamens bestimmt den Package-Namen. Gemäß dieser Konvention liegt die Datei memory.go im Verzeichnis $GOPATH/go101/cache und gehört zum Package cache:

1 package cache 2 3 func Write(key string, value string) { 4 ... 5 }

Packages definieren Namensräume. Die Sichtbarkeit von Typen, Funktionen, Variablen und Konstanten wird mithilfe von Groß- und Kleinschreibung definiert. Alles Kleingeschriebene ist ausschließlich innerhalb des Packages sichtbar. Alles Großgeschriebene ist auch außerhalb des Packages sichtbar. Packages werden über das import-Statement importiert. Öffentliche Typen, Variablen und Funktionen werden genutzt, indem der Package-Name dem importierten Element vorangestellt wird:

1 package main 2 3 import "cache" 4 5 func main() { 6 cache.Write("1", "Kalle") 7 }

Die Funktion main importiert das Package cache und ruft die exportierte Funktion cache. Write auf. Das main-Beispiel zeigt eine Ausnahme in Bezug auf die Namenskonvention für Packages: Die Go-Datei mit der Funktion main gehört zum Package main, unabhängig vom Verzeichnis, in dem sie liegt.

Initialisierung


Jede Datei eines Packages kann eine init-Funktion enthalten, in der paketweite Initialisierungsaufgaben ausgeführt werden. Init-Funktionen werden beim Laden eines Packages automatisch ausgeführt:

1 package auth 2 3 var kf []byte 4 5 func init() { 6 if kf, err := ioutil.ReadFile("public.key"); err != nil { 7 log.Fatalf("Could not open public key file: %s", "public.key") 8 } 9 }

Init-Funktionen sind Package-intern und können aus keinem anderen Package heraus aufgerufen werden. Ein anonymer Package-Import sorgt für die Ausführung von init, ohne dass eine öffentliche Funktion des importierten Packages aufgerufen werden muss. Dies ist zum Beispiel dann sinnvoll, wenn eine Bibliothek Initialisierungscode enthält, der nie explizit aufgerufen wird, für das Funktionieren des Programmes aber einmalig ausgeführt werden muss. Das Laden eines Datenbanktreibers ist ein Beispiel:

import _ "github.com/go-sql-driver/mysql"

Der Import...

Blick ins Buch
Inhaltsverzeichnis
Inhalt6
1 Einleitung14
1.1 Alle bauen APIs14
1.2 Web-Frameworks15
1.3 Alle wollen Go15
1.4 Warum REST?16
1.5 Aufbau des Buches17
1.6 Disclaimer17
1.7 Gebrauchsanleitung18
1.8 Code-Beispiele18
2 Go20
2.1 Installation20
2.2 Der Go-Workspace21
2.3 Test der Installation22
2.4 Programmstruktur22
2.5 Packages23
2.6 Funktionen24
2.7 Variablen24
2.8 Typen25
2.9 Schleifen27
2.10 Verzweigungen28
2.11 Methoden30
2.12 Pointer31
2.13 Interfaces32
2.14 Arrays und Slices34
2.14.1 Arrays34
2.14.2 Slices34
2.14.3 Polymorphe Arrays36
2.15 Maps36
2.16 Verzögerungen, Panic und Recover37
2.17 Was sonst noch?39
3 REST40
3.1 Überblick40
3.2 Ressourcen42
3.3 Uniform Ressource Identifier42
3.4 HTTP-Methoden43
3.4.1 GET43
3.4.2 POST44
3.4.3 PUT44
3.4.4 DELETE44
3.4.5 PATCH44
3.4.6 HEAD44
3.4.7 OPTIONS44
3.5 Repräsentationen45
3.6 Statuscodes45
3.6.1 2xx Erfolg46
3.6.2 3xx Umleitung46
3.6.3 4xx Client-Fehler46
3.6.4 5xx Server-Fehler46
3.7 Hypermedia47
3.8 REST als Architekturstil48
3.8.1 Client-Server48
3.8.2 Zustandslosigkeit48
3.8.3 Cacheability49
3.8.4 Uniform Interface49
3.8.5 Layered System49
3.8.6 Code on Demand50
3.9 Zusammenfassung50
4 HTTP und JSON52
4.1 Das Package net/http52
4.1.1 Request Handling52
4.1.2 Level-2-Services56
4.2 Das Package encoding/json58
4.2.1 JSON-Encoding59
4.2.2 JSON-Decoding61
4.3 HTTP und JSON62
4.4 Abschluss63
5 Restvoice64
5.1 Vision64
5.2 Use Cases65
5.3 Domainmodell66
5.4 Ressourcen68
5.5 Kern-Use-Cases68
5.5.1 Rechnung erstellen70
5.5.2 Buchung zufügen73
5.5.3 Buchung löschen76
5.5.4 Rechnung abschließen77
5.5.5 Rechnung zustellen78
5.6 Kritik am Entwurf79
5.6.1 Sicherheit79
5.6.2 Testbarkeit80
5.6.3 Kopplung80
5.6.4 RESTfulness81
5.7 Warum Go?81
5.8 Abschluss82
6 Design84
6.1 Layering85
6.2 Domain-driven Design85
6.3 Hexagonale Architektur86
6.3.1 Beispiel88
6.3.2 Der Use Case ELIZA88
6.3.3 Ports und Adapter89
6.4 Use Case „Rechnung erstellen“90
6.4.1 HTTP Invoice91
6.4.2 Geschäftslogik92
6.4.3 Invoice HTTP93
6.4.4 Bootstrapping93
6.5 Use Case „Tätigkeit buchen“95
6.6 Use Case „Rechnung abschließen“96
6.7 Use Case „Rechnung anfordern“98
6.8 Was haben wir erreicht?99
6.8.1 Entkopplung100
6.8.2 Wartbarkeit100
6.8.3 Testbarkeit101
7 Testing102
7.1 Unit Tests102
7.2 Unit Tests in Go103
7.3 HTTP-Tests in Go105
7.4 Was testen?106
7.5 Beispiel: Rechnung abschließen107
7.5.1 Testszenario108
7.5.2 Method under Test108
7.5.3 Unit Test110
7.5.4 Integrationstest110
7.6 Fake- und Mock-Objekte112
7.6.1 Fake-Objekte112
7.6.2 Mock-Objekte114
7.7 Unit Test mit Fake-Objekt115
7.8 HTTP-Test115
7.9 API-Test116
7.10 Testseparation118
7.10.1 Build Tags: -tags118
7.10.2 Short Modus: -short119
7.10.3 Einzelne Tests ausführen: -run119
7.11 Test Coverage119
7.12 Abschluss121
8 Hypermedia als Motor122
8.1 HATEOAS123
8.2 Hypermedia Rechnungsstellung123
8.2.1 Zustandsübergänge124
8.2.2 Wie sage ich es meinem Client?125
8.3 Hypertext Application Language126
8.4 HAL in Go129
8.4.1 Geschäftslogik129
8.4.2 Media Type „application/hal+json“130
8.5 Hypermedia-Clients132
8.6 Resource Expansion134
8.7 CRUD vs. Hypermedia137
8.8 Abschluss138
9 Sicherheit140
9.1 Client-Authentifizierung140
9.1.1 HTTP Basic141
9.1.2 HTTP Digest145
9.1.3 JSON Web Token147
9.2 Server-Authentifizierung152
9.3 Autorisierung154
9.4 Verschlüsselung156
9.5 Abschluss157
10 Skalierbarkeit160
10.1 Horizontale Skalierung160
10.2 Zustandslosigkeit161
10.2.1 Sitzungsstatus161
10.2.2 Clientstatus161
10.2.3 Ressourcenstatus162
10.3 Restvoice skalieren163
10.4 Vertikale Skalierung163
10.4.1 Go-Routinen164
10.4.2 Restvoice vertikal skalieren164
10.5 Abschluss166
11 Caching168
11.1 Arten von Caches168
11.1.1 Lokaler Cache168
11.1.2 Proxy Cache169
11.1.3 Reverse Proxy Cache169
11.2 HTTP Caching169
11.2.1 GET169
11.2.2 Cachebare Responses169
11.2.3 Cache-Validierung170
11.2.4 Cache-Invalidierung172
11.3 Restvoice Caching172
11.4 Activity Caching172
11.4.1 Cacheable Responses172
11.4.2 Cache-Validierung174
11.4.3 Invalidierung176
11.4.4 Alternative ETags177
11.5 Abschluss177
12 Wie geht es weiter?178
12.1 Danke!178
12.2 Feedback179
Literatur180
Stichwortverzeichnis182

Weitere E-Books zum Thema: Informatik - Algorithmen - Softwaresysteme

Softwaretechnik

E-Book Softwaretechnik
Format: PDF

Software-Projekte geraten oft in Schwierigkeiten: Zeit und Budget werden überschritten; das Projekt tritt auf der Stelle; im schlimmsten Fall wird es ohne Ergebnis abgebrochen. Manche…

Softwaretechnik

E-Book Softwaretechnik
Format: PDF

Software-Projekte geraten oft in Schwierigkeiten: Zeit und Budget werden überschritten; das Projekt tritt auf der Stelle; im schlimmsten Fall wird es ohne Ergebnis abgebrochen. Manche…

Softwaretechnik

E-Book Softwaretechnik
Format: PDF

Software-Projekte geraten oft in Schwierigkeiten: Zeit und Budget werden überschritten; das Projekt tritt auf der Stelle; im schlimmsten Fall wird es ohne Ergebnis abgebrochen. Manche…

Software Engineering

E-Book Software Engineering
Architektur-Design und Prozessorientierung Format: PDF

Das Lehrbuch behandelt alle Aspekte der Software-Entwicklung, besonders aber Methoden und Richtlinien zur Herstellung großer und qualitativ hochwertiger Softwareprodukte. Es vermittelt das zur…

Software Engineering

E-Book Software Engineering
Architektur-Design und Prozessorientierung Format: PDF

Das Lehrbuch behandelt alle Aspekte der Software-Entwicklung, besonders aber Methoden und Richtlinien zur Herstellung großer und qualitativ hochwertiger Softwareprodukte. Es vermittelt das zur…

Weitere Zeitschriften

Bibel für heute

Bibel für heute

BIBEL FÜR HEUTE ist die Bibellese für alle, die die tägliche Routine durchbrechen wollen: Um sich intensiver mit einem Bibeltext zu beschäftigen. Um beim Bibel lesen Einblicke in Gottes ...

crescendo

crescendo

Die Zeitschrift für Blas- und Spielleutemusik in NRW - Informationen aus dem Volksmusikerbund NRW - Berichte aus 23 Kreisverbänden mit über 1000 Blasorchestern, Spielmanns- und Fanfarenzügen - ...

Das Hauseigentum

Das Hauseigentum

Das Hauseigentum. Organ des Landesverbandes Haus & Grund Brandenburg. Speziell für die neuen Bundesländer, mit regionalem Schwerpunkt Brandenburg. Systematische Grundlagenvermittlung, viele ...

DGIP-intern

DGIP-intern

Mitteilungen der Deutschen Gesellschaft für Individualpsychologie e.V. (DGIP) für ihre Mitglieder Die Mitglieder der DGIP erhalten viermal jährlich das Mitteilungsblatt „DGIP-intern“ ...

VideoMarkt

VideoMarkt

VideoMarkt – besser unterhalten. VideoMarkt deckt die gesamte Videobranche ab: Videoverkauf, Videoverleih und digitale Distribution. Das komplette Serviceangebot von VideoMarkt unterstützt die ...