[JAVA] Ich überlegte, wie ich es serverlos machen und gleichzeitig die Lieferantenbindung vermeiden könnte

Dies ist der Artikel zum 19. Tag des Serverless Architecture Advent Calendar 2016.

Während eine Konfiguration ohne serverlose Architektur wahrscheinlich betriebliche Kostenvorteile bietet, hängt sie für eine einfache Fahrt stark von einem bestimmten Cloud-Anbieter ab. Wenn möglich, würde ich gerne sehen, ob das API-Gateway oder Lambda von AWS den Dienst plötzlich beendet. Ausgehend von der Definition von Swagger habe ich daher ein Tool namens Swagger Code Builder erstellt, damit es mit mehreren Arten von Konfigurationen betrieben werden kann.

Es ähnelt Swagger CodeGen, aber die Struktur des Projekts ist sehr unterschiedlich, daher swagger-parser Ich habe versucht, es neu zu erstellen, indem ich nur API / Swagger-Parser umgeleitet habe.

Gezielte Komposition

Normale Konfiguration

\o/         +-----+   +-----------+
 | -------->|Nginx|-->|File System|
/ \         +-----+   +-----------+
User           |
               |
               |
               |  +---------------+   +----+   +-----+
               +->|Spark Framework|-->|Java|-->|MySQL|
                  +---------------+   +----+   +-----+

Das Spark Framework (http://sparkjava.com/) ist ein Java-Mikroframework, das Sinatra in Ruby und Flask in Python ähnelt. Spring Boot war in Ordnung, aber ich entschied mich für den, der leichter schien (ich werde es später erklären, aber es könnte ein Fehler gewesen sein). Informationen zur Verwendung von Spark Framework finden Sie auch in Frühere Artikel.

Serverlose Konfiguration

\o/         +----------+   +--+
 | -------->|CloudFront|-->|S3|
/ \         +----------+   +--+
User              |
                  v
            +-----------+   +------+   +---------+
            |API Gateway|-->|Lambda|-->|Dynamo DB|
            +-----------+   +------+   +---------+

Ich denke, es gibt verschiedene Möglichkeiten, Cognito für die Authentifizierung zu verwenden, aber ich werde mich einmal auf diese Konfiguration konzentrieren. Obwohl es Lambda ist, liegt Java daran, dass es in der heutigen Firma viele Leute gibt, die Java verwenden können. Wenn Sie mehr JavaScript verwenden, scheinen node.js und Express besser zu sein. Persönlich bevorzuge ich Python und Flask, aber in diesem Bereich scheint es etwas zu geben, das Zappa heißt. Es unterscheidet sich vom gemunkelten Serverless Framework darin, dass es kompatibel sein soll.

Strategie

Controller-Schicht

Generieren Sie automatisch Code für jede Konfiguration aus der Swagger-Definition, sodass Sie anruferunabhängigen Code schreiben können. Der Entwickler schreibt den Code, der das POJO gemäß der Konvention empfängt und zurückgibt, und der Aufrufer konvertiert den automatisch generierten Code gemäß jeder Konfiguration.

#Logikvorlage gemäß Konvention
./swagger-code-builder \
    --structure java-services \
    --api-spec-path swagger-spec.yaml
#Vorlage der normalen Zusammensetzung
./swagger-code-builder \
    --structure sparkjava \
    --api-spec-path swagger-spec.yaml
#Konfigurationsvorlage ohne Server
./swagger-code-builder \
    --structure java-awsserverless \
    --api-spec-path swagger-spec.yaml \
    --aws-region ap-northeast-1 \
    --aws-account-id [Account ID]

Ich gebe es jedoch auf, Abhängigkeiten von Bibliotheken und Objekten aufzulösen und schreibe sie einzeln. Ich werde die Abhängigkeiten von Gradle, dem in Spark Framework verwendeten Modul von Guice und dem Konstruktor von Lambda von Hand schreiben. Ich denke, dass dieser Bereich vereinfacht werden kann, wenn DI gut verwendet wird, aber es ist noch nicht gut organisiert.

Außerdem wird der Code, der das Spark Framework-Anforderungsobjekt konvertiert, automatisch generiert. Wenn Sie jedoch etwas anderes als das automatisch generierte Objekt für das Konvertierungsziel verwenden möchten, muss diese Konvertierung ebenfalls überarbeitet werden. Auch die automatische Generierung von POJOs wie Swagger CodeGen ist noch halbherzig. Ich denke, dass es auch in diesem Bereich notwendig ist, mit der Persistenzschicht zusammenzuarbeiten, deshalb habe ich nicht viel getan.

In Bezug auf die API-Gateway-Einstellungen wird automatisch Vendor Extension generiert. Sie müssen also nur das Lambda-Upload-, Import-Rest-API- und Grant-Berechtigungsskript ausführen. Sie können den CORS- und API-Schlüssel zum Zeitpunkt der Generierung auch als Option als Ganzes festlegen. Sie müssen lediglich einige Male auf den AWS-Bildschirm klicken, um die Bereitstellung abzuschließen.

In Bezug auf den Teil, der Anforderungen vor dem Controller akzeptiert (Nginx 'Reverse Proxy, Ursprung und Verhalten von Cloud Front), sollte ich mir bei Kong eine andere Methode überlegen. Überlegen.

Persistenzschicht

Teilen Sie das Modell in eine Logik (Service Layer) und einen Teil, der bestimmte Daten liest und schreibt (Data Access Object Layer) und mit Dependency Injection wechselt. Was DAO betrifft, habe ich den Code zweimal durch einfache Berechnung geschrieben, daher scheint es, dass hier eine andere Problemlösung benötigt wird.

Das Manipulieren von DynamoDB mit JDBC scheint ein paar proprietäre zu sein, aber es scheint nicht in Open Source herauszukommen. RDB ← → DynamoDB behandelt List, Map, Set und DynamoDB ← → Cassandra scheint Probleme beim Umgang mit Typdefinitionen zu haben. Obwohl es nicht im Hauptteil enthalten ist, war Spring angesichts der Existenz von Spring Data DynamoDB möglicherweise besser.

Schließlich

Swagger Code Builder ist immer noch ein herausforderndes Tool, wird jedoch tatsächlich bei der Entwicklung kleiner interner Tools verwendet. Insbesondere finde ich es sehr dankbar, dass Sie nicht mit der API-Gateway-Integration auf dem Bildschirm herumspielen müssen. Wenn Sie eine Architektur ohne Server entwickeln möchten, die eine Lieferantenbindung vermeidet, probieren Sie es bitte aus. Wir freuen uns auf Ihr Feedback und Ihre Probleme.

Recommended Posts

Ich überlegte, wie ich es serverlos machen und gleichzeitig die Lieferantenbindung vermeiden könnte
Ich dachte darüber nach, wie ich Swifts willSet richtig einsetzen sollte.
Wie man ein schattiertes Glas macht
Wie gehe ich mit dem Typ um, den ich 2 Jahre lang über das Schreiben eines Java-Programms nachgedacht habe?
Java - So erstellen Sie JTable
[Swift] Ich dachte über Vergleiche nach
[Schienen] Wie man Samen macht
Über die Sache, dass ich süchtig danach war, wie man Hashmap benutzt
Ich habe versucht, mithilfe von Routing-Verschachtelung eine beliebige URL zu erstellen
[Einführung in JSP + Servlet] Ich habe eine Weile damit gespielt ♬
Woran ich dachte, als ich anfing, von Java nach Kotlin zu migrieren