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.
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é.
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.
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.
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!
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