Développement du microservice Bluemix Python

Python est un langage de programmation doté d'une riche bibliothèque dans des domaines tels que l'IoT, l'analyse, l'apprentissage en profondeur et le traitement du langage naturel. Un traitement spécialisé dans ces domaines peut être développé en tant que micro service en Python par une équipe spécialisée, et peut être appelé et utilisé comme API REST à partir d'une application frontale hautement productive sur l'écran Web PHP. Une productivité et une maintenabilité élevées sont attendues.

De plus, l'API de Watson renvoie une réponse au format JSON, donc en connectant Cloudant, qui est une base de données de type document au format JSON, au runtime Node.js, qui est bon pour traiter JSON, Watson construit un corpus. Vous pouvez développer le système d'application de ce qui précède avec une productivité élevée. Et, de la même manière, vous pouvez ajouter des fonctions en l'utilisant comme service REST depuis le frontal PHP.

Comme le montre la figure suivante, la structure qui appelle les microservices écrits en Node.js et Python à partir de l'application PHP frontale vous permet d'ajouter des fonctions sans affecter de manière significative l'application écran Web. Je vais. En d'autres termes, en adoptant une telle architecture de microservices, l'écran web est PHP, le calcul numérique est Python, Watson est Node.js, etc., chacun étant le meilleur langage de programmation, et une bonne productivité mutuelle. Vous pouvez étendre les fonctions du système tout en conservant ce qui précède.

スクリーンショット 2017-08-21 22.14.08.png

En tant que fonction de prise en charge d'une telle architecture de micro-services, Bluemix a une fonction qui permet aux services REST fournis par l'utilisateur d'être liés et utilisés à partir d'autres applications. En utilisant cela, il est possible de construire un système à grande échelle qui est faiblement couplé en unités de fonctions et d'organisations.

Détails d'implémentation

Dans cet article, j'aimerais créer un service Web Python RESTful qui se connecte et utilise à partir d'une application PHP. Bien entendu, dans ce processus de développement, HTTPS et l'authentification sont considérés en supposant un environnement dans lequel REST est appelé à partir de l'environnement de développement local et le fonctionnement est confirmé. De plus, en liant le service Python à l'application PHP, vous pouvez obtenir l'URL de destination d'accès et les informations d'identification, et éviter le codage en dur dans l'application PHP.

スクリーンショット 2017-08-21 22.14.16.png

Créer un environnement de programmation Python

Construisez la pile d'environnement de développement localement avec Vagrant + VirtualBox. Un Vagrantfile est préparé à l'adresse de GitHub https://github.com/takara9/bluemix-dev, vous pouvez donc l'utiliser pour préparer un environnement de développement Python sur le serveur virtuel de votre PC. Je peux le faire. Vous pouvez également utiliser ce Vagrantfile pour créer un environnement de développement pour PHP, Ruby et Node.js en même temps.

$ git clone https://github.com/takara9/bluemix-dev bluemix-rest
$ cd bluemix-rest/
$ vagrant up
$ vagrant ssh
$ pyenv install 2.7.13
$ pyenv versions
* system (set by /home/vagrant/.pyenv/version)
  2.7.13
$ pyenv global 2.7.13
$ python --version
Python 2.7.13

Maintenant, l'environnement de développement Python est prêt.

Développement de programme serveur Python REST

Nous écrirons un serveur REST minimal pour Python. La fonction de ce code est la suivante:

L'exemple de code ci-dessous est disponible sur GitHub https://github.com/takara9/REST_Sample_Python.

Exemple de code Python pour serveur REST

     1	#!/usr/bin/env python
     2	# -*- coding:utf-8 -*-
     3	import os
     4	from flask import Flask
     5	from flask_restful import Resource, Api, reqparse
     6	from flask_httpauth import HTTPBasicAuth
     7	
     8	# for Health Check
     9	class HelloWorld(Resource):
    10	    def get(self):
    11	        return {'message': 'Hello World'}
    12	
    13	# for POST
    14	class Calc(Resource):
    15	    auth = HTTPBasicAuth()
    16	    @auth.login_required
    17	    def post(self):
    18	        args = parser.parse_args()
    19	        ans = float(args['a']) * float(args['b'])
    20	        return {'ans': ans }
    21	
    22	    @auth.verify_password
    23	    def verify_password(username, password):
    24	        return username == 'user' and password == 'pass'
    25	
    26	
    27	if __name__ == '__main__':
    28	
    29	    app = Flask(__name__)
    30	    api = Api(app)
    31	    api.add_resource(Calc, '/calc')
    32	    api.add_resource(HelloWorld, '/')
    33	
    34	    parser = reqparse.RequestParser()
    35	    parser.add_argument('a')
    36	    parser.add_argument('b')
    37	
    38	    bx_port = os.getenv("PORT")
    39	    listen_port = int(bx_port if bx_port else 5000)
    40	    app.run(host='0.0.0.0', port=listen_port, debug=True)

Description du programme

Lignes 1 et 2

La première ligne est une déclaration qui utilise python comme interpréteur. / usr / bin / env est la spécification pour l'exécution de Python défini dans pyenv. Vous pouvez vous référer au manuel avec man env. La deuxième ligne est une déclaration d'utilisation de UTF-8.

Lignes 3-6

Nous utilisons le framework FLASK de Python pour créer un serveur REST. Vous pouvez en savoir plus sur les trois modules que vous importez à l'URL suivante.

Lignes 8-11

Code pour répondre aux vérifications de l'état lors du déploiement sur Bluemix. Étant donné que le contenu à répondre n'est pas spécifié, «Hello World» est renvoyé. La spécification de rappel pour cette classe se trouve à la ligne 32.

Lignes 13-24

Il s'agit de la partie centrale du service REST. Les lignes 15 et 16 spécifient que l'authentification BASIC est requise. Aux lignes 17 à 20, les données reçues par POST sont converties (analysées) en une variable, multipliées et renvoyées. Je pense que le cadre Python consistant à renvoyer une réponse avec une variable qui revient d'un rappel applaudit.

Les lignes 22 à 24 correspondent à l'ID utilisateur et au mot de passe. S'il s'agit d'une application réelle, vous accéderez au système de gestion des identifiants et à la base de données à partir d'ici.

À partir de la ligne 27

C'est la partie principale de la routine. Instanciez le framework, définissez la classe de rappel, spécifiez les paramètres à analyser, obtenez le numéro de port à partir des variables d'environnement et démarrez le serveur.

Installation et test dans un environnement local

Dans cette section, nous allons écrire sur la façon de tester le code cloné à partir de GitHub localement. Vous pouvez soudainement le déployer sur Bluemix et l'exécuter, mais comme il est pratique d'avoir un environnement de développement local, vérifiez le fonctionnement sur votre propre Mac, puis déployez-le.

Tout d'abord, clonez le code comme suit:

git clone https://https://github.com/takara9/REST_Sample_Python

Accédez au répertoire du serveur REST où se trouve la liste des modules Python requis requirements.txt.

cd REST_Sample_Python/restServerPython

Exécutez la commande suivante pour installer en bloc les packages prérequis Python.

pip install -r requirements.txt

Exécuter le serveur REST (local)

Le serveur REST est démarré de la manière suivante. Si vous le définissez à l'avance sur chmod + x app.py, vous pouvez également l'exécuter directement en tant que ./app.py.

vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restServerPython$ python app.py
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 267-639-962
 * 

Exécuter le client REST (local)

Ouvrez un autre terminal, connectez-vous au serveur virtuel dans votre environnement de développement avec vagrant ssh, puis exécutez le client REST. Le client REST est également inclus dans le code cloné depuis GitHub, alors déplacez le répertoire.

cd REST_Sample_Python/restClientPython

Comme le montre la figure ci-dessus, le client est écrit en PHP car nous procédons à l'appel d'un service écrit en Python depuis une application PHP. Le code client est conçu pour obtenir l'URI et les informations d'authentification de la destination de connexion à partir de vcap-local.json, alors réécrivez ce fichier et essayez de vous connecter au service REST démarré localement.

Le changement est uri sur la 7ème ligne, réécrivez-le en "http: // localhost: 5000 / calc".

     1	{
     2	 "VCAP_SERVICES": {
     3	  "user-provided": [
     4	   {
     5	    "credentials": {
     6	     "password": "pass",
 7 "uri": "https://pycalcxx.mybluemix.net/calc", <-Fixer cette ligne
     8	     "username": "user"
     9	    },
    10	    "label": "user-provided",
    11	    "name": "pycalcxxu",
    12	    "syslog_drain_url": "",
    13	    "tags": [],
    14	    "volume_mounts": []
    15	   }
    16	  ]
    17	 }
    18	}

Ensuite, installez PHP avec phpenv et vérifiez la version.

phpenv install 5.6.31
phpenv global 5.6.31
vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restClientPython$ php -v
PHP 5.6.31 (cli) (built: Aug 14 2017 05:28:21) 

Maintenant que vous disposez d'un environnement dans lequel vous pouvez exécuter du code PHP, exécutez-le.

vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restClientPython$ php client.php 
Result = 2130.951794

C'est une bonne idée de changer les valeurs des variables de tableau a et b de manière appropriée dans le code client.

Description du code client PHP REST

Je voudrais d'abord présenter l'intégralité du code pour compléter les points clés.

     1	<?php
     2	include "cfenv.php";
     3	
     4	$ch = curl_init();
     5	$vcap = new Cfenv();
     6	$vcap->byInstName('pycalcxxu');
     7	
     8	// POST
     9	$form = array(
    10	   'a' => 391.345,
    11	   'b' => 5.4452
    12	);
    13	
    14	$options = array(
    15	    CURLOPT_POST => 1,
    16	    CURLOPT_HEADER => 0,
    17	    CURLOPT_URL => $vcap->uri,
    18	    CURLOPT_FRESH_CONNECT => 1,
    19	    CURLOPT_RETURNTRANSFER => 1,
    20	    CURLOPT_FORBID_REUSE => 1,
    21	    CURLOPT_TIMEOUT => 4,
    22	    CURLOPT_USERPWD => $vcap->user.":".$vcap->pass, 
    23	    CURLOPT_POSTFIELDS => http_build_query($form)
    24	);
    25	
    26	curl_setopt_array($ch, $options);
    27	$resp = curl_exec($ch);
    28	$result = json_decode($resp);
    29	print "Result = ".$result->{'ans'}."\n";
    30	
    31	curl_close($ch);
    32	?>

2e ligne cfenv.php

Ce module est un module permettant d'obtenir les informations de destination de connexion en éditant l'environnement lorsqu'il est déployé sur Bluemix et en lisant les informations de destination de connexion à partir de vcap-local.json lors des tests dans l'environnement local.

Lignes 8 à 12

Pour les données POST, l'exemple de serveur Python REST renvoie le résultat de la multiplication de a et b.

Lignes 14-24

Les paramètres requis pour POST, tels que l'URI, l'utilisateur et le mot de passe d'authentification de base, les données de formulaire, etc. sont définis.

26e ligne ~

Exécutez HTTP POST pour obtenir le résultat et l'afficher à l'écran.

Déployer un serveur REST sur Blemix

Les fichiers de déploiement du module d'exécution Python sur Bluemix sont les quatre fichiers suivants.

vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restServerPython$ ls
app.py	manifest.yml  requirements.txt	runtime.txt
     1	---
     2	applications:
     3	- buildpack: https://github.com/cloudfoundry/python-buildpack
     4	  name: python-rest-svc
     5	  memory: 64MB
     6	  disk_quota: 256MB
     7	  random-route: false
     8	  domain: mybluemix.net
     9	  name: pyCalcxx
    10	  command: python app.py

Le point est le pack de build sur la troisième ligne, qui spécifie le dernier pack de build pour Cloud Foundry. Spécifiez ensuite python app.py comme commande de démarrage pour démarrer python à la ligne 10.

Enfin, exécutez la commande suivante pour permettre à Bluemix de déployer les modules requis au moment du déploiement, par exemple lorsque des modules supplémentaires se produisent.

pip freeze > requirements.txt

Un fichier qui spécifie la version Python. Veuillez consulter le manuel de Cloud Foundry pour plus de détails, car il existe une plage qui peut être utilisée avec le pack de construction.

python-2.7.13

Connectez-vous avec la CLI Blumiex et déployez l'application.

bx login
bx cf push

Une fois le déploiement réussi, essayez de modifier l'URI du client de test et de tester. Pour connaître l'URL du service REST déployé:

vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restServerPython$ bx cf a
Invoking 'cf a'...

name          requested state   instances   memory   disk   urls
pyCalcxx      started           1/1         64M      256M   pycalcxx.mybluemix.net

Dans ce cas, nous savons qu'il s'agit de pycalcxx.mybluemix.net, donc modifiez et testez la ligne 7 de vcap-local.json sur le client.

     7	     "uri": "https://pycalcxx.mybluemix.net/calc", 

Si vous obtenez le même résultat que lorsque vous l'exécutez localement, le déploiement du serveur REST est terminé.

vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restClientPython$ php client.php 
Result = 2130.951794

Défini comme un service fourni par l'utilisateur

Enfin, le service fourni par l'utilisateur peut être exécuté. Nous le définirons comme un service fourni par l'utilisateur.

Vérifiez le nom et l'adresse de ce service REST Python.

vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restClientPython$ bx cf a
Invoking 'cf a'...

name          requested state   instances   memory   disk   urls
pyCalcxx      started           1/1         64M      256M   pycalcxx.mybluemix.net

Définissez le nom du service séparément du nom de l'application mentionné ci-dessus et spécifiez l'adresse des informations d'identification -p.

vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restClientPython$ bx cf cups pycalcxxu -p '{"username":"user", "password":"pass", "uri": "https://pycalcxx.mybluemix.net/calc"}'

Cela fournira les informations d'identification fournies à l'application lorsque vous liez le service. Et lorsqu'ils sont visualisés à partir de l'écran de la console Bluemix, le service Bluemix et le service fourni par l'utilisateur apparaîtront sur la même ligne, comme indiqué ci-dessous.

スクリーンショット 2017-08-23 10.38.06.png

Par exemple, vous pouvez vous connecter à partir d'une autre application et l'utiliser comme suit. スクリーンショット 2017-08-23 10.25.06.png

Bien sûr, vous pouvez lier et dissocier non seulement de l'écran GUI du Web, mais également de la commande CLI Bluemix.

bx cf bs phpSamplexx pycalcxxu

Si vous faites référence aux informations d'identification du service du côté de l'application, vous pouvez voir qu'elles sont fournies à l'application comme suit.

bx cf env phpSamplexx
 <Omis>
System-Provided:
{
 "VCAP_SERVICES": {
  "user-provided": [
   {
    "credentials": {
     "password": "pass",
     "uri": "https://pycalcxx.mybluemix.net/calc",
     "username": "user"
    },
    "label": "user-provided",
    "name": "pycalcxxu",
    "syslog_drain_url": "",
    "tags": [],
    "volume_mounts": []
   }
  ]
 }
}

Exemple de code pour utiliser le service REST fourni par l'utilisateur

J'ai mis le code PHP qui fonctionne avec ce service Python REST sur GitHub, donc je pense que vous pouvez approfondir votre compréhension en vous y référant également. https://github.com/takara9/php_sample_apl/tree/db2

Ceci est un exemple simple, mais je pense qu'il peut être appliqué à des applications telles que l'utilisation d'un modèle d'apprentissage automatique utilisant Python.

Copie d'écran 1 Écran de saisie

スクリーンショット 2017-08-23 11.03.56.png

Copie d'écran 2 Écran d'affichage des résultats du traitement REST

スクリーンショット 2017-08-23 11.04.12.png

Résumé

Cette fois, l'histoire est limitée à une étape, mais dans des cas tels que DevOps où le développement et le fonctionnement de la production sont parallèles, le côté environnement peut fournir les informations de destination de connexion du micro-service à l'application, donc pendant le développement chargé. Puisqu'il est possible d'éviter des accidents tels qu'une erreur accidentelle dans la destination de connexion et la destruction des données de production, je pense qu'il peut être utilisé comme un environnement DevOps sûr et sécurisé.

Ensuite, en production, si les performances du micro service sont insuffisantes, il y a un avantage en ce que le nombre d'instances peut être facilement augmenté. Étant donné que le gorouter qui gère la répartition de la charge est inclus dans le routage du micro service, vous pouvez augmenter le nombre d'instances et évoluer en cliquant simplement sur + comme indiqué sur la figure. スクリーンショット 2017-08-23 11.14.03.png

Vous voudrez des fonctionnalités un peu plus utiles. Vient ensuite Bluemix API Connect.

Matériel de référence

(1) Flask Micro Framework http://flask.pocoo.org/ (2) Flask RESTful https://flask-restful.readthedocs.io/en/0.3.5/ (3) Flask-BasicAuth https://flask-basicauth.readthedocs.io/en/latest/ (4) Python Buildpack http://docs.cloudfoundry.org/buildpacks/python/index.html (5) Manuel PHP curl exec http://php.net/manual/ja/function.curl-exec.php (6) La clé pour déployer des applications Flask à l'aide de Python Buildpack dans Cloud Foundry (Diego) http://qiita.com/yuta_h3/items/4798ec83a26391c5627f (7) Cloud Foundry Documentation Python Buildpack https://docs.cloudfoundry.org/buildpacks/python/index.html (8) Bluemix App Development and Management # 21.5 Instance de service fournie par l'utilisateur http://qiita.com/MahoTakara/items/9d03414689fe1b2b9cd2

Recommended Posts

Développement du microservice Bluemix Python
Notes de développement de package Python
Construction de l'environnement de développement Python
À propos de l'environnement de développement Python
Construction de l'environnement de développement python2.7
Développement de framework avec Python
Micro service avec Python (présentation)
Développement Slackbot en Python
Développement Python + Kivy sous Windows
Organiser l'environnement de développement Python
[ev3dev × Python] Construction de l'environnement de développement ev3dev
Développement Python avec Visual Studio 2017
[MEMO] [Construction de l'environnement de développement] Python
[Pour organiser] Environnement de développement Python
Développement Python avec Visual Studio
Configurer un environnement de développement Python sur Ubuntu
Développement Python aidé par le test Jenkins-Unit
Préparez votre premier environnement de développement Python
[Python3] Construction de l'environnement de développement << Édition Windows >>
Mémo de préparation au développement GitHub x Python
Options d'environnement de développement Python pour mai 2020
Construction de l'environnement de développement Python sur macOS
Développement de jeux Othello avec Python
Mémo de configuration de l'environnement de développement Vim + Python
Paramètres Emacs pour l'environnement de développement Python
Installer l'environnement de développement Python sur Windows 10
Mémo de construction de l'environnement de développement Emacs Python
Vérification de l'environnement de développement NAOqi Python
Configurer un environnement de développement Python avec Atom
Développement d'applications avec Docker + Python + Flask
Procédure de construction de l'environnement de développement Python (anaconda) (SpringToolsSuites) _2020.4
Environnement de développement Python pour macOS utilisant venv 2016
[Environnement de développement] Python avec Xcode [Avec transition d'écran]
Blender 2.82 ou version ultérieure + notes sur l'environnement de développement python
Développement d'applications mobiles avec IBM Bluemix Kinetise (2)
Développement d'applications mobiles avec IBM Bluemix Kinetise (1)
Virtualiser (isoler) l'environnement de développement IBM i python avec chroot
Résumé du développement avec Django
Développement du microservice Bluemix Python
Développement d'applications mobiles avec IBM Bluemix Kinetise (2)
Développement d'applications mobiles avec IBM Bluemix Kinetise (1)
6 bibliothèques Python pour un développement et un débogage plus rapides
Comment préparer l'environnement de développement Python [Mac]
Construction de l'environnement de développement Python3 + venv + VSCode + macOS
Python: Identification du genre (développement de l'apprentissage profond) Partie 1
Python: Identification du genre (développement de l'apprentissage profond) Partie 2
Procédure de construction du serveur de développement Python (AWS + Anaconda)
Construire un environnement de développement Python (pythonz, virtualenv, direnv)
L'environnement de développement Python le plus puissant Recommandation de PyCharm
Créer un environnement de développement Python pour le développement de l'IA
Création d'un environnement de développement Python pour Windows + gVim + Poetry
L'environnement de développement intégré Python le plus puissant PyCharm