Üheksas praktikum - Mikroteenused
Selles praktikumis jagame oma varasema rakenduse kaheks väiksemaks mikroteenusteks ja käivitame loodud mikroteenuse põhise rakenduse dockeri konteineritena.
Järgmistes praktikumides loome juurde veel ühe mikroteenuse rakenduse kasutaja-liidese jaoks (front-end).
Viited
- Docker'i ülevaade - https://docs.docker.com/get-started/overview/
- Docker käsurea käskude ülevaade - https://docs.docker.com/engine/reference/commandline/cli/
- Dockerfaili spetsifikatsioon - https://docs.docker.com/engine/reference/builder/
Probleemide korral kontrollige:
- Võimalikud probleemid ja nende potentsiaalsed lahendused osa praktikumi juhendi lõpus.
- Küsige otse
#praktikum-9-mikro
Zulip kanalis.- Ka siis kui soovite lihtsalt viheid.
Ülesanne 9.1: Flask rakenduse jagamine kaheks väiksemaks mikroteenuseks.
Selles ülesandes jagame oma Azure Blob Storage't kasutava Python Flask API kaheks mikroteenuseks.
NB! Kui teil mingil põhjusel on vahele jäetud Azure REST API (mis salvestas raamatuid Azure Blob Store'i), siis võite kasutada mõnda oma teist varasemat REST API't, aga praktikumi õpetus võib olla natuke erinev.
Jagage oma Azure Flask API kaheks Python Flask Rakenduseks:
- hs9-flask-api-raamatud
- Sisaldab ainult API meetodeid:
- GET /raamatud/<book_id>
- DELETE /raamatud/<book_id>
- GET /raamatud
- POST /raamatud
- Sisaldab ainult API meetodeid:
- hs9-flask-api-raamatute-otsing
- Sisaldab ainult API meetodeid:
- POST /raamatu_otsing
- Sisaldab ainult API meetodeid:
- Peaks piisama sellest, kui teete projektidest koopiad, ning eemaldate koodi, mis kuulub teisele API'le.
- Testige, et mõlemad Flask API'd töötavad.
- Mõlemad ühenduvad samasse (teie poolt varasemalt üles seatud) Azure Blob Storage teenusesse, et raamatu failidele ligi pääseda.
Ülesanne 9.2: Raamatute otsingu API laiendamine
Muudame hs9-flask-api-raamatute-otsing API rakenduse natukene ümber.
- hs9-flask-api-raamatute-otsing peaks nüüd sisaldama kahte API meetodit:
- POST /raamatu_otsing/raamatu_id
- Konkreetsest raamatust SÕNA otsmimine
- Põhimõtteliselt sama/sarnane meetod, mis eksisteeris enne, aga nüüd võetakse raamatu ID API otspunkti parameetrist.
- Peamised muudatused:
- Peaks otsima sõnasid (Tühikute, reavahetuste ja märkide vahele jäävad sõned), aga mitte suvalisi alamsõnesid.
- Nii, et leiaks sõna "and" lausest: "Cars and busses". Aga mitte lausest "I built a sand castle".
- Raamatu ID ei tule enam kaasa sisend JSON dokumendis, vaid API otspunkti (Endpoint) argumendiga.
- Päring
raamatu_otsing/1234
tähendab seda, et soovime sõne otsida raamatust 1234, kui see eksisteerib meie andmebaasis. - sisend JSON dokumendis enam ei tohiks olla raamatu ID
- Päring
- Peaks otsima sõnasid (Tühikute, reavahetuste ja märkide vahele jäävad sõned), aga mitte suvalisi alamsõnesid.
- POST /raamatu_otsing/
- See on täiestu UUS meetod (kuigi kasutab vana meetodi API otspunkti)
- Kõikidest raamatutest SÕNA otsmimine
- Saame kasutada sama sisend JSON dokumenti, mida eelmises ülesandes. Sisend JSON dokumendis enam ei tohiks olla raamatu ID'd.
- API meetod automaatselt vaatab läbi kõik raamatud, mis meil on andmebaasis.
- Tulemusena tagasistakse iga raamatu kohta milles sõna leidus, mitu korda sõna nendes leidus.
- tagastatav JSON dokument võiks näha välja midagi sellist:
{ "sone": "and", "tulemused": [ { "raamatu_id": 122, "leitud": 226 }, { "raamatu_id": 12341, "leitud": 333 } ] }
- POST /raamatu_otsing/raamatu_id
Ülesanne 9.3: Mikroteenuste konteineriseerimine ja testimine Dockeris
Selles ülesandes konteineriseerime mõlemad mikroteenused. Kuna meil on vaja üles seada ühendus Azure Blob Storage teenusega, siis tuleb seda teha natukene erinevalt eelmise praktikumi sisuga.
Looge Docker pildid mõlema mikroteenuse jaoks. Docker Piltide/Image nimed peaksid olema:
- hs9-flask-api-raamatud
- hs9-flask-api-raamatute-otsing
Konteineriseerimise protsess:
- Saata kasutada sama lähenemist, kui eelmises praktikumis, aga on mõned erinevused:
- DockerFile'is kasutame
python:3-alpine
asemel Python slim Docker pilti:FROM python:3.8-slim
- requirements.txt faili peame lisama veel ühe teegi:
azure-storage-blob
- Peame sisse viima ka mõned muudatused Flask rakenduses:
- Peame liigutama Azure ühenduse konfigureerimisega seotud koodi välja
if __name__ == _main_:
blokist.__main__
bloki sisu käivitatakse ainult siis, kui rakendus pannakse tööle tavalise Python rakendusena.- Aga meie (eelmise nädala) Docker conteiner käivitab rakenduse Flask mooduli kaudu, mis tähendab seda, et main plokki ei käivitata kunagi Docker konteineri sees.
- Liigutage Azure blob seadistamisega seotud kood main plokist väljaspoole (enne main plokki). See võiks välja näha "umbes" nii:
# Azure blob konfiguratsioon blob_connection_string = os.getenv('AZURE_BLOB_CONNECTION_STRING') blob_service_client = BlobServiceClient.from_connection_string(blob_connection_string) blob_container_name = "pellepraks7blob" if __name__ == '__main__': app.run(debug = True)
- NB! ärge ära unustage kontrollida et blob_container_name väärtus on teie blob konteineri oma!
- Peame liigutama Azure ühenduse konfigureerimisega seotud koodi välja
- AZURE_BLOB_CONNECTION_STRING seadistame alles konteineri käivitamisel, et see ei oleks ühtegi faili salvestatud ning ei lekiks kogemata.
- Soovituslik on kopeerida AZURE_BLOB_CONNECTION_STRING väärtus Azure Pilvetehnloloogia praktikumi PyCharm projektist.
- DockerFile'is kasutame
Docker konteinerite käivitamine:
- Paneme hs9-flask-api-raamatud tööle pordi 5000 peal ning hs9-flask-api-raamatute-otsing tööle pordi 5001 peal:
docker run -di -p 5000:5000 --env "AZURE_BLOB_CONNECTION_STRING=DefaultEndpointsProtocol=https;Account...=;EndpointSuffix=core.windows.net" hs9-flask-api-raamatud
docker run -di -p 5001:5000 --env "AZURE_BLOB_CONNECTION_STRING=DefaultEndpointsProtocol=https;Account...=;EndpointSuffix=core.windows.net" hs9-flask-api-raamatute-otsing
- Kindlasti asendage AZURE_BLOB_CONNECTION_STRING väärtus õige - oma Azure teenuse ühenduse konfiguratsiooni - väärtusega.
Testige nüüd, kas raamatute alla tõmbamine ja kustutamine töötab!
- Vigade korral saate uurida Flask API rakenduste/konteinerite väljundeid
Esitada: tehke ekraanivaated, mis näitavad et konteinerite jooksutamine õnnestus ning saab:
- Raamatu nimekirja vaadata
- Raamatuid luua
- Raamatut kustutada
- Raamatu sisu vaadata (alla laadida)
- Raamatust otsida sõna
- Kõikidest (alla laetud) Raamatutest otsida sõna
Boonus Ülesanne: Docker compose kasutamine, et üles seada kõik mikroteenused korraga
See ülesanne on iseseisev.
Eesmärk: Looge docker compose fail, mis kirjeldab ära mõlemad mikroteenused ning mis võimaldab docker compose
käskude abil kõik mikroteenused korraga ja ühtse Docker teenuse komplektina üles seada.
NB! Ei ole lubatud Azure ühendus stringi docker compose faili sisse või dokeri failide sisse jätta! peaks lisama Docker compose käsu argumendiva või keskkonna muutujana, või failist.
Alustada saab umbes sellisest skeletonist:
version: "3" services: raamatud-api: image: hs9-flask-api-raamatud ports: - 5000:5000 ... raamatud-otsing-api: image: hs9-flask-api-raamatute-otsing ports: - 5001:5000 ...
PS! Selleks, et teenused "igavesti" jooksma jätta (otseselt seda meil vaja teha ei ole), saab compose faili lisada: restart: unless-stopped
Tehke ekraanivaade, milles on näha Docker compose käsk mida kasutasite, ning selle väljund.
Boonus ülesande lahendusena esitada:
- Docker compose fail
- Ekraanivaade tulemusest
Lahenduse esitamine
Praktikumi lahendusena tuleb esitada:
- Mikroteenuse koodi projekti kaustad koos Dockerfailidega
- Ärge pange kaasa Python venv kaustasid!
- Ekraanivaated ülesandest 9.3
- Vastus küsimusele:
- Kas mõni meie poolt loodud või muudetud meetod eksib REST API reeglite vastu (Loeng 5)?
- Kui jah, siis milline meetod?
- Kui jah, mille vastu ta eksib?
- Kas mõni meie poolt loodud või muudetud meetod eksib REST API reeglite vastu (Loeng 5)?