Esercizio: abilitare gli aggiornamenti automatici in un'applicazione Web con il Servizio SignalR
Per aggiungere SignalR a questo prototipo, è necessario creare:
- Una risorsa di Azure SignalR
- Alcune nuove funzioni per supportare SignalR
- Aggiornare il client per supportare SignalR
Creare una risorsa SignalR
È necessario creare una risorsa Azure SignalR.
Tornare al terminale per creare la risorsa SignalR.
Passare alla sottodirectory
setup-resources
per creare la risorsa.cd stock-prototype/setup-resources && bash create-signalr-resources.sh & cd ..
Copiare la stringa di connessione per la risorsa SignalR. È necessario aggiornare il codice del server.
Tipo di risorsa Variabile di ambiente Azure SignalR Detto SIGNALR_CONNECTION_STRING
Aggiornare le variabili di ambiente di configurazione del server
In ./start/server/local.settings.jsonaggiungere una variabile all'oggetto Valori denominato SIGNALR_CONNECTION_STRING
con il valore elencato nel terminale e salvare il file.
Creare la funzione signalr-open-connection
Il client Web usa l'SDK del client SignalR per stabilire una connessione al server. L'SDK recupera la connessione tramite una funzione denominata signalr-open-connection per connettersi al servizio.
Aprire il riquadro comandi di Visual Studio Code premendo F1.
Cercare e selezionare il comando Funzioni di Azure: Crea funzione.
Scegliere Impostazione predefinita e quindi selezionare avvio/server per impostare il percorso dell'app per le funzioni.
Selezionare Sì quando viene chiesto di inizializzare il progetto per l'uso con VS Code?.
Quando richiesto, specificare le informazioni seguenti.
Nome valore Modello Trigger HTTP Nome signalr-open-connection Un file denominato signalr-open-connection.ts è ora disponibile in
./start/server/src/functions
.Aprire signalr-open-connection.ts e sostituire tutto con il codice seguente.
import { app, input } from '@azure/functions'; const inputSignalR = input.generic({ type: 'signalRConnectionInfo', name: 'connectionInfo', hubName: 'default', connectionStringSetting: 'SIGNALR_CONNECTION_STRING', }); app.http('open-signalr-connection', { authLevel: 'anonymous', handler: (request, context) => { return { body: JSON.stringify(context.extraInputs.get(inputSignalR)) } }, route: 'negotiate', extraInputs: [inputSignalR] });
Le informazioni di connessione SignalR vengono restituite dalla funzione.
Creare la funzione signalr-send-message
Aprire il riquadro comandi di Visual Studio Code premendo F1.
Cercare e selezionare il comando Funzioni di Azure: Crea funzione.
Selezionare il percorso dell'app per le funzioni come avvio/server.
Quando richiesto, specificare le informazioni seguenti.
Nome valore Modello Trigger di Azure Cosmos DB Nome signalr-send-message
Stringa di connessione di Cosmos DB COSMOSDB_CONNECTION_STRING Nome del database da monitorare stocksdb
Nome raccolta stocks
Verifica l'esistenza e crea automaticamente la raccolta di lease true Aggiornare la finestra di Explorer in Visual Studio Code per visualizzare gli aggiornamenti. Un file denominato signalr-open-connection è ora disponibile in
./start/server/src/functions
.Aprire signalr-send-message.ts e sostituire tutti gli elementi con il codice seguente.
import { app, output, CosmosDBv4FunctionOptions, InvocationContext } from "@azure/functions"; const goingOutToSignalR = output.generic({ type: 'signalR', name: 'signalR', hubName: 'default', connectionStringSetting: 'SIGNALR_CONNECTION_STRING', }); export async function dataToMessage(documents: unknown[], context: InvocationContext): Promise<void> { try { context.log(`Documents: ${JSON.stringify(documents)}`); documents.map(stock => { // @ts-ignore context.log(`Get price ${stock.symbol} ${stock.price}`); context.extraOutputs.set(goingOutToSignalR, { 'target': 'updated', 'arguments': [stock] }); }); } catch (error) { context.log(`Error: ${error}`); } } const options: CosmosDBv4FunctionOptions = { connection: 'COSMOSDB_CONNECTION_STRING', databaseName: 'stocksdb', containerName: 'stocks', createLeaseContainerIfNotExists: true, feedPollDelay: 500, handler: dataToMessage, extraOutputs: [goingOutToSignalR], }; app.cosmosDB('send-signalr-messages', options);
- Definire i dati in ingresso: L'oggetto
comingFromCosmosDB
definisce il trigger cosmos DB per controllare le modifiche. - Definire il trasporto in uscita: L'oggetto
goingOutToSignalR
definisce la stessa connessione SignalR. HubName è lo stesso hubdefault
. - Connettere i dati al trasporto:
dataToMessage
ottiene gli elementi modificati nella tabellastocks
e invia ogni elemento modificato singolarmente tramite SignalR usando ilextraOutputs
usando lo stesso hubdefault
. - Connettersi all'app:
app.CosmosDB
associa i binding al nome della funzionesend-signalr-messages
.
Eseguire il commit delle modifiche e il push in GitHub
Nel terminale eseguire il commit delle modifiche nel repository.
git add . git commit -m "Add SignalR functions" git push
Creare la funzione signalr-send-message
Creare un'app per le funzioni e le risorse correlate in Azure in cui è possibile pubblicare il nuovo codice delle funzioni.
Aprire il portale di Azure per creare una nuova app per le funzioni.
Usare le informazioni seguenti per completare la creazione di risorse nella scheda Informazioni di base.
Nome Valore Gruppo di risorse Creare un nuovo nome di gruppo di risorse stock-prototype
.Nome dell'app per le funzioni Anteporre il nome a api
. Ad esempio:api-jamie
.Codice o contenitore Selezionare codice. Stack di runtime selezionare Node.js. Versione Selezionare una versione LTS di Node.js. Paese Selezionare un'area nelle vicinanze. Sistema operativo Selezionare Linux. Hosting Selezionare Piano a consumo. Non compilare altre schede e selezionare Rivedi e crea e quindi Crea. Attendere il completamento della distribuzione prima di continuare.
Selezionare Vai alla risorsa per aprire la nuova app per le funzioni.
Configurare la distribuzione di GitHub
Connettere la nuova app per le funzioni al repository GitHub per abilitare la distribuzione continua. In un ambiente di produzione si distribuiscono invece le modifiche al codice in uno slot di staging prima di scambiarle nell'ambiente di produzione.
Nella pagina del portale di Azure per la nuova app per le funzioni selezionare Centro distribuzione dal menu a sinistra.
Selezionare Origine di GitHub.
Usare le informazioni seguenti per completare la configurazione della distribuzione.
Nome Valore Organizzazione Selezionare l'account GitHub. Repository Cercare e selezionare mslearn-advocates.azure-functions-and-signalr
.Ramo Selezionare il ramo main. Opzioni flusso di lavoro Selezionare Aggiungi un flusso di lavoro .... Tipo di autenticazione Selezionare l’identità assegnata dall'utente. Subscription Selezionare la stessa sottoscrizione visualizzata nella parte superiore della pagina. Identità Selezionare Crea nuovo. Selezionare Salva nella parte superiore della sezione per salvare le impostazioni. Verrà creato un nuovo file del flusso di lavoro nel repository con fork.
Questa configurazione di distribuzione crea un file del flusso di lavoro GitHub Actions nel repository. È necessario aggiornare il file del flusso di lavoro per usare il percorso del pacchetto corretto per l'app per le funzioni.
A questo punto, la distribuzione di GitHub potrebbe generare un errore a causa di una configurazione errata nell’identità gestita assegnata dall’utente creata nel gruppo di risorse in Azure.
Aggiornare l’identità gestita
- Nella pagina della nuova app per le funzioni nel portale di Azure, selezionare il gruppo di risorse in Panoramica>Essenziali e quindi selezionare l’identità gestita in Risorse. Questa identità gestita è stata creata da Funzioni al momento dell’abilitazione della distribuzione di GitHub.
- Nella pagina identità gestita, selezionare Impostazioni>credenziali federate e quindi selezionare le credenziali esistenti.
- In Connetti l'account Github modificare l'impostazione per Entità in Ambiente e immettere
Production
per Ambiente. - Selezionare Aggiorna per aggiornare le credenziali.
Modificare il flusso di lavoro di distribuzione di GitHub
Nel terminale di Visual Studio Code trascinare il nuovo file del flusso di lavoro dal fork (origine).
git pull origin main
Verrà posizionata una nuova cartella in .github con un percorso al file del flusso di lavoro:
.github/workflows/main_RESOURCE_NAME.yml
doveRESOURCE_NAME
è il nome dell’app per le funzioni.Aprire il file del flusso di lavoro e modificare il valore
name
nella parte superiore del file inServer
.Dal momento che il repository di origine include l’app per le funzioni in una sottodirectory, il file di azione deve essere cambiato per riflettere tale valore. Nella sezione env aggiungere una nuova variabile denominata
PACKAGE_PATH
per usare il percorso del pacchetto.env: PACKAGE_PATH: 'start/server'
Trovare il passaggio Risolvere le dipendenze del progetto usando Npm e sostituire il contenuto con il codice YAML seguente per usare anche il percorso della sottodirectory del pacchetto. La modifica critica è il percorso nel comando
pushd
per includere la variabileenv.PACKAGE_PATH
.- name: 'Resolve Project Dependencies Using Npm' shell: bash run: | pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}/${{ env.PACKAGE_PATH }}' npm install npm run build --if-present npm run test --if-present popd
Trovare il passaggio artefatto zip per la distribuzione e sostituire il contenuto con il codice YAML seguente per usare anche il percorso della sottodirectory del pacchetto.
- name: Zip artifact for deployment run: | pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}/${{ env.PACKAGE_PATH }}' zip -r release.zip . popd cp ./${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}/${{ env.PACKAGE_PATH }}/release.zip ./release.zip
Il file ZIP viene inserito nella radice del repository in modo che il valore
../
sia necessario per posizionare il file ZIP nella radice.Salvare il file ed eseguire il commit delle modifiche nel repository.
git add . git commit -m "Update deployment workflow to use package path" git push
Questa modifica attiverà l'esecuzione del flusso di lavoro. È possibile guardare il flusso di lavoro dalla sezione Azioni del fork in GitHub.
Configurare le variabili di ambiente per le funzioni API
Nel portale di Azure, individuare l’app per le funzioni e selezionare Impostazioni>Configurazione, quindi selezionare Nuova impostazione dell’applicazione.
Immettere le impostazioni per le stringhe di connessione Cosmos DB e SignalR. È possibile trovare i valori in
local.settings.json
nella cartellastart/server
.Nome Valore COSMOSDB_CONNECTION_STRING Stringa di connessione per l'account Cosmos DB. SIGNALR_CONNECTION_STRING Stringa di connessione per l'account SignalR. Selezionare Salva per salvare le impostazioni.
Testare la distribuzione delle funzioni API
- Nel portale di Azure selezionare Panoramica e selezionare URL per aprire l'app in un browser.
- Copiare l'URL, che sarà necessario quando si aggiornerà il file
.env
client per il valoreBACKEND_URL
quando si lavorerà nell'unità 7. - Aprire l'URL in un browser per testare le funzioni API.
- Aggiungere
/api/getStocks
all'URL nel browser e premere INVIO. Dovrebbe essere visualizzata una matrice JSON con dati azionari.
Il codice del server è stato aggiornato per restituire le scorte con SignalR ed è stato distribuito in un'app per le funzioni. Successivamente, si aggiornerà il client per usare SignalR per ricevere gli aggiornamenti.