Hızlı Başlangıç: Azure İşlevleri ve SignalR Service ile GitHub sayısını gösteren bir Uygulama oluşturmak için Java kullanma

Azure SignalR Hizmeti uygulamanıza kolayca gerçek zamanlı işlevsellik eklemenize olanak sağlar ve Azure İşlevleri, herhangi bir altyapıyı yönetmeden kodunuzu çalıştırmanıza olanak sağlayan sunucusuz bir platformdur. Bu hızlı başlangıçta SignalR Service'i kullanmayı ve java ile Azure İşlevleri istemcilere ileti yayınlamaya uygun sunucusuz bir uygulama derlemeyi öğrenin.

Not

Makalede belirtilen tüm kodları aşağıdaki makaleden GitHub

Önkoşullar

  • Kod düzenleyicisi, örneğin Visual Studio Code

  • Etkin aboneliği olan bir Azure hesabı. Ücretsiz bir hesap oluşturun.

  • Azure Functions Core Tools. Azure İşlevi uygulamalarını yerel olarak çalıştırmak için kullanılır.

    Not

    Java'da gerekli SignalR Hizmeti bağlamaları yalnızca Azure Function Core Tools sürüm 2.4.419 'da (ana bilgisayar sürümü 2.0.12332) veya üzerinde de destek alır.

    Not

    Uzantıları yüklemek için Azure Functions Core Tools yükleme .NET Core SDK gerekir. Ancak JavaScript Azure İşlev uygulamaları oluşturmak için .NET bilgisi gerekmemektedir.

  • Java Developer Kit, sürüm 11

  • Apache Maven, sürüm 3.0 veya üzeri

Not

Bu hızlı başlangıç; macOS, Windows veya Linux üzerinde çalıştırılabilir.

Sorun mu var? Sorun giderme kılavuzunu deneyin veya bize haber ver.

Azure'da oturum açma

Azure hesabınızla Azure portalında https://portal.azure.com/ sayfasında oturum açın.

Sorun mu var? Sorun giderme kılavuzunu deneyin veya bize haber ver.

Azure SignalR Hizmeti örneği oluşturma

Uygulamanız Azure’da bir SignalR hizmeti örneğine bağlanır.

  1. Azure portalın sol üst köşesinde bulunan Yeni düğmesini seçin. Yeni ekranda arama kutusuna SignalR hizmeti yazın ve Enter tuşuna basın.

    Ekran görüntüsünde, Azure portal SignalR hizmeti araması gösterilmektedir.

  2. Arama sonuçlarından SignalR Hizmeti’ni seçtikten sonra Oluştur’u seçin.

  3. Aşağıdaki ayarları girin.

    Ayar Önerilen değer Açıklama
    Kaynak adı Genel olarak benzersiz bir ad Yeni SignalR Hizmeti örneğinizi tanımlayan ad. Geçerli karakterler: a-z, 0-9 ve -.
    Abonelik Aboneliğiniz Yeni SignalR Hizmeti örneğinin oluşturulacağı abonelik.
    Kaynak Grubu myResourceGroup SignalR Hizmeti örneğinizin oluşturulacağı yeni kaynak grubunun adı.
    Konum Batı ABD Size yakın bir bölge seçin.
    Fiyatlandırma katmanı Ücretsiz Azure SignalR Hizmetini ücretsiz deneyin.
    Birim sayısı Uygulanamaz Birim sayısı, SignalR Hizmeti örneğinizin kaç bağlantı kabul edebileceğini belirtir. Bu yalnızca Standart katmanda yapılandırılabilir.
    Hizmet modu Sunucusuz Azure Işlevleri veya REST API kullanmak için.

    Ekran görüntüsünde, değer içeren SignalR temel kavramları sekmesi gösterilmektedir.

  4. SignalR Hizmeti örneğini dağıtmaya başlamak için Oluştur’u seçin.

  5. Örnek dağıtıldıktan sonra portalda açın ve ayarlar sayfasını bulun. Azure SignalR hizmetini Azure Işlevleri bağlama veya REST API aracılığıyla kullanıyorsanız, hizmet modu ayarını sunucusuz olarak değiştirin. Aksi halde Klasik veya varsayılan olarak bırakın.

Sorun mu var? Sorun giderme kılavuzunu deneyin veya bize haber ver.

Azure İşlev Uygulamasını yapılandırıp çalıştırma

  1. Azure Function Core Tools, java (örnekte sürüm 11) ve maven'in yüklü olduğundan emin olun.

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

    Maven, proje oluşturma işini tamamlamak için gereken değerleri sorar. Aşağıdaki değerleri sebilirsiniz.

    İstem Değer Açıklama
    groupId com.signalr Java için paket adlandırma kurallarına uygun olarak projenizi tüm projelerde benzersiz şekilde tanımlayan bir değer.
    Artifactıd java Sürüm numarası olmadan jar'ın adı olan bir değer.
    Sürüm 1.0-SNAPSHOT Varsayılan değeri seçin.
    Paket com.signalr Oluşturulan işlev kodu için Java paketi olan bir değer. Varsayılan değeri kullanın.
  2. Bir projeyi başlatıldıktan sonra. klasörüne gidin src/main/java/com/signalr ve aşağıdaki kodları 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. Bazı bağımlılıkların ekleniyor olması gerekir. Bu nedenle, pom.xml 'yi açın ve kodlarda kullanılan bazı bağımlılıkları ekleyin.

    <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. Bu örneğin istemci arabirimi bir web sayfasıdır. İşlevde dosyasından HTML içeriğini content/index.html index okuduğumuz kabul edilir ve dizinde yeni bir content/index.html dosya resources oluşturun. Dizin ağacınız şu şekilde olmalıdır.

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

    'i index.html açın ve aşağıdaki içeriği kopyalayın.

    <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. Neredeyse bitti. Son adım, SignalR Hizmeti'nin bağlantı dizesini Azure İşlevi ayarlarına ayarlamaktır.

    1. Azure portalın açık olduğu tarayıcıda portalın üst kısmındaki arama kutusundan adını arayarak önceden dağıttığınız SignalR Hizmeti örneğinin başarılı bir şekilde oluşturulduğundan emin olun. Açmak için örneği seçin.

      SignalR Hizmeti örneğini arayın

    2. SignalR Hizmeti örneğinin bağlantı dizelerini görüntülemek için Anahtarlar’ı seçin.

      Birincil bağlantı dizesini vurgulayan ekran görüntüsü.

    3. Birincil bağlantı dizesini kopyalayın. Ve aşağıdaki komutu yürütün.

      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. Azure İşlevi'ne yerel olarak çalıştırın:

    mvn clean package
    mvn azure-functions:run
    

    Azure İşlevi yerel olarak çalıştır çalıştırktan sonra. Ziyaret etmek için tarayıcınızı http://localhost:7071/api/index kullanın; geçerli yıldız sayısını görebilir. Yıldız veya yıldız yıldızlarını GitHub, birkaç saniyede bir yenilenen bir yıldız sayısı elde olur.

    Not

    SignalR bağlaması için Azure Depolama gerekir, ancak İşlev yerel olarak çalıştırılabilirken yerel depolama öykünücüsü kullanabilirsiniz. İndirmeniz ve etkinleştirmeniz There was an error performing a read operation on the Blob Storage Secret Repository. Please ensure the 'AzureWebJobsStorage' connection string is valid. gerekiyor gibi bir hatayla karşılaştı Depolama Emulator

Sorun mu var? Sorun giderme kılavuzunu deneyin veya bize haber ver.

Kaynakları temizleme

Bu uygulamayı kullanmaya devam etmeyecekseniz, herhangi bir ücret ödememek için aşağıdaki adımları kullanarak bu hızlı başlangıç tarafından oluşturulan tüm kaynakları silin:

  1. Azure portalında, en solda bulunan Kaynak grupları’nı ve ardından oluşturduğunuz kaynak grubunu seçin. Alternatif olarak kaynak grubunu adıyla bulmak için arama kutusunu kullanabilirsiniz.

  2. Açılan pencerede kaynak grubunu seçin ve Kaynak grubunu sil’e tıklayın.

  3. Yeni pencerede, silmek için kaynak grubunun adını yazıp Sil öğesine tıklayın.

Sorun mu var? Sorun giderme kılavuzunu deneyin veya bize haber ver.

Sonraki adımlar

Bu hızlı başlangıçta, yerel olarak gerçek zamanlı bir sunucusuz uygulama yaptı ve bu uygulamayı başlattın. Daha fazla bilgi için SignalR Hizmeti bağlamalarını Azure İşlevleri. Ardından, SignalR Hizmeti ile istemciler ile Azure İşlevi arasında çift yönlü iletişim kurma hakkında daha fazla bilgi edinin.