Entwicklung des Bluemix Python Microservice

Python ist eine Programmiersprache mit einer umfangreichen Bibliothek in Bereichen wie IoT, Analytics, Deep Learning und Verarbeitung natürlicher Sprache. Spezialisierte Verarbeitung in solchen Bereichen kann von einem spezialisierten Team als Mikrodienst in Python entwickelt und von einer Front-End-Anwendung, die auf dem PHP-Webbildschirm hochproduktiv ist, als REST-API aufgerufen und verwendet werden. Hohe Produktivität und Wartbarkeit werden erwartet.

Darüber hinaus gibt die Watson-API eine Antwort im JSON-Format zurück. Durch Verbinden von Cloudant, einem Dokumenttyp-DB im JSON-Format, mit der Node.js-Laufzeit, die JSON gut verarbeiten kann, erstellt Watson einen Korpus. Sie können das oben genannte Anwendungssystem mit hoher Produktivität entwickeln. Auf die gleiche Weise können Sie Funktionen hinzufügen, indem Sie sie als REST-Service vom PHP-Frontend aus verwenden.

Wie in der folgenden Abbildung gezeigt, können Sie mit der Struktur, die in Node.js und Python geschriebene Microservices aus der Front-End-PHP-Anwendung aufruft, Funktionen hinzufügen, ohne die Webbildschirmanwendung wesentlich zu beeinträchtigen. Ich werde. Mit anderen Worten, durch die Verwendung einer solchen Microservice-Architektur sind Webbildschirme PHP, numerische Berechnungen Python, Watson Node.js usw., die Programmiersprachen, in denen sie am besten sind, und sie sind für beide Seiten eine gute Produktivität. Sie können die Funktionen des Systems erweitern, während Sie die oben genannten Funktionen beibehalten.

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

Als Funktion zur Unterstützung einer solchen Mikrodienstarchitektur verfügt Bluemix über eine Funktion, mit der vom Benutzer bereitgestellte REST-Dienste von anderen Apps gebunden und verwendet werden können. Auf diese Weise ist es möglich, ein großes System aufzubauen, das lose in Einheiten von Funktionen und Organisationen gekoppelt ist.

Implementierungsdetails

In diesem Artikel möchte ich einen Python RESTful-Webdienst erstellen, der eine Verbindung zu einer PHP-App herstellt und diese verwendet. Natürlich werden in diesem Entwicklungsprozess HTTPS und Authentifizierung unter der Annahme einer Umgebung betrachtet, in der REST aus der lokalen Entwicklungsumgebung aufgerufen und der Betrieb bestätigt wird. Durch Binden eines Python-Dienstes an eine PHP-App können Sie außerdem die Zugriffs-URL und die Anmeldeinformationen abrufen, um eine harte Codierung in der PHP-App zu vermeiden.

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

Erstellen einer Python-Programmierumgebung

Erstellen Sie den Entwicklungsumgebungsstapel lokal mit Vagrant + VirtualBox. Eine Vagrant-Datei wird unter der Adresse von GitHub https://github.com/takara9/bluemix-dev erstellt, sodass Sie damit eine Python-Entwicklungsumgebung auf dem virtuellen Server Ihres PCs vorbereiten können. Ich kann es schaffen Sie können diese Vagrant-Datei auch verwenden, um gleichzeitig eine Entwicklungsumgebung für PHP, Ruby und Node.js zu erstellen.

$ 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

Jetzt ist die Python-Entwicklungsumgebung bereit.

Python REST Server Programmentwicklung

Wir werden einen minimalen REST-Server für Python schreiben. Die Funktion dieses Codes ist wie folgt:

Der folgende Beispielcode ist unter GitHub https://github.com/takara9/REST_Sample_Python verfügbar.

Python-Beispielcode für den REST-Server

     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)

Programm Beschreibung

Zeilen 1 und 2

Die erste Zeile ist eine Deklaration, die Python als Interpreter verwendet. / usr / bin / env ist die Spezifikation für die Ausführung des in pyenv festgelegten Python-Sets. Sie können sich auf das Handbuch mit man env beziehen. Die zweite Zeile ist eine Deklaration für die Verwendung von UTF-8.

Zeilen 3-6

Wir verwenden das FLASK-Framework von Python, um einen REST-Server zu erstellen. Weitere Informationen zu den drei zu importierenden Modulen finden Sie unter der folgenden URL.

Zeilen 8-11

Code zur Reaktion auf Integritätsprüfungen bei der Bereitstellung auf Bluemix. Da der zu antwortende Inhalt nicht angegeben ist, wird 'Hello World' zurückgegeben. Die Rückrufspezifikation für diese Klasse befindet sich in Zeile 32.

Zeilen 13-24

Dies ist der Kern des REST-Service. Die Zeilen 15 und 16 geben an, dass eine BASIC-Authentifizierung erforderlich ist. In den Zeilen 17 bis 20 werden die vom POST empfangenen Daten in eine Variable konvertiert (analysiert), multipliziert und zurückgegeben. Ich denke, das Python-Framework, eine Antwort mit einer Variablen zurückzugeben, die von einem Rückruf zurückkehrt, applaudiert.

Die Zeilen 22-24 stimmen mit der Benutzer-ID und dem Kennwort überein. Wenn es sich um eine echte Anwendung handelt, können Sie von hier aus auf das ID-Verwaltungssystem und die Datenbank zugreifen.

Ab Zeile 27

Dies ist der Hauptroutine-Teil. Instanziieren Sie das Framework, legen Sie die Rückrufklasse fest, geben Sie die zu analysierenden Parameter an, rufen Sie die Portnummer aus den Umgebungsvariablen ab und starten Sie den Server.

Installation und Test in einer lokalen Umgebung

In diesem Abschnitt erfahren Sie, wie Sie lokal von GitHub geklonten Code testen. Sie können es plötzlich auf Bluemix bereitstellen und ausführen. Da es jedoch praktisch ist, eine lokale Entwicklungsumgebung zu haben, überprüfen Sie den Betrieb auf Ihrem eigenen Mac und stellen Sie es dann bereit.

Klonen Sie zunächst den Code wie folgt:

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

Navigieren Sie zum REST-Serververzeichnis, in dem sich die Liste der erforderlichen Anforderungen für Python-Module befindet.

cd REST_Sample_Python/restServerPython

Führen Sie den folgenden Befehl aus, um die Python-Voraussetzungspakete in großen Mengen zu installieren.

pip install -r requirements.txt

REST-Server ausführen (lokal)

Der REST-Server wird folgendermaßen gestartet. Wenn Sie es im Voraus als chmod + x app.py festlegen, können Sie es auch direkt als ./app.py ausführen.

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
 * 

REST-Client ausführen (lokal)

Öffnen Sie ein anderes Terminal, melden Sie sich mit vagrant ssh beim virtuellen Server in Ihrer Entwicklungsumgebung an und führen Sie dann den REST-Client aus. Der REST-Client ist auch in dem von GitHub geklonten Code enthalten. Verschieben Sie daher das Verzeichnis.

cd REST_Sample_Python/restClientPython

Wie in der obigen Abbildung gezeigt, ist der Client in PHP geschrieben, da wir einen in Python geschriebenen Dienst aus einer PHP-Anwendung aufrufen. Der Clientcode dient dazu, die URI- und Authentifizierungsinformationen des Verbindungsziels von vcap-local.json abzurufen. Schreiben Sie diese Datei neu und versuchen Sie, eine Verbindung zum lokal gestarteten REST-Dienst herzustellen.

Die Änderung ist uri in der 7. Zeile, schreiben Sie es in "http: // localhost: 5000 / calc".

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

Als nächstes installieren Sie PHP mit phpenv und überprüfen Sie die 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) 

Nachdem Sie eine Umgebung haben, in der Sie PHP-Code ausführen können, führen Sie ihn aus.

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

Es ist eine gute Idee, die Werte der Array-Variablen a und b im Client-Code entsprechend zu ändern.

Beschreibung des PHP REST-Clientcodes

Ich möchte zuerst den gesamten Code präsentieren, um die wichtigsten Punkte zu ergänzen.

     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	?>

2. Zeile cfenv.php

Dieses Modul ist ein Modul zum Abrufen der Verbindungszielinformationen durch Bearbeiten der Umgebung bei der Bereitstellung auf Bluemix und Lesen der Verbindungszielinformationen aus vcap-local.json beim Testen in der lokalen Umgebung.

Zeilen 8-12

Für POST-Daten gibt der Python-REST-Beispielserver das Ergebnis der Multiplikation von a und b zurück.

Zeilen 14-24

Für POST erforderliche Parameter wie URI, Basisauthentifizierungsbenutzer und -kennwort, Formulardaten usw. werden festgelegt.

26. Zeile ~

Führen Sie HTTP POST aus, um das Ergebnis abzurufen und auf dem Bildschirm anzuzeigen.

Bereitstellen eines REST-Servers unter Blemix

Die Dateien zum Bereitstellen des Python-Ausführungsmoduls auf Bluemix sind die folgenden vier Dateien.

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

Der Punkt ist das Build Pack in der dritten Zeile, das das neueste Build Pack für Cloud Foundry angibt. Geben Sie dann python app.py als Startbefehl an, um Python in Zeile 10 zu starten.

Führen Sie abschließend den folgenden Befehl aus, damit Bluemix die erforderlichen Module zur Bereitstellungszeit bereitstellen kann, z. B. wenn zusätzliche Module auftreten.

pip freeze > requirements.txt

Eine Datei, die die Python-Version angibt. Weitere Informationen finden Sie im Cloud Foundry-Handbuch, da es einen Bereich gibt, der mit dem Build Pack verwendet werden kann.

python-2.7.13

Melden Sie sich mit der Blumiex-CLI an und stellen Sie die App bereit.

bx login
bx cf push

Versuchen Sie nach erfolgreicher Bereitstellung, den URI des Testclients zu ändern und zu testen. So ermitteln Sie die URL des bereitgestellten REST-Service:

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

In diesem Fall wissen wir, dass es sich um pycalcxx.mybluemix.net handelt. Ändern und testen Sie daher Zeile 7 von vcap-local.json auf dem Client.

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

Wenn Sie das gleiche Ergebnis erhalten wie bei der lokalen Ausführung, ist die REST-Serverbereitstellung abgeschlossen.

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

Als vom Benutzer bereitgestellter Dienst definiert

Schließlich kann der vom Benutzer bereitgestellte Dienst ausgeführt werden. Wir werden es als vom Benutzer bereitgestellten Dienst festlegen.

Überprüfen Sie den Namen und die Adresse dieses Python-REST-Dienstes.

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

Stellen Sie den Dienstnamen getrennt vom oben genannten App-Namen ein und geben Sie die Adresse der -p-Anmeldeinformationen an.

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

Dadurch werden die Anmeldeinformationen bereitgestellt, die der App beim Binden des Dienstes gegeben wurden. Auf dem Bildschirm der Bluemix-Konsole werden der Bluemix-Dienst und der vom Benutzer bereitgestellte Dienst in derselben Zeile wie unten gezeigt angezeigt.

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

Sie können beispielsweise eine Verbindung von einer anderen App aus herstellen und diese wie folgt verwenden. スクリーンショット 2017-08-23 10.25.06.png

Natürlich können Sie nicht nur über den GUI-Bildschirm des Webs, sondern auch über den Bluemix CLI-Befehl binden und die Bindung aufheben.

bx cf bs phpSamplexx pycalcxxu

Wenn Sie auf der Anwendungsseite auf die Dienstanmeldeinformationen verweisen, können Sie sehen, dass diese der Anwendung wie folgt bereitgestellt werden.

bx cf env phpSamplexx
 <Ausgelassen>
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": []
   }
  ]
 }
}

Beispielcode zur Verwendung des vom Benutzer bereitgestellten REST-Dienstes

Ich habe den PHP-Code, der mit diesem Python-REST-Dienst funktioniert, auf GitHub gestellt, daher denke ich, dass Sie Ihr Verständnis vertiefen können, indem Sie auch darauf verweisen. https://github.com/takara9/php_sample_apl/tree/db2

Dies ist ein einfaches Beispiel, aber ich denke, es kann auf Anwendungen wie die Verwendung eines maschinellen Lernmodells mit Python angewendet werden.

Bildschirmkopie 1 Eingabebildschirm

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

Bildschirmkopie 2 Bildschirm zur Anzeige des REST-Verarbeitungsergebnisses

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

Zusammenfassung

Dieses Mal ist die Story auf eine Phase beschränkt. In Fällen wie DevOps, in denen Entwicklung und Produktionsbetrieb parallel sind, kann die Umgebungsseite der Anwendung die Verbindungszielinformationen des Mikrodienstes bereitstellen, also während der geschäftigen Entwicklung Ich denke, dass es als sichere DevOps-Umgebung verwendet werden kann, da es Unfälle wie versehentliche Fehler im Verbindungsziel und die Zerstörung der Produktionsdaten verhindern kann.

Wenn dann in der Produktion die Leistung des Mikrodienstes nicht ausreicht, besteht der Vorteil, dass die Anzahl der Instanzen leicht erhöht werden kann. Da der Gorouter, der die Lastverteilung übernimmt, im Routing des Mikrodienstes enthalten ist, können Sie die Anzahl der Instanzen erhöhen und skalieren, indem Sie einfach auf + klicken, wie in der Abbildung gezeigt. スクリーンショット 2017-08-23 11.14.03.png

Sie möchten ein wenig mehr nützliche Funktionen. Als nächstes folgt Bluemix API Connect.

Referenzmaterial

(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) PHP Manual Curl Exec http://php.net/manual/ja/function.curl-exec.php (6) Tipps zum Bereitstellen von Flask-Apps mit Python Buildpack in 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) Entwicklung und Verwaltung von Bluemix-Apps # 21.5 Vom Benutzer bereitgestellte Dienstinstanz http://qiita.com/MahoTakara/items/9d03414689fe1b2b9cd2

Recommended Posts

Entwicklung des Bluemix Python Microservice
Hinweise zur Entwicklung von Python-Paketen
Aufbau einer Python-Entwicklungsumgebung
Informationen zur Python-Entwicklungsumgebung
python2.7 Konstruktion der Entwicklungsumgebung
Framework-Entwicklung mit Python
Mikrodienst mit Python (Übersicht)
Slackbot-Entwicklung in Python
Python + Kivy-Entwicklung unter Windows
Organisieren Sie die Python-Entwicklungsumgebung
[ev3dev × Python] Aufbau einer ev3dev-Entwicklungsumgebung
Python-Entwicklung mit Visual Studio 2017
[MEMO] [Entwicklung der Entwicklungsumgebung] Python
[Zum Organisieren] Python-Entwicklungsumgebung
Python-Entwicklung mit Visual Studio
Richten Sie eine Python-Entwicklungsumgebung unter Ubuntu ein
Python-Entwicklung unterstützt durch Jenkins-Unit-Test
Bereiten Sie Ihre erste Python-Entwicklungsumgebung vor
[Python3] Aufbau der Entwicklungsumgebung << Windows Edition >>
GitHub x Python-Entwicklungsvorbereitungsnotiz
Optionen für die Python-Entwicklungsumgebung für Mai 2020
Aufbau einer Python-Entwicklungsumgebung unter macOS
Othello-Spieleentwicklung mit Python
Memo zum Einstellen der Vim + Python-Entwicklungsumgebung
Emacs-Einstellungen für die Python-Entwicklungsumgebung
Installieren Sie die Python-Entwicklungsumgebung unter Windows 10
Konstruktionsnotiz für die Emacs Python-Entwicklungsumgebung
Überprüfen der NAOqi Python-Entwicklungsumgebung
Richten Sie mit Atom eine Python-Entwicklungsumgebung ein
Anwendungsentwicklung mit Docker + Python + Flask
Konstruktionsverfahren für die Python (Anaconda) -Entwicklungsumgebung (SpringToolsSuites) _2020.4
Python-Entwicklungsumgebung für macOS mit venv 2016
[Entwicklungsumgebung] Python mit Xcode [Mit Bildschirmübergang]
Blender 2.82 oder höher + Hinweise zur Python-Entwicklungsumgebung
Entwicklung mobiler Anwendungen mit IBM Bluemix Kinetise (2)
Entwicklung mobiler Anwendungen mit IBM Bluemix Kinetise (1)
Virtualisieren (isolieren) Sie die IBM i Python-Entwicklungsumgebung mit chroot
Entwicklungsverdauung mit Django
Entwicklung des Bluemix Python Microservice
Entwicklung mobiler Anwendungen mit IBM Bluemix Kinetise (2)
Entwicklung mobiler Anwendungen mit IBM Bluemix Kinetise (1)
6 Python-Bibliotheken für schnellere Entwicklung und Debugging
So bereiten Sie die Python-Entwicklungsumgebung vor [Mac]
Aufbau der Python3 + venv + VSCode + macOS-Entwicklungsumgebung
Python: Geschlechtsidentifikation (Entwicklung von Deep Learning) Teil 1
Python: Geschlechtsidentifikation (Entwicklung von Deep Learning) Teil 2
Konstruktionsverfahren für Python-Entwicklungsserver (AWS + Anaconda)
Erstellen Sie eine Python-Entwicklungsumgebung (pythonz, virtualenv, direnv).
Die stärkste Python-Entwicklungsumgebung PyCharms Empfehlung
Erstellen einer Python-Entwicklungsumgebung für die KI-Entwicklung
Erstellen einer Python-Entwicklungsumgebung für Windows + gVim + Poetry
Die stärkste in Python integrierte Entwicklungsumgebung PyCharm