Einführung in die Microservice-Architektur
Teil 1 von 10
Anpassung von Ewan Valentine Artikeln.
Dies ist eine Serie von zehn Teilen. Ich werde versuchen, einmal im Monat über den Aufbau von Mikrodiensten auf Golang zu schreiben. Ich werde Protobuf und gRPC als Haupttransportprotokoll verwenden.
Der Stapel, den ich verwendet habe: Golang, Mongodb, Grpc, Docker, Google Cloud, Kubernetes, NATS, CircleCI, Terraform und Go-Micro.
Wozu brauche ich das? Da ich lange gebraucht habe, um es herauszufinden und die angesammelten Probleme zu lösen. Ich wollte Ihnen auch mitteilen, was ich über das Erstellen, Testen und Bereitstellen von Microservices on Go und anderen neuen Technologien gelernt habe.
In diesem Teil möchte ich die grundlegenden Konzepte und Technologien für den Aufbau von Microservices zeigen. Schreiben wir eine einfache Implementierung. Das Projekt wird die folgenden Entitäten haben:
- Ladung
- Inventar
- Versuch
- die Benutzer
- die Rollen
- Authentifizierung

Um weiter zu gehen, müssen Sie Golang und die erforderlichen Bibliotheken installieren und ein Git-Repository erstellen.
Theorie
Was ist Microservice-Architektur?
Microservices isolieren eine separate Funktionalität in einen Dienst, die hinsichtlich der von diesem Dienst ausgeführten Funktion autark ist. Zur Kompatibilität mit anderen Diensten verfügt es über eine bekannte und vordefinierte Schnittstelle.
Microservices kommunizieren miteinander über Nachrichten, die über einen zwischengeschalteten Nachrichtenbroker übertragen werden.

Dank der Microservice-Architektur kann die Anwendung nicht ganz, sondern teilweise skaliert werden. Wenn der Autorisierungsdienst beispielsweise häufiger als andere zuckt, können wir die Anzahl der Instanzen erhöhen. Dieses Konzept steht im Einklang mit den Konzepten des Cloud Computing und der Containerisierung im Allgemeinen.
Warum Golang?
Microservices werden in fast allen Sprachen unterstützt, schließlich sind Microservices ein Konzept, keine bestimmte Struktur oder ein bestimmtes Werkzeug. Einige Sprachen sind jedoch besser geeignet und unterstützen darüber hinaus Microservices besser als andere. Eine Sprache mit großer Unterstützung ist Golang.
Treffen Sie protobuf / gRPC
Wie bereits erwähnt, sind Microservices in separate Codebasen unterteilt. Eines der wichtigsten Probleme bei Microservices ist die Kommunikation. Wenn Sie einen Monolithen haben, können Sie den Code einfach direkt von einer anderen Stelle in Ihrem Programm aus aufrufen.
Um das Kommunikationsproblem zu lösen, können wir den traditionellen REST-Ansatz verwenden und Daten im JSON- oder XML-Format über HTTP übertragen. Dieser Ansatz hat jedoch die Nachteile, dass Sie vor dem Senden einer Nachricht Ihre Daten verschlüsseln und auf der Empfangsseite wieder entschlüsseln müssen. Dies ist ein Overhead und erhöht die Komplexität des Codes.
Es gibt eine Lösung! Dies ist das gRPC- Protokoll - ein leichtes, binärbasiertes Protokoll, das die Übertragung von HTTP-Headern eliminiert und uns einige Bytes spart. Zukünftiges HTTP2 impliziert auch die Verwendung von Binärdaten, was wiederum für gRPC spricht. HTTP2 ermöglicht bidirektionale Kommunikation und es ist fantastisch!
Mit GRPC können Sie auch die Schnittstelle zu Ihrem Dienst in einem benutzerfreundlichen Format definieren - dies ist> protobuf .
Übe
Erstellen Sie die Datei /project/consigment.proto.
Offizielle Protobuf-Dokumentation
consigment.proto//consigment.proto syntax = "proto3"; package go.micro.srv.consignment; service ShippingService { rpc CreateConsignment(Consignment) returns (Response) {} } message Consignment { string id = 1; string description = 2; int32 weight = 3; repeated Container containers = 4; string vessel_id = 5; } message Container { string id = 1; string customer_id = 2; string origin = 3; string user_id = 4; } message Response { bool created = 1; Consignment consignment = 2; }
Dies ist ein einfaches Beispiel, das den Dienst enthält, den Sie für andere Dienste bereitstellen möchten: Dienst ShippingService. Anschließend definieren wir unsere Nachrichten. Protobuf ist ein statisch typisiertes Protokoll, und wir können benutzerdefinierte Typen erstellen (ähnlich wie Strukturen in Golang). Hier ist der Container im Stapel verschachtelt.
Installieren Sie die Bibliotheken, den Compiler und kompilieren Sie unser Protokoll:
$ go get -u google.golang.org/grpc $ go get -u github.com/golang/protobuf/protoc-gen-go $ sudo apt install protobuf-compiler $ mkdir consignment && cd consignment $ protoc -I=. --go_out=plugins=grpc:. consignment.proto
Die Ausgabe sollte eine Datei sein:
consignment.pb.go
Wenn ja, dann ist etwas schief gelaufen. Achten Sie auf die Argumente -I ist der Pfad, in dem der Compiler nach Dateien sucht, --go_out, in dem eine neue Datei erstellt wird. Es gibt immer Hilfe
$ protoc -h
Dies ist der Code, der automatisch von den gRPC / protobuf-Bibliotheken generiert wird, damit Sie Ihre protobuf-Definition mit Ihrem eigenen Code verknüpfen können.
Wir werden main.go schreiben
main.go package seaport import ( "log" "net"
Bitte lesen Sie die Kommentare im Code sorgfältig durch. Anscheinend erstellen wir hier eine Implementierungslogik, in der unsere gRPC-Methoden unter Verwendung der generierten Formate interagieren und einen neuen gRPC-Server auf Port 50051 erstellen. Jetzt wird unser gRPC-Dienst dort leben.
Sie können dies mit $ go run main.go ausführen , aber Sie sehen nichts und können es nicht verwenden ... Erstellen wir also einen Client, um es in Aktion zu sehen.
Erstellen wir eine Befehlszeilenschnittstelle, die eine JSON-Datei verwendet und mit unserem gRPC-Dienst interagiert.
Erstellen Sie im Stammverzeichnis ein neues Unterverzeichnis von $ mkdir consignment-cli . Erstellen Sie in diesem Verzeichnis eine cli.go-Datei mit folgendem Inhalt:
cli.go package main import ( "encoding/json" "io/ioutil" "log" "os" pbf "seaport/consignment" "golang.org/x/net/context" "google.golang.org/grpc" ) const ( address = "localhost:50051" defaultFilename = "consignment.json" )
Erstellen Sie nun einen Stapel (consignment-cli / consignment.json):
{ "description": " ", "weight": 100, "containers": [ { "customer_id": "_001", "user_id": "_001", "origin": " " } ], "vessel_id": "_001" }
Wenn Sie nun $ go ausführen, führen Sie main.go aus dem Seehafenpaket aus und führen Sie dann $ go run cli.go in einem separaten Terminalfenster aus. Sie sollten die Meldung "Erstellt: wahr" sehen.
Aber wie können wir überprüfen, was genau erstellt wurde? Lassen Sie uns unseren Service mithilfe der GetConsignments-Methode aktualisieren, damit wir alle von uns erstellten Stapel anzeigen können.
Also haben wir hier eine neue Methode für unseren Service namens GetConsignments erstellt. Außerdem haben wir eine neue GetRequest erstellt , die noch nichts enthält. Wir haben unserer Antwortnachricht auch ein Feld mit gesendeten Stapeln hinzugefügt. Sie werden feststellen, dass der Typ hier das wiederholte Schlüsselwort bis zum Typ hat. Wie Sie wahrscheinlich vermutet haben, bedeutet dies einfach, dieses Feld als Array dieser Typen zu behandeln.
Beeilen Sie sich nicht, um das Programm auszuführen. Die Implementierung unserer gRPC-Methoden basiert auf der Übereinstimmung der von der protobuf-Bibliothek erstellten Schnittstelle. Wir müssen sicherstellen, dass unsere Implementierung unserer Protodefinition entspricht.
Hier haben wir unsere neue GetConsignments-Methode aufgenommen, unser Repository und unsere Schnittstelle aktualisiert und jeweils in der Definition von consignments.proto erstellt. Wenn Sie $ go run main.go erneut ausführen , sollte das Programm erneut funktionieren.
Lassen Sie uns unser CLI-Tool aktualisieren, um die Möglichkeit zu bieten, diese Methode aufzurufen, und es ist möglich, unsere Parteien aufzulisten:
cli.go package main import ( "encoding/json" "io/ioutil" "log" "os" pbf "seaport/consignment" "golang.org/x/net/context" "google.golang.org/grpc" ) const ( address = "localhost:50051" defaultFilename = "consignment.json" )
Fügen Sie den obigen Code zu cli.go hinzu und führen Sie $ go run cli.go erneut aus . Der Client führt CreateConsignment aus und ruft dann GetConsignments auf. Und Sie sollten sehen, dass in der Antwortliste die Zusammensetzung der Partei enthält.
Somit haben wir den ersten Microservice und Client, der mit Protobuf und gRPC mit ihm interagiert.
Der nächste Teil dieser Reihe wird die Go-Micro-Integration beinhalten, die eine leistungsstarke Grundlage für die Erstellung von gRPC-basierten Microservices darstellt. Wir werden auch unseren zweiten Service erstellen. Betrachten Sie die Arbeit unserer Dienste in Docker-Containern im nächsten Teil dieser Artikelserie.