Snabbstart: Använd Java för att skapa en app som GitHub antal stjärnor med Azure Functions och SignalR Service

Azure SignalR Service kan du enkelt lägga till realtidsfunktioner i ditt program och Azure Functions är en serverlös plattform där du kan köra din kod utan att hantera någon infrastruktur. I den här snabbstarten lär du dig hur du använder SignalR Service och Azure Functions för att skapa ett serverlöst program med Java för att skicka meddelanden till klienter.

Anteckning

Du kan hämta alla koder som anges i artikeln från GitHub

Förutsättningar

  • En kodredigerare, till exempel Visual Studio Code

  • Ett Azure-konto med en aktiv prenumeration. Skapa ett konto utan kostnad.

  • Azure Functions Core Tools. Används för att köra Azure-funktionsappar lokalt.

    Anteckning

    De obligatoriska SignalR Service-bindningar i Java stöds endast i Azure Function Core Tools version 2.4.419 (värdversion 2.0.12332) eller senare.

    Anteckning

    Om du vill installera Azure Functions Core Tools måste .NET Core SDK installerats. Dock krävs ingen kunskap om .NET för att skapa Azure Functions-appar med JavaScript.

  • Java Developer Kit, version 11

  • Apache Maven, version 3.0 eller senare

Anteckning

Den här snabbstarten kan köras på macOS, Windows eller Linux.

Har du problem? Prova felsökningsguiden eller berätta för oss.

Logga in på Azure

Logga in på Azure-portalen på https://portal.azure.com/ med ditt Azure-konto.

Har du problem? Prova felsökningsguiden eller berätta för oss.

Skapa en Azure SignalR Service-instans

Din app ansluter till en SignalR Service-instans i Azure.

  1. Välj knappen Nytt högst upp till vänster i Azure-portalen. På sidan Nytt skriver du SignalR Service i sökrutan och trycker på RETUR.

    Skärm bild som visar Sök efter signal tjänst i Azure Portal.

  2. Välj SignalR Service i sökresultatet och välj sedan Skapa.

  3. Ange följande inställningar.

    Inställning Föreslaget värde Beskrivning
    Resurs namn Globalt unikt namn Namn som identifierar din nya SignalR Service-instans. Giltiga tecken är a-z, 0-9 och -.
    Prenumeration Din prenumeration Prenumerationen som den här nya SignalR Service-instansen har skapats i.
    Resursgrupp myResourceGroup Namnet på den nya resursgruppen som SignalR Service-instansen ska skapas i.
    Plats USA, västra Välj en region nära dig.
    Prisnivå Kostnadsfri Prova Azure SignalR Service kostnadsfritt.
    Antal enheter Inte tillämpligt Antal enheter anger hur många anslutningar som SignalR Service-instansen kan acceptera. Det kan bara konfigureras på Standard-nivån.
    Tjänstläge Utan server För användning med Azure Functions eller REST API.

    Skärm bild som visar fliken grundläggande signaler med värden.

  4. Välj Skapa för att börja distribuera SignalR Service-instansen.

  5. När instansen har distribuerats öppnar du den i portalen och letar upp dess inställnings sida. Ändra inställningen för tjänst läge till endast Server om du använder Azure SignalR-tjänsten via Azure Functions bindning eller REST API. Lämna det i klassiskt eller i annat fall.

Har du problem? Prova felsökningsguiden eller berätta för oss.

Konfigurera och köra Azure Functions-appen

  1. Kontrollera att du har Azure Function Core Tools, java (version 11 i exemplet) och maven installerade.

    mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=11
    

    Maven ber dig om de värden som behövs för att slutföra genereringen av projektet. Du kan ange följande värden.

    Prompt Värde Beskrivning
    groupId com.signalr Ett värde som unikt identifierar projektet i alla projekt genom att följa paketnamnreglerna för Java.
    artifactId java Ett värde som är namnet på jar-et, utan versionsnumret.
    Version 1.0-SNAPSHOT Välj standardvärdet.
    Paket com.signalr Ett värde som är Java-paketet för den genererade funktionskoden. Använd standardvärdet.
  2. När du har initierat ett projekt. Gå till mappen src/main/java/com/signalr och kopiera följande koder till Function.java

    package com.signalr;
    
    import com.google.gson.Gson;
    import com.microsoft.azure.functions.ExecutionContext;
    import com.microsoft.azure.functions.HttpMethod;
    import com.microsoft.azure.functions.HttpRequestMessage;
    import com.microsoft.azure.functions.HttpResponseMessage;
    import com.microsoft.azure.functions.HttpStatus;
    import com.microsoft.azure.functions.annotation.AuthorizationLevel;
    import com.microsoft.azure.functions.annotation.FunctionName;
    import com.microsoft.azure.functions.annotation.HttpTrigger;
    import com.microsoft.azure.functions.annotation.TimerTrigger;
    import com.microsoft.azure.functions.signalr.*;
    import com.microsoft.azure.functions.signalr.annotation.*;
    
    import org.apache.commons.io.IOUtils;
    
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URI;
    import java.net.http.HttpClient;
    import java.net.http.HttpRequest;
    import java.net.http.HttpResponse;
    import java.net.http.HttpResponse.BodyHandlers;
    import java.nio.charset.StandardCharsets;
    import java.util.Optional;
    
    public class Function {
        @FunctionName("index")
        public HttpResponseMessage run(
                @HttpTrigger(
                    name = "req",
                    methods = {HttpMethod.GET},
                    authLevel = AuthorizationLevel.ANONYMOUS)HttpRequestMessage<Optional<String>> request,
                final ExecutionContext context) throws IOException {
    
            InputStream inputStream = getClass().getClassLoader().getResourceAsStream("content/index.html");
            String text = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name());
            return request.createResponseBuilder(HttpStatus.OK).header("Content-Type", "text/html").body(text).build();
        }
    
        @FunctionName("negotiate")
        public SignalRConnectionInfo negotiate(
                @HttpTrigger(
                    name = "req",
                    methods = { HttpMethod.POST },
                    authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> req,
                @SignalRConnectionInfoInput(
                    name = "connectionInfo",
                    hubName = "serverless") SignalRConnectionInfo connectionInfo) {
    
            return connectionInfo;
        }
    
        @FunctionName("broadcast")
        @SignalROutput(name = "$return", hubName = "serverless")
        public SignalRMessage broadcast(
            @TimerTrigger(name = "timeTrigger", schedule = "*/5 * * * * *") String timerInfo) throws IOException, InterruptedException {
    
            HttpClient client = HttpClient.newHttpClient();
            HttpRequest req = HttpRequest.newBuilder().uri(URI.create("https://api.github.com/repos/azure/azure-signalr")).header("User-Agent", "serverless").build();
            HttpResponse<String> res = client.send(req, BodyHandlers.ofString());
            Gson gson = new Gson();
            GitResult result = gson.fromJson(res.body(), GitResult.class);
            return new SignalRMessage("newMessage", "Current star count of https://github.com/Azure/azure-signalr is:".concat(result.stargazers_count));
        }
    
        class GitResult {
            public String stargazers_count;
        }
    }
    
  3. Vissa beroenden måste läggas till. Öppna och lägg pom.xml till ett beroende som används i koder.

    <dependency>
        <groupId>com.microsoft.azure.functions</groupId>
        <artifactId>azure-functions-java-library-signalr</artifactId>
        <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.7</version>
    </dependency>
    
  4. Klientgränssnittet för det här exemplet är en webbsida. Vi läste HTML-innehåll från content/index.html i funktionen och skapade en ny fil i index content/index.html resources katalogen. Katalogträdet bör se ut så här.

    FunctionsProject
     | - src
     | | - main
     | | | - java
     | | | | - com
     | | | | | - signalr 
     | | | | | | - Function.java
     | | | - resources
     | | | | - content
     | | | | | - index.html
     | - pom.xml
     | - host.json
     | - local.settings.json
    

    Öppna index.html och kopiera följande innehåll.

    <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>
    
  5. Det är nästan klart nu. Det sista steget är att ange en anslutningssträng för SignalR Service till Azure Function-inställningar.

    1. I den webbläsare där Azure-portalen är öppnad bekräftar du att den SignalR Service-instans som du distribuerade tidigare skapades korrekt genom att söka efter dess namn i sökrutan längst upp i portalen. Välj instansen för att öppna den.

      Söka efter SignalR Service-instansen

    2. Välj Nycklar för att visa anslutningssträngarna för SignalR Service-instansen.

      Skärmbild som visar den primära anslutningssträngen.

    3. Kopiera den primära anslutningssträngen. Och kör kommandot nedan.

      func settings add AzureSignalRConnectionString "<signalr-connection-string>"
      # Also we need to set AzureWebJobsStorage as Azure Function's requirement
      func settings add AzureWebJobsStorage "UseDevelopmentStorage=true"
      
  6. Kör Azure-funktionen lokalt:

    mvn clean package
    mvn azure-functions:run
    

    När Azure-funktionen har körts lokalt. Använd webbläsaren för att besöka http://localhost:7071/api/index och du kan se det aktuella stjärnantalet. Och om du star eller unstar i GitHub får du ett stjärnantal som uppdateras med några sekunders mellanrum.

    Anteckning

    SignalR-bindning Azure Storage, men du kan använda den lokala lagringsemulatorn när funktionen körs lokalt. Om du får ett felmeddelande som There was an error performing a read operation on the Blob Storage Secret Repository. Please ensure the 'AzureWebJobsStorage' connection string is valid. Du måste ladda ned och aktivera Storage Emulator

Har du problem? Prova felsökningsguiden eller berätta för oss.

Rensa resurser

Om du inte planerar att fortsätta använda den här appen tar du bort alla resurser som skapades i snabbstarten med följande steg, så att inga kostnader uppstår:

  1. Välj Resursgrupper i Azure Portal längst till vänster och välj sedan den resursgrupp du skapat. Du kan också använda sökrutan till att hitta resursgruppen efter dess namn.

  2. Markera resursgruppen i fönstret som öppnas och klicka sedan på Ta bort resursgrupp.

  3. I det nya fönstret, skriv namnet på resursgruppen som ska tas bort och klicka sedan på Ta bort.

Har du problem? Prova felsökningsguiden eller berätta för oss.

Nästa steg

I den här snabbstarten skapade och körde du ett serverlöst realtidsprogram lokalt. Läs mer om hur du använder SignalR Service-bindningar för Azure Functions. Härnäst får du lära dig mer om dubbelriktad kommunikation mellan klienter och Azure-funktion med SignalR Service.