Aracılığıyla paylaş


Hızlı Başlangıç: Python'da Azure İşlevleri ve Azure SignalR Hizmeti ile sunucusuz uygulama oluşturma

İstemcilere ileti yayınlayan sunucusuz bir uygulama oluşturmak için Azure İşlevleri ve Python kullanarak Azure SignalR Hizmeti kullanmaya başlayın. İşlevi yerel ortamda çalıştıracak ve buluttaki bir Azure SignalR Hizmeti örneğine bağlanacaksınız. Bu hızlı başlangıcı tamamlamak, Azure Hesabınızda birkaç ABD doları veya daha az bir maliyete neden olur.

Not

Bu makaledeki kodu GitHub'dan alabilirsiniz.

Önkoşullar

Bu hızlı başlangıç; macOS, Windows veya Linux üzerinde çalıştırılabilir. Aşağıdakilere ihtiyacınız olacaktır:

Önkoşul Açıklama
Bir Azure aboneliği Azure aboneliğiniz yoksa ücretsiz Bir Azure hesabı oluşturun
Kod düzenleyicisi Visual Studio Code gibi bir kod düzenleyicisi gerekir.
Azure Functions Core Tools Python Azure İşlevi uygulamalarını yerel olarak çalıştırmak için 2.7.1505 veya üzeri bir sürüm gerekir.
Python 3.7+ Azure İşlevleri Python 3.7+ gerektirir. Bkz . Desteklenen Python sürümleri.
Azurite SignalR bağlaması için Azure Depolama gerekir. bir işlev yerel olarak çalışırken yerel depolama öykünücüsü kullanabilirsiniz.
Azure CLI İsteğe bağlı olarak, azure CLI kullanarak bir Azure SignalR Hizmeti örneği oluşturabilirsiniz.

Bir Azure SignalR Hizmeti örneği oluşturma

Bu bölümde, uygulamanız için kullanılacak temel bir Azure SignalR örneği oluşturacaksınız. Aşağıdaki adımlarda yeni bir örnek oluşturmak için Azure portalı kullanılır, ancak Azure CLI'yı da kullanabilirsiniz. Daha fazla bilgi için Azure SignalR Hizmeti CLI Başvurusu'ndaki az signalr create komutuna bakın.

  1. Azure Portal’ında oturum açın.
  2. Sayfanın sol üst kısmında + Kaynak oluştur'u seçin.
  3. Kaynak oluştur sayfasında, Arama hizmeti s ve market metin kutusuna signalr yazın ve listeden SignalR Hizmeti seçin.
  4. SignalR Hizmeti sayfasında Oluştur'u seçin.
  5. Temel Bilgiler sekmesinde, yeni SignalR Hizmeti örneğinin temel bilgilerini girersiniz. Aşağıdaki değerleri girin:
Alan Önerilen Değer Açıklama
Abonelik Aboneliğinizi seçin Yeni bir SignalR Hizmeti örneği oluşturmak için kullanmak istediğiniz aboneliği seçin.
Kaynak grubu SignalRTestResources adlı bir kaynak grubu oluşturma SignalR kaynağınız için bir kaynak grubu seçin veya oluşturun. Mevcut bir kaynak grubunu kullanmak yerine bu öğretici için yeni bir kaynak grubu oluşturmak yararlı olur. Öğreticiyi tamamladıktan sonra kaynakları boşaltmak için kaynak grubunu silin.

Bir kaynak grubunun silinmesi, gruba ait olan tüm kaynakları da siler. Bu eylem geri alınamaz. Bir kaynak grubunu silmeden önce, tutmak istediğiniz kaynakları içermediğinden emin olun.

Daha fazla bilgi için bkz. Azure kaynaklarınızı yönetmek için kaynak gruplarını kullanma.
Kaynak adı testsignalr SignalR kaynağı için kullanılacak benzersiz kaynak adını girin. Testsignalr bölgenizde zaten alınmışsa, ad benzersiz olana kadar bir basamak veya karakter ekleyin.

Ad 1 ile 63 karakter arasında bir dize olmalı ve yalnızca sayı, harf ve kısa çizgi (-) karakteri içermelidir. Ad kısa çizgi karakteriyle başlayamaz veya bitemez ve ardışık kısa çizgi karakterleri geçerli değildir.
Bölge Bölgenizi seçin Yeni SignalR Hizmeti örneğiniz için uygun bölgeyi seçin.

Azure SignalR Hizmeti şu anda tüm bölgelerde kullanılamamaktadır. Daha fazla bilgi için bkz. Azure SignalR Hizmeti bölge kullanılabilirliği
Fiyatlandırma katmanı Değiştir'i ve ardından Ücretsiz (Yalnızca Geliştirme/Test) seçeneğini belirleyin. Fiyatlandırma katmanı seçiminizi onaylamak için Seç'i seçin. Azure SignalR Hizmeti üç fiyatlandırma katmanı vardır: Ücretsiz, Standart ve Premium. Öğreticiler, önkoşullarda aksi belirtilmedikçe Ücretsiz katmanını kullanır.

Katmanlar ve fiyatlandırma arasındaki işlevsellik farkları hakkında daha fazla bilgi için bkz. fiyatlandırma Azure SignalR Hizmeti
Hizmet modu Uygun hizmet modunu seçin Web uygulamalarınızda SignalR hub mantığını barındırırken ve SignalR hizmetini ara sunucu olarak kullanırken Varsayılan'ı kullanın. SignalR hub mantığını barındırmak için Azure İşlevleri gibi Sunucusuz teknolojileri kullanırken Sunucusuz'u kullanın.

Klasik mod yalnızca geriye dönük uyumluluk içindir ve kullanılması önerilmez.

Daha fazla bilgi için bkz. Azure SignalR Hizmeti'de hizmet modu.

SignalR öğreticileri için Ağ ve Etiketler sekmelerindeki ayarları değiştirmeniz gerekmez.

  1. Temel Bilgiler sekmesinin en altındaki Gözden Geçir + oluştur düğmesini seçin.
  2. Gözden geçir ve oluştur sekmesinde değerleri gözden geçirin ve Oluştur'u seçin. Dağıtımın tamamlanması birkaç dakika sürer.
  3. Dağıtım tamamlandığında Kaynağa git düğmesini seçin.
  4. SignalR kaynağı sayfasında, soldaki menüden Ayarlar altında Anahtarlar'ı seçin.
  5. Birincil anahtar için Bağlan ion dizesini kopyalayın. Bu öğreticinin ilerleyen bölümlerinde uygulamanızı yapılandırmak için bu bağlantı dizesi gerekir.

Azure İşlevi projesini oluşturma

Yerel bir Azure İşlevi projesi oluşturun.

  1. Komut satırından projeniz için bir dizin oluşturun.
  2. Proje dizinine geçin.
  3. İşlev projenizi başlatmak için Azure İşlevleri func init komutunu kullanın.
# Initialize a function project
func init --worker-runtime python

İşlevleri oluşturma

Projeyi başlatdıktan sonra işlevler oluşturmanız gerekir. Bu proje için üç işlev gerekir:

  • index: İstemci için bir web sayfası barındırıyor.
  • negotiate: İstemcinin erişim belirteci almasına izin verir.
  • broadcast: İletileri tüm istemcilere düzenli aralıklarla yayınlamak için bir zaman tetikleyicisi kullanır.

Komutu projenin kök dizininden çalıştırdığınızdafunc new, Azure İşlevleri Çekirdek Araçları işlev kodunu dosyaya function_app.py ekler. Varsayılan kodu uygulama koduyla değiştirerek parametre reklam içeriğini gerektiği gibi düzenleyeceksiniz.

Dizin işlevini oluşturma

Bu örnek işlevi kendi işlevleriniz için şablon olarak kullanabilirsiniz.

function_app.py dosyasını açın. Bu dosya işlevlerinizi içerir. İlk olarak, dosyayı gerekli içeri aktarma deyimlerini içerecek şekilde değiştirin ve aşağıdaki işlevlerde kullanacağımız genel değişkenleri tanımlayın.

import azure.functions as func
import os
import requests
import json 

app = func.FunctionApp()

etag = ''
start_count = 0
  1. Aşağıdaki kodu ekleyerek işlevi index ekleyin
@app.route(route="index", auth_level=func.AuthLevel.ANONYMOUS)
def index(req: func.HttpRequest) -> func.HttpResponse:
    f = open(os.path.dirname(os.path.realpath(__file__)) + '/content/index.html')
    return func.HttpResponse(f.read(), mimetype='text/html')

Bu işlev, bir istemci için bir web sayfası barındırıyor.

Negotiate işlevini oluşturma

Aşağıdaki kodu ekleyerek işlevi negotiate ekleyin

@app.route(route="negotiate", auth_level=func.AuthLevel.ANONYMOUS, methods=["POST"])
@app.generic_input_binding(arg_name="connectionInfo", type="signalRConnectionInfo", hubName="serverless", connectionStringSetting="AzureSignalRConnectionString")
def negotiate(req: func.HttpRequest, connectionInfo) -> func.HttpResponse:
    return func.HttpResponse(connectionInfo)

Bu işlev, istemcinin erişim belirteci almasına olanak tanır.

Yayın işlevi oluşturma.

Aşağıdaki kodu ekleyerek işlevi broadcast ekleyin

@app.timer_trigger(schedule="*/1 * * * *", arg_name="myTimer",
              run_on_startup=False,
              use_monitor=False)
@app.generic_output_binding(arg_name="signalRMessages", type="signalR", hubName="serverless", connectionStringSetting="AzureSignalRConnectionString")
def broadcast(myTimer: func.TimerRequest, signalRMessages: func.Out[str]) -> None:
    global etag
    global start_count
    headers = {'User-Agent': 'serverless', 'If-None-Match': etag}
    res = requests.get('https://api.github.com/repos/azure/azure-functions-python-worker', headers=headers)
    if res.headers.get('ETag'):
        etag = res.headers.get('ETag')

    if res.status_code == 200:
        jres = res.json()
        start_count = jres['stargazers_count']

    signalRMessages.set(json.dumps({
        'target': 'newMessage',
        'arguments': [ 'Current star count of https://api.github.com/repos/azure/azure-functions-python-worker is: ' + str(start_count) ]
    }))

Bu işlev, iletileri tüm istemcilere düzenli aralıklarla yayınlamak için bir zaman tetikleyicisi kullanır.

Azure İşlevi projesini oluşturma

Yerel bir Azure İşlevi projesi oluşturun.

  1. Komut satırından projeniz için bir dizin oluşturun.
  2. Proje dizinine geçin.
  3. İşlev projenizi başlatmak için Azure İşlevleri func init komutunu kullanın.
# Initialize a function project
func init --worker-runtime python --model v1

İşlevleri oluşturma

Projeyi başlatdıktan sonra işlevler oluşturmanız gerekir. Bu proje için üç işlev gerekir:

  • index: İstemci için bir web sayfası barındırıyor.
  • negotiate: İstemcinin erişim belirteci almasına izin verir.
  • broadcast: İletileri tüm istemcilere düzenli aralıklarla yayınlamak için bir zaman tetikleyicisi kullanır.

Komutu projenin kök dizininden çalıştırdığınızdafunc new, Azure İşlevleri Çekirdek Araçları varsayılan işlev kaynak dosyalarını oluşturur ve işlevin adını taşıyan bir klasörde depolar. Varsayılan kodu uygulama koduyla değiştirerek dosyaları gerektiği gibi düzenleyeceksiniz.

Dizin işlevini oluşturma

Bu örnek işlevi kendi işlevleriniz için şablon olarak kullanabilirsiniz.

  1. İşlevi oluşturmak index için aşağıdaki komutu çalıştırın.
func new -n index -t HttpTrigger
  1. Dizin/function.json düzenleyin ve içeriğini aşağıdaki json koduyla değiştirin:
{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}
  1. index/_init_.py dosyasını düzenleyin ve içeriğini aşağıdaki kodla değiştirin:
import os

import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:
    f = open(os.path.dirname(os.path.realpath(__file__)) + '/../content/index.html')
    return func.HttpResponse(f.read(), mimetype='text/html')

Negotiate işlevini oluşturma

  1. İşlevi oluşturmak negotiate için aşağıdaki komutu çalıştırın.
func new -n negotiate -t HttpTrigger
  1. Anlaşma/function.json düzenleyin ve içeriği aşağıdaki json koduyla değiştirin:
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "type": "signalRConnectionInfo",
      "name": "connectionInfo",
      "hubName": "serverless",
      "connectionStringSetting": "AzureSignalRConnectionString",
      "direction": "in"
    }
  ]
}
  1. negotiate/_init_.py dosyasını düzenleyin ve içeriğini aşağıdaki kodla değiştirin:
import azure.functions as func


def main(req: func.HttpRequest, connectionInfo) -> func.HttpResponse:
    return func.HttpResponse(connectionInfo)

Yayın işlevi oluşturma.

  1. İşlevi oluşturmak broadcast için aşağıdaki komutu çalıştırın.
func new -n broadcast -t TimerTrigger
# install requests
pip install requests
  1. Yayını/function.json düzenleyin ve içeriği aşağıdaki kodla değiştirin:
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "*/5 * * * * *"
    },
    {
      "type": "signalR",
      "name": "signalRMessages",
      "hubName": "serverless",
      "connectionStringSetting": "AzureSignalRConnectionString",
      "direction": "out"
    }
  ]
}
  1. broadcast/_init_.py düzenleyin ve içeriğini aşağıdaki kodla değiştirin:
import requests
import json

import azure.functions as func

etag = ''
start_count = 0

def main(myTimer: func.TimerRequest, signalRMessages: func.Out[str]) -> None:
    global etag
    global start_count
    headers = {'User-Agent': 'serverless', 'If-None-Match': etag}
    res = requests.get('https://api.github.com/repos/azure/azure-signalr', headers=headers)
    if res.headers.get('ETag'):
        etag = res.headers.get('ETag')

    if res.status_code == 200:
        jres = res.json()
        start_count = jres['stargazers_count']

    signalRMessages.set(json.dumps({
        'target': 'newMessage',
        'arguments': [ 'Current star count of https://github.com/Azure/azure-signalr is: ' + str(start_count) ]
    }))

index.html dosyasını oluşturma

Bu uygulamanın istemci arabirimi bir web sayfasıdır. İşlev, index content/index.html dosyasındaki HTML içeriğini okur.

  1. Proje kök klasörünüzde adlı content bir klasör oluşturun.
  2. Dosya content/index.html oluşturun.
  3. Aşağıdaki içeriği content/index.html dosyasına kopyalayın ve kaydedin:
<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>

SignalR Hizmeti bağlantı dizesi işlev uygulaması ayarlarına ekleme

Son adım, Azure İşlevi uygulama ayarlarında SignalR Hizmeti bağlantı dizesi ayarlamaktır.

  1. Azure portalında daha önce dağıtılan SignalR örneğine gidin.

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

    Azure SignalR hizmet Anahtarları sayfasının ekran görüntüsü.

  3. Birincil bağlantı dizesi kopyalayın ve komutunu yürütür:

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

Azure İşlevi uygulamasını yerel olarak çalıştırma

Azurite depolama öykünücüsİnİ başlatın:

azurite 

Azure İşlevi uygulamasını yerel ortamda çalıştırın:

func start

Not

Blob depolamada okuma hatalarını gösteren bir hata görürseniz, local.settings.json dosyasındaki 'AzureWebJobs Depolama' ayarının olarak UseDevelopmentStorage=trueayarlandığından emin olun.

Azure İşlevi yerel olarak çalıştırıldıktan sonra adresine http://localhost:7071/api/indexgidin. Sayfada GitHub Azure/azure-signalr deposu için geçerli yıldız sayısı görüntülenir. GitHub'da depoyu yıldızladığınızda veya depoyu açtığınızda, birkaç saniyede bir yenilenen sayıyı görürsünüz.

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 yaşıyorsunuz? Sorun giderme kılavuzunu deneyin veya bize bildirin.

Sonraki adımlar

Bu hızlı başlangıçta, yerel ortamda gerçek zamanlı sunucusuz bir uygulama oluşturup çalıştırmıştınız. Ardından, SignalR Hizmeti ile istemciler ile Azure İşlevi arasında çift yönlü iletişimin nasıl kullanılacağı hakkında daha fazla bilgi edinin.