Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu öğretici, Sunucusuz Mod'da Socket.IO hizmeti için Bir Web PubSub oluşturma ve Azure İşlevi ile tümleştiren bir sohbet uygulaması oluşturma konusunda size yol gösterir.
Bu öğreticide kullanılan tam kod örneklerini bulun:
Önemli
Varsayılan Mod kalıcı bir sunucuya ihtiyaç duyar; Azure İşlevi ile varsayılan modda Socket.IO için Web PubSub tümleştirmesi yapamazsınız.
Önemli
Ham bağlantı dizesi yalnızca tanıtım amacıyla bu makalede görünür.
Bir bağlantı dizesi, uygulamanızın Azure Web PubSub hizmetine erişmesi için ihtiyaç duyduğu yetkilendirme bilgilerini içerir. Bağlantı dizesindeki erişim anahtarı, hizmetiniz için kök parola görevi görür. Üretim ortamlarında erişim anahtarlarınızı her zaman koruyun. Anahtarlarınızı güvenli bir şekilde yönetmek ve döndürmek ve bağlantınızın WebPubSubServiceClientgüvenliğini sağlamak için Azure Key Vault kullanın.
Erişim anahtarlarını diğer kullanıcılara dağıtmaktan, sabit kodlamaktan veya başkalarının erişebileceği herhangi bir yerde düz metin olarak kaydetmekten kaçının. Ele geçirilmiş olabileceklerini düşünüyorsanız anahtarlarınızı döndürün.
Önkoşullar
- Etkin aboneliği olan bir Azure hesabı. Hesabınız yoksa ücretsiz bir hesap oluşturabilirsiniz.
- Azure Functions çekirdek araçları
- Socket.IO kitaplığı hakkında biraz bilgi.
Sunucusuz Modda Socket.IO kaynağı için Web PubSub oluşturma
Socket.IO için bir Web PubSub oluşturmak için aşağıdaki Azure CLI komutunu kullanabilirsiniz:
az webpubsub create -g <resource-group> -n <resource-name>--kind socketio --service-mode serverless --sku Premium_P1
Yerel olarak Azure İşlevi projesi oluşturma
Yerel bir Azure İşlevi projesi başlatmak için adımları izlemeniz gerekir.
En son Azure Functions Core Tools’u yüklemek için şu adımları izleyin
Terminal penceresinde veya komut isteminden aşağıdaki komutu çalıştırarak klasörde bir proje
SocketIOProjectoluşturun:func init SocketIOProject --worker-runtime javascript --model V4Bu komut bir JavaScript projesi oluşturur. Aşağıdaki komutları çalıştırmak için klasörünü
SocketIOProjectgirin.şu anda İşlev Paketi Socket.IO İşlev Bağlaması içermez, bu nedenle paketi el ile eklemeniz gerekir.
İşlev paketi başvurularını ortadan kaldırmak için host.json dosyasını düzenleyin ve aşağıdaki satırları kaldırın.
"extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", "version": "[4.*, 5.0.0)" }Komutu çalıştırın:
func extensions install -p Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO -v 1.0.0-beta.4
Anlaşma için bir işlev oluşturun. İstemcinin hizmete erişmesi için uç noktalar ve belirteçler oluşturmak için kullanılan anlaşma işlevi.
func new --template "Http Trigger" --name negotiateDosyayı
src/functions/negotiate.jsiçinde açın ve aşağıdaki kodla değiştirin:const { app, input } = require('@azure/functions'); const socketIONegotiate = input.generic({ type: 'socketionegotiation', direction: 'in', name: 'result', hub: 'hub' }); async function negotiate(request, context) { let result = context.extraInputs.get(socketIONegotiate); return { jsonBody: result }; }; // Negotiation app.http('negotiate', { methods: ['GET', 'POST'], authLevel: 'anonymous', extraInputs: [socketIONegotiate], handler: negotiate });Bu adım HTTP Tetikleyicisi ve
negotiateçıkış bağlaması ile bir işlevSocketIONegotiationoluşturur. Bu, işlevi tetikleyip bağlama tarafındanSocketIONegotiationoluşturulan bir anlaşma sonucu döndürmek için bir HTTP çağrısı kullanabileceğiniz anlamına gelir.İletileri teslim eden bir işlev oluşturun.
func new --template "Http Trigger" --name messagesrc/functions/message.jsdosyasını açın ve aşağıdaki kodla değiştirin:const { app, output, trigger } = require('@azure/functions'); const socketio = output.generic({ type: 'socketio', hub: 'hub', }) async function chat(request, context) { context.extraOutputs.set(socketio, { actionName: 'sendToNamespace', namespace: '/', eventName: 'new message', parameters: [ context.triggerMetadata.socketId, context.triggerMetadata.message ], }); } // Trigger for new message app.generic('chat', { trigger: trigger.generic({ type: 'socketiotrigger', hub: 'hub', eventName: 'chat', parameterNames: ['message'], }), extraOutputs: [socketio], handler: chat });Bu, bir Socket.IO istemci iletisiyle tetiklenmek için
SocketIOTriggerkullanır ve iletileri ad alanına yayınlamak içinSocketIObağlamasını kullanır.Ziyaret için dizin html'i döndürmek için bir işlev oluşturun.
src/altındapublicklasörü oluşturun.Aşağıdaki içeriğe sahip bir html dosyası
index.htmloluşturun.<html> <body> <h1>Socket.IO Serverless Sample</h1> <div id="chatPage" class="chat-container"> <div class="chat-input"> <input type="text" id="chatInput" placeholder="Type your message here..."> <button onclick="sendMessage()">Send</button> </div> <div id="chatMessages" class="chat-messages"></div> </div> <script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script> <script> function appendMessage(message) { const chatMessages = document.getElementById('chatMessages'); const messageElement = document.createElement('div'); messageElement.innerText = message; chatMessages.appendChild(messageElement); hatMessages.scrollTop = chatMessages.scrollHeight; } function sendMessage() { const message = document.getElementById('chatInput').value; if (message) { document.getElementById('chatInput').value = ''; socket.emit('chat', message); } } async function initializeSocket() { const negotiateResponse = await fetch(`/api/negotiate`); if (!negotiateResponse.ok) { console.log("Failed to negotiate, status code =", negotiateResponse.status); return; } const negotiateJson = await negotiateResponse.json(); socket = io(negotiateJson.endpoint, { path: negotiateJson.path, query: { access_token: negotiateJson.token } }); socket.on('new message', (socketId, message) => { appendMessage(`${socketId.substring(0,5)}: ${message}`); }) } initializeSocket(); </script> </body> </html>HTML sayfasını döndürmek için bir işlev oluşturun ve kodları kopyalayın:
func new --template "Http Trigger" --name indexsrc/functions/index.jsdosyasını açın ve aşağıdaki kodla değiştirin:const { app } = require('@azure/functions'); const fs = require('fs').promises; const path = require('path') async function index(request, context) { try { context.log(`HTTP function processed request for url "${request.url}"`); const filePath = path.join(__dirname,'../public/index.html'); const html = await fs.readFile(filePath); return { body: html, headers: { 'Content-Type': 'text/html' } }; } catch (error) { context.log(error); return { status: 500, jsonBody: error } } }; app.http('index', { methods: ['GET', 'POST'], authLevel: 'anonymous', handler: index });
Uygulamayı yerel olarak çalıştırma
Kod hazırlandıktan sonra, örneği çalıştırma yönergelerini izleyin.
Azure İşlevi için Azure Depolama'yı ayarlama
Azure İşlevleri, yerel ortamda çalışan bir depolama hesabının bile çalışmasını gerektirir. Aşağıdaki iki seçenek arasından birini belirleyin:
- Ücretsiz Azurite öykünücüsü çalıştırın.
- Azure Depolama hizmetini kullanın. Kullanmaya devam ederseniz bu maliyete neden olabilir.
- Azurite'yi yükleme
npm install -g azurite
- Azurite depolama öykünücüsİnİ başlatın:
azurite -l azurite -d azurite\debug.log
-
local.settings.json içindeki
AzureWebJobsStoragedeğerininUseDevelopmentStorage=trueolarak ayarlandığından emin olun.
Socket.IO için Web PubSub yapılandırmasını ayarlama
- İşlev UYGULAMASına bağlantı dizesi ekleyin:
func settings add WebPubSubForSocketIOConnectionString "<connection string>"
- Socket.IO için Web PubSub'a hub ayarları ekleme
az webpubsub hub create -n <resource name> -g <resource group> --hub-name hub --event-handler url-template="tunnel:///runtime/webhooks/socketio" user-event-pattern="*"
bağlantı dizesi Azure CLI komutuyla elde edilebilir
az webpubsub key show -g <resource group> -n <resource name>
Çıktı, primaryConnectionString ve secondaryConnectionString içerir ve her ikisi de kullanılabilir.
Tüneli ayarlama
Sunucusuz modda hizmet, işlevi tetikleme amacıyla web kancalarını kullanır. Uygulamayı yerel olarak çalıştırmayı denediğinizde, önemli bir sorun hizmetin yerel işlev uç noktanıza erişebilmesini sağlamaktır.
Bunu yapmanın en kolay yolu Tünel Aracı'nı kullanmaktır
Tünel Aracı'nı yükleme:
npm install -g @azure/web-pubsub-tunnel-toolTüneli çalıştırma
awps-tunnel run --hub hub --connection "<connection string>" --upstream http://127.0.0.1:7071--upstream, yerel Azure İşlevi'nin kullanıma sunma url'sidir. Bağlantı noktası farklı olabilir ve sonraki adımda işlevi başlatırken çıkışı de kontrol edebilirsiniz.
Örnek Uygulamayı Çalıştırma
Tünel aracı çalıştırıldıktan sonra İşlev Uygulamasını yerel olarak çalıştırabilirsiniz:
func start
Ve http://localhost:7071/api/index adresindeki web sayfasını ziyaret edin.
Sonraki adımlar
Ardından, uygulamayı kimlik tabanlı kimlik doğrulamasıyla çevrimiçi dağıtmak için Bicep'i kullanmayı deneyebilirsiniz: