Guida introduttiva: Creare un'app serverless con Funzioni di Azure e Servizio SignalR usando Javascript

In questo articolo si useranno Servizio Azure SignalR, Funzioni di Azure e JavaScript per compilare un'applicazione serverless per trasmettere i messaggi ai client.

Nota

È possibile ottenere tutto il codice usato nell'articolo da GitHub.

Prerequisiti

Questa guida introduttiva può essere eseguita su macOS, Windows o Linux.

Prerequisito Descrizione
Una sottoscrizione di Azure Se non si ha una sottoscrizione, creare un account Azure gratuito
Editor di codice È necessario un editor di codice, ad esempio Visual Studio Code.
Azure Functions Core Tools Richiede la versione 2.7.1505 o successiva per eseguire app per le funzioni di Azure Python in locale.
Node.JS Vedere le versioni di node.js supportate nella guida per sviluppatori javaScript Funzioni di Azure.
Azzurre L'associazione SignalR richiede Archiviazione di Azure. È possibile usare un emulatore di archiviazione locale quando una funzione è in esecuzione in locale.
Interfaccia della riga di comando di Azure Facoltativamente, è possibile usare l'interfaccia della riga di comando di Azure per creare un'istanza di Servizio Azure SignalR.

Creare un'istanza del servizio Azure SignalR

In questa sezione viene creata un'istanza di Azure SignalR di base da usare per l'app. I passaggi seguenti usano il portale di Azure per creare una nuova istanza, ma è anche possibile usare l'interfaccia della riga di comando di Azure. Per altre informazioni, vedere il comando az signalr create nella guida di riferimento all'interfaccia della riga di comando di Servizio Azure SignalR.

  1. Accedi al portale di Azure.
  2. Nell'angolo in alto a sinistra della pagina selezionare + Crea una risorsa.
  3. Nella pagina Crea una risorsa, nella casella di testo servizio di ricerca e marketplace immettere signalr e quindi selezionare Servizio SignalR dall'elenco.
  4. Nella pagina Servizio SignalR selezionare Crea.
  5. Nella scheda Informazioni di base immettere le informazioni essenziali per la nuova istanza di Servizio SignalR. Immettere i valori seguenti:
Campo Valore consigliato Descrizione
Abbonamento Scegliere la sottoscrizione in uso Selezionare la sottoscrizione da usare per creare una nuova istanza di Servizio SignalR.
Gruppo di risorse Creare un gruppo di risorse denominato SignalRTestResources Selezionare o creare un gruppo di risorse per la risorsa SignalR. È utile creare un nuovo gruppo di risorse per questa esercitazione anziché usare un gruppo di risorse esistente. Per liberare risorse dopo aver completato l'esercitazione, eliminare il gruppo di risorse.

L'eliminazione di un gruppo di risorse elimina anche tutte le risorse che appartengono al gruppo. Non è possibile annullare questa azione. Prima di eliminare un gruppo di risorse, assicurarsi che non contenga risorse da conservare.

Per altre informazioni, vedere Using resource groups to manage your Azure resources (Uso di Gruppi di risorse per gestire le risorse di Azure).
Nome risorsa testsignalr Immettere un nome risorsa univoco da usare per la risorsa SignalR. Se testsignalr è già stato eseguito nell'area, aggiungere una cifra o un carattere fino a quando il nome non è univoco.

Il nome deve essere una stringa contenente da 1 a 63 caratteri che possono includere solo numeri, lettere e il segno meno (-). Il nome non può iniziare o terminare con il trattino e i caratteri trattini consecutivi non sono validi.
Area Scegli la tua area geografica Selezionare l'area appropriata per la nuova istanza di Servizio SignalR.

Servizio Azure SignalR non è attualmente disponibile in tutte le aree. Per altre informazioni, vedere disponibilità dell'area Servizio Azure SignalR
Piano tariffario Selezionare Cambia e quindi scegliere Gratuito (solo sviluppo/test). Scegliere Seleziona per confermare la scelta del piano tariffario. Servizio Azure SignalR ha tre piani tariffari: Gratuito, Standard e Premium. Le esercitazioni usano il livello Gratuito , a meno che non sia specificato diversamente nei prerequisiti.

Per altre informazioni sulle differenze di funzionalità tra i livelli e i prezzi, vedere Servizio Azure SignalR prezzi
Modalità di servizio Scegliere la modalità di servizio appropriata Usare Default quando si ospita la logica dell'hub SignalR nelle app Web e si usa il servizio SignalR come proxy. Usare Serverless quando si usano tecnologie serverless, ad esempio Funzioni di Azure per ospitare la logica dell'hub SignalR.

La modalità classica è solo per la compatibilità con le versioni precedenti e non è consigliabile usarla.

Per altre informazioni, vedere Modalità di servizio in Servizio Azure SignalR.

Non è necessario modificare le impostazioni nelle schede Rete e Tag per le esercitazioni su SignalR.

  1. Selezionare il pulsante Rivedi e crea nella parte inferiore della scheda Informazioni di base .
  2. Nella scheda Rivedi e crea esaminare i valori e quindi selezionare Crea. Il completamento della distribuzione richiede alcuni istanti.
  3. Al termine della distribuzione, selezionare il pulsante Vai alla risorsa .
  4. Nella pagina della risorsa SignalR selezionare Chiavi dal menu a sinistra, sotto Impostazioni.
  5. Copiare la stringa di Connessione ion per la chiave primaria. Questa stringa di connessione è necessaria per configurare l'app più avanti in questa esercitazione.

Progetto di funzione di installazione

Assicurarsi di aver installato Funzioni di Azure Core Tools.

  1. Aprire una riga di comando.
  2. Creare la directory del progetto e quindi modificarla.
  3. Eseguire il comando Funzioni di Azure func init per inizializzare un nuovo progetto.
# Initialize a function project
func init --worker-runtime javascript

Creare le funzioni del progetto

Dopo aver inizializzato un progetto, è necessario creare funzioni. Questo progetto richiede tre funzioni:

  • index: ospita una pagina Web per un client.
  • negotiate: consente a un client di ottenere un token di accesso.
  • broadcast: usa un trigger di tempo per trasmettere periodicamente i messaggi a tutti i client.

Quando si esegue il func new comando dalla directory radice del progetto, il Funzioni di Azure Core Tools crea i file di origine della funzione che li archiviano in una cartella con il nome della funzione. I file verranno modificati in base alle esigenze sostituendo il codice predefinito con il codice dell'app.

Creare la funzione index

  1. Eseguire il comando seguente per creare la index funzione .

    func new -n index -t HttpTrigger
    
  2. Modificare index/function.json e sostituire il contenuto con il codice JSON seguente:

    {
      "bindings": [
        {
          "authLevel": "anonymous",
          "type": "httpTrigger",
          "direction": "in",
          "name": "req",
          "methods": [
            "get",
            "post"
          ]
        },
        {
          "type": "http",
          "direction": "out",
          "name": "res"
        }
      ]
    }
    
  3. Modificare index/index.js e sostituire il contenuto con il codice seguente:

    var fs = require('fs').promises
    
    module.exports = async function (context, req) {
        const path = context.executionContext.functionDirectory + '/../content/index.html'
        try {
            var data = await fs.readFile(path);
            context.res = {
                headers: {
                    'Content-Type': 'text/html'
                },
                body: data
            }
            context.done()
        } catch (err) {
            context.log.error(err);
            context.done(err);
        }
    }
    

Creare la funzione negotiate

  1. Eseguire il comando seguente per creare la negotiate funzione .

    func new -n negotiate -t HttpTrigger
    
  2. Modificare negotiate/function.json e sostituire il contenuto con il codice JSON seguente:

    {
      "disabled": false,
      "bindings": [
        {
          "authLevel": "anonymous",
          "type": "httpTrigger",
          "direction": "in",
          "methods": [
            "post"
          ],
          "name": "req",
          "route": "negotiate"
        },
        {
          "type": "http",
          "direction": "out",
          "name": "res"
        },
        {
          "type": "signalRConnectionInfo",
          "name": "connectionInfo",
          "hubName": "serverless",
          "connectionStringSetting": "AzureSignalRConnectionString",
          "direction": "in"
        }
      ]
    }
    
  3. Modificare negotiate/index.js e sostituire il contenuto con il codice JavaScript seguente:

    module.exports = async function (context, req, connectionInfo) {
        context.res.body = connectionInfo;
    };
    

Creare una funzione di trasmissione.

  1. Eseguire il comando seguente per creare la broadcast funzione .

    func new -n broadcast -t TimerTrigger
    
  2. Modificare broadcast/function.json e sostituire il contenuto con il codice seguente:

    {
      "bindings": [
        {
          "name": "myTimer",
          "type": "timerTrigger",
          "direction": "in",
          "schedule": "*/5 * * * * *"
        },
        {
          "type": "signalR",
          "name": "signalRMessages",
          "hubName": "serverless",
          "connectionStringSetting": "AzureSignalRConnectionString",
          "direction": "out"
        }
      ]
    }
    
  3. Modificare broadcast/index.js e sostituire il contenuto con il codice seguente:

    var https = require('https');
    
    var etag = '';
    var star = 0;
    
    module.exports = function (context) {
        var req = https.request("https://api.github.com/repos/azure/azure-signalr", {
            method: 'GET',
            headers: {'User-Agent': 'serverless', 'If-None-Match': etag}
        }, res => {
            if (res.headers['etag']) {
                etag = res.headers['etag']
            }
    
            var body = "";
    
            res.on('data', data => {
                body += data;
            });
            res.on("end", () => {
                if (res.statusCode === 200) {
                    var jbody = JSON.parse(body);
                    star = jbody['stargazers_count'];
                }
    
                context.bindings.signalRMessages = [{
                    "target": "newMessage",
                    "arguments": [ `Current star count of https://github.com/Azure/azure-signalr is: ${star}` ]
                }]
                context.done();
            });
        }).on("error", (error) => {
            context.log(error);
            context.res = {
              status: 500,
              body: error
            };
            context.done();
        });
        req.end();
    }
    

Creare il file index.html

L'interfaccia client per questa app è una pagina Web. La index funzione legge il contenuto HTML dal file content/index.html .

  1. Creare una cartella denominata content nella cartella radice del progetto.

  2. Creare il file content/index.html.

  3. Copiare il contenuto seguente nel file content/index.html e salvarlo:

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

Aggiungere il Servizio SignalR stringa di connessione alle impostazioni dell'app per le funzioni

Funzioni di Azure richiede il funzionamento di un account di archiviazione. È possibile installare ed eseguire l'emulatore Archiviazione di Azure. In alternativa , è possibile aggiornare l'impostazione per usare l'account di archiviazione reale con il comando seguente: bash func settings add AzureWebJobsStorage "<storage-connection-string>"

Ora hai quasi finito. L'ultimo passaggio consiste nell'impostare il Servizio SignalR stringa di connessione nelle impostazioni dell'app per le funzioni di Azure.

  1. Nella portale di Azure passare all'istanza di SignalR distribuita in precedenza.

  2. Selezionare Chiavi per visualizzare le stringhe di connessione per l'istanza del servizio SignalR.

    Screenshot of Azure SignalR service Keys page.

  3. Copiare il stringa di connessione primario ed eseguire il comando :

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

Eseguire l'app per le funzioni di Azure in locale

Avviare l'emulatore di archiviazione Di Azurite:

azurite 

Eseguire l'app per le funzioni di Azure nell'ambiente locale:

func start

Nota

Se vengono visualizzati errori di lettura nell'archivio BLOB, assicurarsi che l'impostazione "AzureWebJobs Archiviazione" nel file local.settings.json sia impostata su UseDevelopmentStorage=true.

Dopo aver eseguito la funzione di Azure in locale, passare a http://localhost:7071/api/index. Nella pagina viene visualizzato il numero di stelle corrente per il repository Azure/azure-signalr di GitHub. Quando si star o unstar il repository in GitHub, il conteggio aggiornato verrà visualizzato ogni pochi secondi.

Problemi? Vedere la guida alla risoluzione dei problemi oppure segnalarli

Pulire le risorse

Se non si intende continuare a usare l'app, eliminare tutte le risorse create tramite questa guida di avvio rapido eseguendo i passaggi seguenti, per evitare qualsiasi addebito:

  1. Nel portale di Azure selezionare Gruppi di risorse all'estrema sinistra e quindi selezionare il gruppo di risorse creato. In alternativa, è possibile usare la casella di ricerca per trovare il gruppo di risorse in base al nome.

  2. Nella finestra che si apre selezionare il gruppo di risorse e quindi fare clic su Elimina gruppo di risorse.

  3. Nella nuova finestra digita il nome del gruppo di risorse da eliminare e quindi fai clic su Elimina.

Passaggi successivi

In questa guida introduttiva è stata creata ed eseguita un'applicazione serverless in tempo reale in localhost. Altre informazioni su come comunicare bidirezionalmente tra client e funzioni di Azure con Servizio SignalR.