J'ai essayé d'exécuter le formulaire FaaS compatible Java "Fn Project"

Comme décrit dans l'article ci-dessous, dans Keynote of JavaOne 2017, la plate-forme FaaS "[projet fn] que Java exécute également à partir d'Oracle ](Http://fnproject.io/) "a été publié.

La caractéristique principale est

Je ne peux pas mesurer à quel point je prévois de le cultiver, mais pour autant que j'ai vu la présentation, cela semblait assez intéressant, alors j'ai essayé. L'environnement que j'ai essayé est Windows 10 + boîte à outils Docker + WSL (Ubuntu), veuillez donc le lire dans votre propre environnement, le cas échéant.

Installation

Tout d'abord, installez la commande 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

Exécutons l'exemple de programme tel quel.

% 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

L'image de Docker est abandonnée dans les coulisses et le serveur démarre sur le port 8080 de localhost. Vérifiez ci-dessous pour voir si cela fonctionne. Au fait, puisque j'utilise la boîte à outils docker, j'utiliserai l'adresse IP obtenue avec docker-machine ip default au lieu de localhost.

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

J'ai pu confirmer que le serveur a démarré.

Essayez de créer une application

Je vais continuer à créer des applications de type Hello World.

Tout d'abord, créez un répertoire pour créer l'application.

% mkdir example-fn
% cd example-fn

Créez ensuite l'application. Cette fois, j'ai décidé de l'essayer avec Java.

% 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

Le modèle du fichier de paramètres func.yaml et Maven est créé. Le contenu est comme ça.

% 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 + "!";
    }

}%

C'est assez simple. Eh bien, la manière recommandée de l'écrire est d'utiliser le Java FDK introduit dans la démo, mais j'essaierai cette partie plus tard.

Construire

Construisons le code créé.

% 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!%

Après avoir exécuté diverses versions par Docker, le résultat de l'exécution a été généré. D'après ce que je peux voir dans le journal, il semble que le test soit exécuté à ce moment. Impressionnant.

Déployer

Enfin, déployez. Par mesure de précaution pour le déploiement, s'il n'y a pas d'option, Push to Docker Hub sera automatiquement inséré, vous devez donc vous connecter à Docker Hub et créer un projet à l'avance. Veuillez noter que le nom du projet sera le nom du répertoire racine si rien n'est décrit dans func.yaml. La connexion à Docker Hub est la suivante.

% #La magie de l'utilisation de Docker de 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

Ensuite, c'est la connexion indispensable. Faites fn start dans un autre terminal, etc. pour démarrer le serveur de destination du déploiement.

% 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...

Notez que si vous ne spécifiez pas ʻAPI_URL, la valeur par défaut est http: // localhost: 8080, donc cela ne fonctionnera pas avec Docker Toolbox. Vous pouvez également ignorer Pushing to Docker Hub en ajoutant l'option --local`.

Vérifions qu'il a été déployé. Tout d'abord, vérifiez le routage

% 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

Il est très pratique de voir quelle version est mappée. Essayez d'accéder aux points de terminaison répertoriés.

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

C'était sorti correctement!

Résumé

Puisqu'il s'agit d'un Docker Native FaaS, il semble qu'il puisse être combiné avec des k8, etc. et diverses choses peuvent être faites. La prochaine fois, j'aimerais essayer Fn Flow et FDK.

Puisqu'il ne s'agit pas d'un service purement géré d'AWS Lambda, etc., il peut y avoir des différences, mais peut-il être utilisé comme base d'un système facile à mettre à l'échelle dans un environnement sur site ou cloud? J'attends ça.

Pour le moment, il y a un manque de documentation, donc j'espère que le développement se poursuivra à l'avenir.

Alors bon piratage!

Recommended Posts

J'ai essayé d'exécuter le formulaire FaaS compatible Java "Fn Project"
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
J'ai essayé de résumer les bases de kotlin et java
J'ai essayé d'interagir avec Java
J'ai essayé d'expliquer la méthode
J'ai essayé le framework Java "Quarkus"
J'ai essayé de résumer l'apprentissage Java (1)
J'ai essayé de résumer Java 8 maintenant
J'ai essayé de traduire le message d'erreur lors de l'exécution d'Eclipse (Java)
J'ai essayé de résumer les méthodes de Java String et StringBuilder
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé d'afficher le calendrier sur la console Eclipse en utilisant Java.
J'ai essayé de résumer les méthodes utilisées
J'ai essayé de résumer les expressions Java lambda
J'ai essayé le nouveau yuan à Java
J'ai essayé d'implémenter le modèle Iterator
J'ai essayé de résumer l'API Stream
Je suis allé au Java Women's Club # 1
[Introduction à Java] J'ai essayé de résumer les connaissances que j'estime essentielles
J'ai essayé de faire une authentification de base avec Java
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
J'ai essayé d'organiser la session en Rails
java j'ai essayé de casser un simple bloc
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
J'ai essayé de configurer tomcat pour exécuter le servlet.
J'ai essayé de créer une compétence Alexa avec Java
J'ai essayé de casser le bloc avec java (1)
[Petite histoire] J'ai essayé de rendre java ArrayList un peu plus pratique
[Java] Je souhaite calculer la différence par rapport à la date
J'ai essayé d'implémenter TCP / IP + BIO avec JAVA
J'ai essayé d'implémenter la notification push Firebase en Java
[Java 11] J'ai essayé d'exécuter Java sans compiler avec javac
[Java] J'ai essayé de résoudre le problème de rang B de Paiza
J'ai essayé de faire fonctionner SQS en utilisant AWS Java SDK
# 2 [Note] J'ai essayé de calculer quatre-vingt-dix-neuf avec Java.
J'ai essayé de réduire la capacité de Spring Boot
J'ai essayé de créer une compétence Clova en Java
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé d'implémenter Sterling Sort avec Java Collector
[Java] J'ai essayé de mettre en œuvre la recherche de produits de l'API Yahoo
~ J'ai essayé d'apprendre la programmation fonctionnelle avec Java maintenant ~
J'ai essayé de découvrir ce qui avait changé dans Java 9
J'ai fini de regarder les roses de Versailles, alors j'ai essayé de reproduire la chanson de fin en Java
[Java] J'ai essayé de créer un jeu Janken que les débutants peuvent exécuter sur la console
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé de moderniser une application Java EE avec OpenShift.
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]
J'ai essayé de faire coexister Java Optional et la clause de garde
J'ai brièvement résumé la grammaire de base de Ruby
J'ai essayé de construire l'environnement petit à petit en utilisant docker
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode