Rövid útmutató: Kiszolgáló nélküli alkalmazás létrehozása az Azure Functions és az Azure SignalR Service használatával a Pythonban

Ismerkedés az Azure SignalR Szolgáltatással az Azure Functions és a Python használatával egy kiszolgáló nélküli alkalmazás létrehozásához, amely üzeneteket küld az ügyfeleknek. A függvényt a helyi környezetben fogja futtatni, és a felhőben lévő Azure SignalR-szolgáltatáspéldányhoz csatlakozik. Ennek a rövid útmutatónak a elvégzése néhány dollárcent vagy annál kisebb költséggel jár az Azure-fiókjában.

Feljegyzés

A cikkben szereplő kódot a GitHubról szerezheti be.

Előfeltételek

Ez a rövid útmutató macOS, Windows vagy Linux rendszeren is futtatható. A következőkre lesz szüksége:

Előfeltételek Leírás
Azure-előfizetés Ha nem rendelkezik Azure-előfizetéssel, hozzon létre ingyenes Azure-fiókot
Kódszerkesztő Szüksége lesz egy kódszerkesztőre, például a Visual Studio Code-ra.
Azure Functions Core Tools A Python Azure-függvényalkalmazások helyi futtatásához a 2.7.1505-ös vagy újabb verzió szükséges.
Python 3.7+ Az Azure Functions használatához Python 3.7+ szükséges. Lásd: Támogatott Python-verziók.
Azurite A SignalR-kötéshez Azure Storage szükséges. Helyi tárolóemulátort akkor használhat, ha egy függvény helyileg fut.
Azure CLI Az Azure CLI használatával is létrehozhat egy Azure SignalR-szolgáltatáspéldányt.

Azure SignalR Service-példány létrehozása

Ebben a szakaszban egy alapszintű Azure SignalR-példányt hoz létre az alkalmazáshoz. Az alábbi lépések az Azure Portal használatával hoznak létre új példányt, de használhatja az Azure CLI-t is. További információ: az signalr create command in the Azure SignalR Service CLI Reference.

  1. Jelentkezzen be az Azure Portalra.
  2. A lap bal felső részén válassza az + Erőforrás létrehozása lehetőséget.
  3. Az Erőforrás létrehozása lap Search szolgáltatás és piactér szövegmezőjében adja meg a signalr kifejezést, majd válassza ki a SignalR szolgáltatást a listából.
  4. A SignalR szolgáltatás oldalán válassza a Létrehozás lehetőséget.
  5. Az Alapok lapon adja meg az új SignalR-szolgáltatáspéldány alapvető adatait. Írja be a következő értékeket:
Mező Ajánlott érték Leírás
Előfizetés Válassza ki az előfizetését Válassza ki azt az előfizetést, amelyet egy új SignalR-szolgáltatáspéldány létrehozásához szeretne használni.
Erőforráscsoport SignalRTestResources nevű erőforráscsoport létrehozása Válasszon ki vagy hozzon létre egy erőforráscsoportot a SignalR-erőforráshoz. Hasznos, ha egy új erőforráscsoportot hoz létre ehhez az oktatóanyaghoz ahelyett, hogy meglévő erőforráscsoportot használ. Ha az oktatóanyag elvégzése után szeretné felszabadítani az erőforrásokat, törölje az erőforráscsoportot.

Az erőforráscsoport törlése a csoporthoz tartozó összes erőforrást is törli. Ez a művelet nem vonható vissza. Mielőtt töröl egy erőforráscsoportot, győződjön meg arról, hogy nem tartalmazza a megtartani kívánt erőforrásokat.

További információk: Erőforráscsoportok használata az Azure-erőforrások kezeléséhez.
Erőforrás neve testsignalr Írja be a SignalR-erőforráshoz használandó egyedi erőforrásnevet. Ha a testsignalr már szerepel a régióban, adjon hozzá egy számjegyet vagy karaktert, amíg a név egyedi nem lesz.

A névnek 1–63 karakter hosszúságú sztringnek kell lennie, és csak számokat, betűket és kötőjelet (-) tartalmazhat. A név nem kezdődhet és nem végződhet kötőjeljellel, és az egymást követő kötőjelkarakterek érvénytelenek.
Régió Régió kiválasztása Válassza ki az új SignalR-szolgáltatáspéldány megfelelő régióját.

Az Azure SignalR szolgáltatás jelenleg nem érhető el minden régióban. További információ: Azure SignalR Service-régió rendelkezésre állása
Tarifacsomag Válassza a Módosítás lehetőséget, majd válassza az Ingyenes (Csak dev/Test) lehetőséget. Válassza a Kiválasztás lehetőséget a tarifacsomag kiválasztásának megerősítéséhez. Az Azure SignalR szolgáltatás három tarifacsomagot tartalmaz: ingyenes, standard és prémium. Az oktatóanyagok az ingyenes szintet használják, hacsak az előfeltételek másként nem rendelkeznek.

A szintek és a díjszabás közötti funkcióbeli különbségekről további információt az Azure SignalR Service díjszabásában talál .
Szolgáltatás mód Válassza ki a megfelelő szolgáltatási módot Az Alapértelmezett beállítást akkor használja, ha a SignalR hub logikáját üzemelteti a webalkalmazásokban, és proxyként használja a SignalR szolgáltatást. Kiszolgáló nélküli technológiát, például az Azure Functionst használva üzemeltetheti a SignalR hub logikáját.

A klasszikus mód csak a visszamenőleges kompatibilitást szolgálja, ezért nem ajánlott használni.

További információ: Szolgáltatás mód az Azure SignalR Service-ben.

A SignalR-oktatóanyagok Hálózatkezelés és Címkék lapján nem kell módosítania a beállításokat.

  1. Válassza az Alapismeretek lap alján található Véleményezés + létrehozás gombot.
  2. A Véleményezés + létrehozás lapon tekintse át az értékeket, majd válassza a Létrehozás lehetőséget. Az üzembe helyezés végrehajtása néhány percet vesz igénybe.
  3. Amikor az üzembe helyezés befejeződött, válassza az Erőforrás megnyitása gombot.
  4. A SignalR erőforráslapján válassza a bal oldali menü kulcsait a Gépház alatt.
  5. Másolja ki az elsődleges kulcshoz tartozó Csatlakozás ion sztringet. Erre a kapcsolati sztring van szüksége az alkalmazás konfigurálásához az oktatóanyag későbbi részében.

Az Azure-függvényprojekt létrehozása

Hozzon létre egy helyi Azure-függvényprojektet.

  1. Parancssorból hozzon létre egy könyvtárat a projekthez.
  2. Váltson a projektkönyvtárra.
  3. Az Azure Functions func init paranccsal inicializálhatja a függvényprojektet.
# Initialize a function project
func init --worker-runtime python

A függvények létrehozása

A projekt inicializálása után függvényeket kell létrehoznia. Ehhez a projekthez három függvény szükséges:

  • index: Egy ügyfél webhelyét üzemelteti.
  • negotiate: Lehetővé teszi az ügyfél számára a hozzáférési jogkivonat lekérését.
  • broadcast: Idő eseményindítóval rendszeres időközönként küld üzeneteket az összes ügyfélnek.

Amikor a parancsot a func new projekt gyökérkönyvtárából futtatja, az Azure Functions Core Tools hozzáfűzi a fájlban lévő function_app.py függvénykódot. Szükség szerint szerkessze a paraméteres hirdetés tartalmát úgy, hogy az alapértelmezett kódot az alkalmazáskódra cseréli.

Az indexfüggvény létrehozása

Ezt a mintafüggvényt sablonként használhatja saját függvényeihez.

Nyissa meg a fájlt function_app.py. Ez a fájl tartalmazza a függvényeket. Először módosítsa a fájlt úgy, hogy tartalmazza a szükséges importálási utasításokat, és határozza meg azokat a globális változókat, amelyeket az alábbi függvényekben fogunk használni.

import azure.functions as func
import os
import requests
import json 

app = func.FunctionApp()

etag = ''
start_count = 0
  1. A függvény index hozzáadása a következő kód hozzáadásával
@app.route(route="index", auth_level=func.AuthLevel.ANONYMOUS)
def index(req: func.HttpRequest) -> func.HttpResponse:
    f = open(os.path.dirname(os.path.realpath(__file__)) + '/content/index.html')
    return func.HttpResponse(f.read(), mimetype='text/html')

Ez a függvény egy ügyfél weblapját tárolja.

A egyeztetési függvény létrehozása

A függvény negotiate hozzáadása a következő kód hozzáadásával

@app.route(route="negotiate", auth_level=func.AuthLevel.ANONYMOUS, methods=["POST"])
@app.generic_input_binding(arg_name="connectionInfo", type="signalRConnectionInfo", hubName="serverless", connectionStringSetting="AzureSignalRConnectionString")
def negotiate(req: func.HttpRequest, connectionInfo) -> func.HttpResponse:
    return func.HttpResponse(connectionInfo)

Ez a függvény lehetővé teszi, hogy az ügyfél hozzáférési jogkivonatot kapjon.

Hozzon létre egy szórási függvényt.

A függvény broadcast hozzáadása a következő kód hozzáadásával

@app.timer_trigger(schedule="*/1 * * * *", arg_name="myTimer",
              run_on_startup=False,
              use_monitor=False)
@app.generic_output_binding(arg_name="signalRMessages", type="signalR", hubName="serverless", connectionStringSetting="AzureSignalRConnectionString")
def broadcast(myTimer: func.TimerRequest, signalRMessages: func.Out[str]) -> None:
    global etag
    global start_count
    headers = {'User-Agent': 'serverless', 'If-None-Match': etag}
    res = requests.get('https://api.github.com/repos/azure/azure-functions-python-worker', headers=headers)
    if res.headers.get('ETag'):
        etag = res.headers.get('ETag')

    if res.status_code == 200:
        jres = res.json()
        start_count = jres['stargazers_count']

    signalRMessages.set(json.dumps({
        'target': 'newMessage',
        'arguments': [ 'Current star count of https://api.github.com/repos/azure/azure-functions-python-worker is: ' + str(start_count) ]
    }))

Ez a függvény egy idő eseményindítót használ az üzenetek rendszeres küldéséhez az összes ügyfélnek.

Az Azure-függvényprojekt létrehozása

Hozzon létre egy helyi Azure-függvényprojektet.

  1. Parancssorból hozzon létre egy könyvtárat a projekthez.
  2. Váltson a projektkönyvtárra.
  3. Az Azure Functions func init paranccsal inicializálhatja a függvényprojektet.
# Initialize a function project
func init --worker-runtime python --model v1

A függvények létrehozása

A projekt inicializálása után függvényeket kell létrehoznia. Ehhez a projekthez három függvény szükséges:

  • index: Egy ügyfél webhelyét üzemelteti.
  • negotiate: Lehetővé teszi az ügyfél számára a hozzáférési jogkivonat lekérését.
  • broadcast: Idő eseményindítóval rendszeres időközönként küld üzeneteket az összes ügyfélnek.

Amikor a parancsot a func new projekt gyökérkönyvtárából futtatja, az Azure Functions Core Tools létrehozza az alapértelmezett függvényforrásfájlokat, és a függvényről elnevezett mappában tárolja őket. Szükség szerint szerkessze a fájlokat, és cserélje le az alapértelmezett kódot az alkalmazáskódra.

Az indexfüggvény létrehozása

Ezt a mintafüggvényt sablonként használhatja saját függvényeihez.

  1. Futtassa a következő parancsot a index függvény létrehozásához.
func new -n index -t HttpTrigger
  1. Szerkessze az indexet/function.json , és cserélje le a tartalmat a következő JSON-kódra:
{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}
  1. Szerkessze az index/_init_.py és cserélje le a tartalmat a következő kódra:
import os

import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:
    f = open(os.path.dirname(os.path.realpath(__file__)) + '/../content/index.html')
    return func.HttpResponse(f.read(), mimetype='text/html')

A egyeztetési függvény létrehozása

  1. Futtassa a következő parancsot a negotiate függvény létrehozásához.
func new -n negotiate -t HttpTrigger
  1. Szerkessze az egyeztetési/function.json , és cserélje le a tartalmat a következő JSON-kódra:
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "type": "signalRConnectionInfo",
      "name": "connectionInfo",
      "hubName": "serverless",
      "connectionStringSetting": "AzureSignalRConnectionString",
      "direction": "in"
    }
  ]
}
  1. Szerkessze az egyeztetési/_init_.py és cserélje le a tartalmat a következő kódra:
import azure.functions as func


def main(req: func.HttpRequest, connectionInfo) -> func.HttpResponse:
    return func.HttpResponse(connectionInfo)

Hozzon létre egy szórási függvényt.

  1. Futtassa a következő parancsot a broadcast függvény létrehozásához.
func new -n broadcast -t TimerTrigger
# install requests
pip install requests
  1. Szerkessze a közvetítést/function.json , és cserélje le a tartalmat a következő kódra:
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "*/5 * * * * *"
    },
    {
      "type": "signalR",
      "name": "signalRMessages",
      "hubName": "serverless",
      "connectionStringSetting": "AzureSignalRConnectionString",
      "direction": "out"
    }
  ]
}
  1. Szerkessze a broadcast/_init_.py és cserélje le a tartalmat a következő kódra:
import requests
import json

import azure.functions as func

etag = ''
start_count = 0

def main(myTimer: func.TimerRequest, signalRMessages: func.Out[str]) -> None:
    global etag
    global start_count
    headers = {'User-Agent': 'serverless', 'If-None-Match': etag}
    res = requests.get('https://api.github.com/repos/azure/azure-signalr', headers=headers)
    if res.headers.get('ETag'):
        etag = res.headers.get('ETag')

    if res.status_code == 200:
        jres = res.json()
        start_count = jres['stargazers_count']

    signalRMessages.set(json.dumps({
        'target': 'newMessage',
        'arguments': [ 'Current star count of https://github.com/Azure/azure-signalr is: ' + str(start_count) ]
    }))

A index.html fájl létrehozása

Az alkalmazás ügyfélfelülete egy weblap. A index függvény HTML-tartalmat olvas be a content/index.html fájlból.

  1. Hozzon létre egy mappát content a projekt gyökérmappájában.
  2. Hozza létre a fájlt content/index.html.
  3. Másolja a következő tartalmat a content/index.html fájlba, és mentse:
<html>

<body>
  <h1>Azure SignalR Serverless Sample</h1>
  <div id="messages"></div>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/3.1.7/signalr.min.js"></script>
  <script>
    let messages = document.querySelector('#messages');
    const apiBaseUrl = window.location.origin;
    const connection = new signalR.HubConnectionBuilder()
        .withUrl(apiBaseUrl + '/api')
        .configureLogging(signalR.LogLevel.Information)
        .build();
      connection.on('newMessage', (message) => {
        document.getElementById("messages").innerHTML = message;
      });

      connection.start()
        .catch(console.error);
  </script>
</body>

</html>

Adja hozzá a SignalR szolgáltatás kapcsolati sztring a függvényalkalmazás beállításaihoz

Az utolsó lépés a SignalR szolgáltatás kapcsolati sztring beállítása az Azure-függvényalkalmazás beállításaiban.

  1. Az Azure Portalon lépjen a korábban üzembe helyezett SignalR-példányra.

  2. Válassza a Kulcsok elemet a SignalR-szolgáltatáspéldány kapcsolati sztringjeinek megtekintéséhez.

    Képernyőkép az Azure SignalR szolgáltatáskulcsok oldaláról.

  3. Másolja ki az elsődleges kapcsolati sztring, és hajtsa végre a következő parancsot:

    func settings add AzureSignalRConnectionString "<signalr-connection-string>"
    

Az Azure-függvényalkalmazás helyi futtatása

Indítsa el az Azurite Storage emulátort:

azurite 

Futtassa az Azure-függvényalkalmazást a helyi környezetben:

func start

Feljegyzés

Ha olvasási hibákat észlel a blobtárolóban, győződjön meg arról, hogy az "AzureWebJobsStorage" beállítás a local.settings.json fájlban be van állítva UseDevelopmentStorage=true.

Miután az Azure-függvény helyileg fut, nyissa meg a következőt http://localhost:7071/api/index: . A lapon látható a GitHub Azure/azure-signalr-adattár aktuális csillagszáma. Amikor a GitHubon csillagozza vagy leválasztja az adattárat, néhány másodpercenként megjelenik a frissített szám.

Az erőforrások eltávolítása

Ha nem használja tovább az alkalmazást, akkor a következő lépésekkel a mintaalkalmazás által létrehozott összes erőforrást törölheti a költségek elkerülése érdekében:

  1. Az Azure Portalon válassza az Erőforráscsoportok lehetőséget a bal szélen, majd a létrehozott erőforráscsoport. Másik lehetőségként a keresőmezőben, név alapján is rákereshet az erőforráscsoportra.

  2. Az ekkor megnyíló új ablakban válassza ki az erőforráscsoportot, és kattintson az Erőforráscsoport törlése elemre.

  3. Az új ablakban írja be a törölni kívánt erőforráscsoport nevét, majd kattintson a Törlés elemre.

Problémákat tapasztal? Próbálja ki a hibaelhárítási útmutatót , vagy tudassa velünk.

Következő lépések

Ebben a rövid útmutatóban egy valós idejű kiszolgáló nélküli alkalmazást készített és futtatott helyi nyelven. A következő lépésben megtudhatja, hogyan használhat kétirányú kommunikációt az ügyfelek és az Azure-függvény között a SignalR Szolgáltatással.