Ich habe versucht, das Java-kompatible FaaS-Formular "Fn Project" auszuführen.

Wie im folgenden Artikel beschrieben, wird in JavaOne 2017 Keynote die FaaS-Plattform "[fn project], die Java auch von Oracle aus ausführt ](Http://fnproject.io/) "wurde veröffentlicht.

Das Hauptmerkmal ist

Ich kann nicht messen, wie ernst ich es vorhabe, es zu vergrößern, aber soweit ich die Präsentation sah, schien es ziemlich interessant zu sein, also habe ich es versucht. Die Umgebung, die ich ausprobiert habe, ist Windows 10 + Docker Toolbox + WSL (Ubuntu). Bitte lesen Sie sie in Ihrer eigenen Umgebung.

Installation

Installieren Sie zuerst den Befehl fn

% curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
[sudo] password for koduki:
fn version 0.4.6
% fn -v
fn version 0.4.6

Lassen Sie uns das Beispielprogramm so ausführen, wie es ist.

% fn start
mount: permission denied (are you root?)
Could not mount /sys/kernel/security.
AppArmor detection and --privileged mode might break.
mount: permission denied (are you root?)
time="2017-10-03T12:25:53Z" level=info msg="datastore dialed" datastore=sqlite3 max_idle_connections=256
time="2017-10-03T12:25:53Z" level=info msg="no docker auths from config files found (this is fine)" error="open /root/.dockercfg: no such file or directory"
time="2017-10-03T12:25:53Z" level=info msg="available memory" ram=593510400
time="2017-10-03T12:25:53Z" level=info msg="Serving Functions API on address `:8080`"

        ______
       / ____/___
      / /_  / __ \
     / __/ / / / /
    /_/   /_/ /_/
        v0.3.135

^C2017/10/03 21:56:12 interrupt caught, exiting

Das Image von Docker wird hinter den Kulissen abgelegt und der Server wird auf Port 8080 von localhost gestartet. Überprüfen Sie unten, ob es funktioniert. Übrigens, da ich die Docker-Toolbox verwende, werde ich anstelle von localhost die IP verwenden, die mit "Docker-Maschine IP Standard" erhalten wurde.

% curl http://192.168.99.100:8080
{"goto":"https://github.com/fnproject/fn","hello":"world!"}

Ich konnte bestätigen, dass der Server gestartet wurde.

Versuchen Sie, eine App zu erstellen

Ich werde weiterhin Hello World-ähnliche Apps erstellen.

Erstellen Sie zunächst ein Verzeichnis, um die App zu erstellen.

% mkdir example-fn
% cd example-fn

Erstellen Sie dann die Anwendung. Dieses Mal habe ich beschlossen, es mit Java zu versuchen.

% fn init --runtime java

        ______
       / ____/___
      / /_  / __ \
     / __/ / / / /
    /_/   /_/ /_/

Runtime: java
Function boilerplate generated.
func.yaml created.
% find . -type f
./func.yaml
./pom.xml
./src/main/java/com/example/fn/HelloFunction.java
./src/test/java/com/example/fn/HelloFunctionTest.java

Die Vorlage der Einstellungsdatei func.yaml und Maven wird erstellt. Der Inhalt ist so.

% cat ./src/main/java/com/example/fn/HelloFunction.java
package com.example.fn;

public class HelloFunction {

    public String handleRequest(String input) {
        String name = (input == null || input.isEmpty()) ? "world"  : input;

        return "Hello, " + name + "!";
    }

}%

Es ist ziemlich einfach. Nun, die empfohlene Art, es zu schreiben, ist die Verwendung des in der Demo eingeführten Java-FDK, aber ich werde diesen Teil später versuchen.

Bauen

Lassen Sie uns den erstellten Code erstellen.

% fn run
Building image koduki/example-fn:0.0.1
Sending build context to Docker daemon  13.82kB
Step 1/11 : FROM fnproject/fn-java-fdk-build:jdk9-latest as build-stage
.
.
.
Step 11/11 : CMD com.example.fn.HelloFunction::handleRequest
 ---> Running in 0cd0c81caa5a
 ---> c6e00fb47d8d
Removing intermediate container 0cd0c81caa5a
Successfully built c6e00fb47d8d
Successfully tagged koduki/example-fn:0.0.1
Hello, world!%

Nach dem Ausführen verschiedener Builds durch Docker wurde das Ausführungsergebnis ausgegeben. Soweit ich aus dem Protokoll ersehen kann, scheint der Test zu diesem Zeitpunkt ausgeführt zu werden. Genial.

Bereitstellen

Stellen Sie schließlich bereit. Als Vorsichtsmaßnahme für die Bereitstellung wird Push to Docker Hub automatisch eingefügt, wenn keine Option vorhanden ist. Sie müssen sich daher bei Docker Hub anmelden und im Voraus ein Projekt erstellen. Bitte beachten Sie, dass der Projektname der Name des Stammverzeichnisses ist, wenn in func.yaml nichts beschrieben ist. Die Anmeldung bei Docker Hub lautet wie folgt.

% #Die Magie der Verwendung von Docker von WSL
% alias docker="docker -H tcp://192.168.99.100:2376 --tlsverify --tlscacert /mnt/c/Users/$USER/.docker/machine/machines/default/ca.pem --tlscert /mnt/c/Users/$USER/.docker/machine/machines/default/cert.pem --tlskey /mnt/c/Users/$USER/.docker/machine/machines/default/key.pem"
% docker login
Login Succeeded

Dann ist es das wesentliche Login. Führen Sie "fn start" in einem anderen Terminal usw. aus, um den Bereitstellungszielserver zu starten.

% API_URL=http://192.168.99.100:8080 fn deploy --app myapp
Deploying example-fn to app: myapp at path: /example-fn
Bumped to version 0.0.2
Building image koduki/example-fn:0.0.2
.
.
.
Successfully tagged koduki/example-fn:0.0.2
Updating route /example-fn using image koduki/example-fn:0.0.2...

Beachten Sie, dass der Standardwert "http: // localhost: 8080" lautet, wenn Sie "API_URL" nicht angeben. Daher funktioniert dies nicht mit Docker Toolbox. Sie können das Pushing zu Docker Hub auch überspringen, indem Sie die Option "--local" hinzufügen.

Lassen Sie uns überprüfen, ob es bereitgestellt wurde. Überprüfen Sie zunächst das Routing

% API_URL=http://192.168.99.100:8080 fn routes list myapp
path            image                   endpoint
/example-fn     koduki/example-fn:0.0.3 192.168.99.100:8080/r/myapp/example-fn

Es ist sehr praktisch zu sehen, welche Version zugeordnet ist. Versuchen Sie, auf die aufgelisteten Endpunkte zuzugreifen.

% curl http://192.168.99.100:8080/r/myapp/example-fn
Hello, world!%

Es wurde richtig ausgegeben!

Zusammenfassung

Da es sich um ein Docker Native FaaS handelt, scheint es, dass es mit k8s usw. kombiniert werden kann und verschiedene Dinge getan werden können. Nächstes Mal möchte ich Fn Flow und FDK ausprobieren.

Da es sich nicht um einen rein verwalteten Dienst von AWS Lambda usw. handelt, kann es einige Unterschiede geben. Kann er jedoch als Grundlage für ein System verwendet werden, das in einer On-Premise- oder Cloud-Umgebung einfach zu skalieren ist? Ich erwarte es.

Im Moment fehlt es an Dokumentation, daher hoffe ich, dass die Entwicklung in Zukunft fortgesetzt wird.

Dann viel Spaß beim Hacken!

Recommended Posts

Ich habe versucht, das Java-kompatible FaaS-Formular "Fn Project" auszuführen.
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, die Methode zu erklären
Ich habe das Java-Framework "Quarkus" ausprobiert.
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Ich habe jetzt versucht, Java 8 zusammenzufassen
Ich habe versucht, die Fehlermeldung beim Ausführen von Eclipse (Java) zu übersetzen.
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, den Kalender mit Java auf der Eclipse-Konsole anzuzeigen.
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich habe versucht, Java-Lambda-Ausdrücke zusammenzufassen
Ich habe das neue Yuan-Problem in Java ausprobiert
Ich habe versucht, das Iterator-Muster zu implementieren
Ich habe versucht, die Stream-API zusammenzufassen
Ich ging zum Java Women's Club # 1
[Einführung in Java] Ich habe versucht, das Wissen zusammenzufassen, das ich für wesentlich halte
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
Ich habe versucht, die Sitzung in Rails zu organisieren
Java Ich habe versucht, einen einfachen Block zu brechen
Ich habe versucht, neunundneunzig in Java auszugeben
Ich habe versucht, Tomcat so einzustellen, dass das Servlet ausgeführt wird.
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
Ich habe versucht, den Block mit Java zu brechen (1)
[Kleine Geschichte] Ich habe versucht, die Java-ArrayList etwas komfortabler zu gestalten
[Java] Ich möchte die Differenz zum Datum berechnen
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
[Java 11] Ich habe versucht, Java auszuführen, ohne mit Javac zu kompilieren
[Java] Ich habe versucht, Paizas B-Rang-Problem zu lösen
Ich habe versucht, SQS mit AWS Java SDK zu betreiben
# 2 [Anmerkung] Ich habe versucht, neunundneunzig mit Java zu berechnen.
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
[Java] Ich habe versucht, die Yahoo API-Produktsuche zu implementieren
~ Ich habe jetzt versucht, funktionale Programmierung mit Java zu lernen ~
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe mir die Rosen von Versailles angesehen und versucht, das Schlusslied in Java zu reproduzieren
[Java] Ich habe versucht, ein Janken-Spiel zu erstellen, das Anfänger auf der Konsole ausführen können
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit spiritueller Technik zu erhöhen
Ich möchte die Java 8 DateTime-API (jetzt) langsam verwenden.
Ich möchte ein Formular erstellen, um die Kategorie [Schienen] auszuwählen
Ich habe versucht, Java Optional und Guard-Klausel koexistieren zu lassen
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich habe versucht, die Umgebung nach und nach mit Docker aufzubauen
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen