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.
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.
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.
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.
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.
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)
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.
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.
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.
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.
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.
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
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
*
Ö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.
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 ?>
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.
Für POST-Daten gibt der Python-REST-Beispielserver das Ergebnis der Multiplikation von a und b zurück.
Für POST erforderliche Parameter wie URI, Basisauthentifizierungsbenutzer und -kennwort, Formulardaten usw. werden festgelegt.
Führen Sie HTTP POST aus, um das Ergebnis abzurufen und auf dem Bildschirm anzuzeigen.
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
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.
Sie können beispielsweise eine Verbindung von einer anderen App aus herstellen und diese wie folgt verwenden.
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": []
}
]
}
}
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.
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.
Sie möchten ein wenig mehr nützliche Funktionen. Als nächstes folgt Bluemix API Connect.
(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