Institute of Computer Science
  1. Courses
  2. 2023/24 spring
  3. Development of web services and distributed systems (LTAT.06.018)
ET
Log in

Development of web services and distributed systems 2023/24 spring

  • Pealeht
  • Loengud
  • Praktikumid
  • Lahenduste Esitamine

Ü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

  1. Docker'i ülevaade - https://docs.docker.com/get-started/overview/
  2. Docker käsurea käskude ülevaade - https://docs.docker.com/engine/reference/commandline/cli/
  3. Dockerfaili spetsifikatsioon - https://docs.docker.com/engine/reference/builder/

Probleemide korral kontrollige:

  1. Võimalikud probleemid ja nende potentsiaalsed lahendused osa praktikumi juhendi lõpus.
  2. 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:

  1. hs9-flask-api-raamatud
    • Sisaldab ainult API meetodeid:
      • GET /raamatud/<book_id>
      • DELETE /raamatud/<book_id>
      • GET /raamatud
      • POST /raamatud
  2. hs9-flask-api-raamatute-otsing
    • Sisaldab ainult API meetodeid:
      • POST /raamatu_otsing
  • 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:
    1. 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:
        1. 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".
        2. 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
    2. 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
                    }
                ]
            }

Ü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:

  1. hs9-flask-api-raamatud
  2. hs9-flask-api-raamatute-otsing

Konteineriseerimise protsess:

  • Saata kasutada sama lähenemist, kui eelmises praktikumis, aga on mõned erinevused:
    1. DockerFile'is kasutame python:3-alpine asemel Python slim Docker pilti:
      • FROM python:3.8-slim
    2. requirements.txt faili peame lisama veel ühe teegi:
      • azure-storage-blob
    3. 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!
    4. 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.

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:
    1. docker run -di -p 5000:5000 --env "AZURE_BLOB_CONNECTION_STRING=DefaultEndpointsProtocol=https;Account...=;EndpointSuffix=core.windows.net" hs9-flask-api-raamatud
    2. 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:

  1. Raamatu nimekirja vaadata
  2. Raamatuid luua
  3. Raamatut kustutada
  4. Raamatu sisu vaadata (alla laadida)
  5. Raamatust otsida sõna
  6. 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:

  1. Docker compose fail
  2. Ekraanivaade tulemusest

Lahenduse esitamine

Praktikumi lahendusena tuleb esitada:

  1. Mikroteenuse koodi projekti kaustad koos Dockerfailidega
    • Ärge pange kaasa Python venv kaustasid!
  2. Ekraanivaated ülesandest 9.3
  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?
You must be logged in and registered to the course in order to submit solutions.

Võimalikud probleemid ja nende potentiaalsed lahendused.

  • Institute of Computer Science
  • Faculty of Science and Technology
  • University of Tartu
In case of technical problems or questions write to:

Contact the course organizers with the organizational and course content questions.
The proprietary copyrights of educational materials belong to the University of Tartu. The use of educational materials is permitted for the purposes and under the conditions provided for in the copyright law for the free use of a work. When using educational materials, the user is obligated to give credit to the author of the educational materials.
The use of educational materials for other purposes is allowed only with the prior written consent of the University of Tartu.
Terms of use for the Courses environment