Rövid útmutató: A Java használata GitHub-csillagszámokat megjelenítő alkalmazás létrehozásához az Azure Functions és a SignalR Szolgáltatás használatával

Ebben a cikkben az Azure SignalR Service, az Azure Functions és a Java használatával fog létrehozni egy kiszolgáló nélküli alkalmazást, amely üzeneteket küld az ügyfeleknek.

Megjegyzés:

A cikkben szereplő kód a GitHubon érhető el.

Előfeltételek

  • Kódszerkesztő, például Visual Studio Code

  • An Azure account with an active subscription. Ha még nem rendelkezik fiókkal, hozzon létre ingyenes fiókot.

  • Azure Functions Core Tools. Az Azure-függvényalkalmazások helyi futtatására szolgál.

    • A Java-ban szükséges SignalR-szolgáltatáskötések csak az Azure Function Core Tools 2.4.419-es (2.0.12332-es gazdagépverzió) vagy újabb verzióiban támogatottak.
    • A bővítmények telepítéséhez az Azure Functions Core Toolshoz telepítve kell lennie a .NET Core SDK-nak . A Java Azure-függvényalkalmazások létrehozásához azonban nem szükséges a .NET ismerete.
  • Java Developer Kit, 11-es verzió

  • Az Apache Maven 3.0-s vagy újabb verziója.

Ez a rövid útmutató macOS, Windows vagy Linux rendszeren is futtatható.

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
Subscription 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. This action can't be undone. 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.
Region 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ényalkalmazás konfigurálása és futtatása

Győződjön meg arról, hogy telepítve vannak az Azure Function Core Tools, a Java (a mintában a 11-es verzió) és a Maven.

  1. A projekt inicializálása a Maven használatával:

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

    A Maven a projekt létrehozásához szükséges értékeket kéri. Adja meg a következő értékeket:

    Adatkérés Value Description
    groupId com.signalr Olyan érték, amely egyedileg azonosítja a projektet az összes projektben, a Java csomagelnevezési szabályait követve.
    artifactId java Olyan érték, amely a jar neve, verziószám nélkül.
    Változat 1.0-SNAPSHOT Válassza ki az alapértelmezett értéket.
    Csomag com.signalr Egy érték, amely a létrehozott függvénykód Java-csomagja. Használja az alapértelmezettet.
  2. Nyissa meg a mappátsrc/main/java/com/signalr, és másolja a következő kódot a Function.java fájlba:

    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 {
        private static String Etag = "";
        private static String StarCount;
    
        @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").header("If-None-Match", Etag).build();
            HttpResponse<String> res = client.send(req, BodyHandlers.ofString());
            if (res.headers().firstValue("Etag").isPresent())
            {
                Etag = res.headers().firstValue("Etag").get();
            }
            if (res.statusCode() == 200)
            {
                Gson gson = new Gson();
                GitResult result = gson.fromJson(res.body(), GitResult.class);
                StarCount = result.stargazers_count;
            }
    
            return new SignalRMessage("newMessage", "Current start count of https://github.com/Azure/azure-signalr is:".concat(StarCount));
        }
    
        class GitResult {
            public String stargazers_count;
        }
    }
    
  3. Néhány függőséget hozzá kell adni. Nyissa meg a pom.xml fájlt , és adja hozzá a kódban használt alábbi függőségeket:

    <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. A minta ügyfélfelülete egy weblap. A függvény content/index.html index HTML-tartalmát olvassuk, majd létrehozunk egy új fájlt content/index.html a resources könyvtárban. A címtárfának így kell kinéznie:

        | - src
        | | - main
        | | | - java
        | | | | - com
        | | | | | - signalr
        | | | | | | - Function.java
        | | | - resources
        | | | | - content
        | | | | | - index.html
        | - pom.xml
        | - host.json
        | - local.settings.json
    
  5. Nyissa meg az index.html fájlt , és másolja a következő tartalmat:

    <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>
    
  6. Az Azure Functions használatához egy tárfiók szükséges. Telepítheti és futtathatja az Azure Storage Emulatort.

  7. Már majdnem elkészült. Az utolsó lépés a SignalR szolgáltatás kapcsolati sztring beállítása azure-függvénybeállításokra.

    1. Keresse meg a korábban üzembe helyezett Azure SignalR-példányt az Azure Portal keresőmezőjében . A megnyitáshoz válassza ki a példányt.

      Search for the SignalR Service instance

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

      Screenshot that highlights the primary connection string.

    3. Másolja ki az elsődleges kapcsolati sztring, majd futtassa a következő parancsot:

      func settings add AzureSignalRConnectionString "<signalr-connection-string>"
      # Also we need to set AzureWebJobsStorage as Azure Function's requirement
      func settings add AzureWebJobsStorage "UseDevelopmentStorage=true"
      
  8. Futtassa az Azure-függvényt helyi nyelven:

    mvn clean package
    mvn azure-functions:run
    

    Miután az Azure-függvény helyileg fut, lépjen http://localhost:7071/api/index , és látni fogja az aktuális csillagszámot. Ha a GitHubon csillagot vagy "unstar" értéket ad meg, néhány másodpercenként frissül a csillagok száma.

Clean up resources

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 a helyi gazdagépen. A következő lépésben megtudhatja, hogyan kommunikálhat kétirányúan az ügyfelek és az Azure-függvények között a SignalR Szolgáltatással.