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.
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.
- Jelentkezzen be az Azure Portalra.
- A lap bal felső részén válassza az + Erőforrás létrehozása lehetőséget.
- 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.
- A SignalR szolgáltatás oldalán válassza a Létrehozás lehetőséget.
- 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.
- Válassza az Alapismeretek lap alján található Véleményezés + létrehozás gombot.
- 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.
- Amikor az üzembe helyezés befejeződött, válassza az Erőforrás megnyitása gombot.
- A SignalR erőforráslapján válassza a bal oldali menü kulcsait a Gépház alatt.
- 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.
- Parancssorból hozzon létre egy könyvtárat a projekthez.
- Váltson a projektkönyvtárra.
- 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
- 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.
- Parancssorból hozzon létre egy könyvtárat a projekthez.
- Váltson a projektkönyvtárra.
- 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.
- Futtassa a következő parancsot a
index
függvény létrehozásához.
func new -n index -t HttpTrigger
- 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"
}
]
}
- 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
- Futtassa a következő parancsot a
negotiate
függvény létrehozásához.
func new -n negotiate -t HttpTrigger
- 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"
}
]
}
- 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.
- 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
- 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"
}
]
}
- 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.
- Hozzon létre egy mappát
content
a projekt gyökérmappájában. - Hozza létre a fájlt content/index.html.
- 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.
Az Azure Portalon lépjen a korábban üzembe helyezett SignalR-példányra.
Válassza a Kulcsok elemet a SignalR-szolgáltatáspéldány kapcsolati sztringjeinek megtekintéséhez.
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:
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.
Az ekkor megnyíló új ablakban válassza ki az erőforráscsoportot, és kattintson az Erőforráscsoport törlése elemre.
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.