Povolení komunikace pro instance rolí v Azure Cloud Services (Classic)
Důležité
Cloud Services (classic) je teď pro nové zákazníky zastaralý a bude vyřazen 31. srpna 2024 pro všechny zákazníky. Nová nasazení by měla používat nový model nasazení Azure Resource Manager založený na Azure Cloud Services (rozšířená podpora).
Role cloudové služby komunikují prostřednictvím interních a externích připojení. Externí připojení se nazývají vstupní koncové body, zatímco interní připojení se nazývají interní koncové body. Toto téma popisuje, jak upravit definici služby pro vytváření koncových bodů.
Vstupní koncový bod
Vstupní koncový bod se používá, když chcete zpřístupnit port pro vnější prostředí. Zadáte typ protokolu a port koncového bodu, který se pak použije pro externí i interní port koncového bodu. Pokud chcete, můžete pro koncový bod zadat jiný interní port pomocí atributu localPort .
Vstupní koncový bod může používat následující protokoly: http, https, tcp, udp.
Pokud chcete vytvořit vstupní koncový bod, přidejte podřízený element InputEndpoint do elementu Endpoints webové role nebo role pracovního procesu.
<Endpoints>
<InputEndpoint name="StandardWeb" protocol="http" port="80" localPort="80" />
</Endpoints>
Vstupní koncový bod instance
Vstupní koncové body instance jsou podobné vstupním koncovým bodům, ale umožňují mapovat konkrétní veřejné porty pro každou instanci role pomocí přesměrování portů v nástroji pro vyrovnávání zatížení. Můžete zadat jeden veřejný port nebo rozsah portů.
Vstupní koncový bod instance může jako protokol používat pouze tcp nebo udp .
Pokud chcete vytvořit vstupní koncový bod instance, přidejte podřízený element InstanceInputEndpoint do elementu Endpoints webové role nebo role pracovního procesu.
<Endpoints>
<InstanceInputEndpoint name="Endpoint2" protocol="tcp" localPort="10100">
<AllocatePublicPortFrom>
<FixedPortRange max="10109" min="10105" />
</AllocatePublicPortFrom>
</InstanceInputEndpoint>
</Endpoints>
Interní koncový bod
Pro komunikaci mezi instancemi jsou k dispozici interní koncové body. Port je volitelný a pokud ho vynecháte, přiřadí se ke koncovému bodu dynamický port. Je možné použít rozsah portů. Pro každou roli platí limit pěti interních koncových bodů.
Interní koncový bod může používat následující protokoly: http, tcp, udp, libovolný.
Pokud chcete vytvořit interní vstupní koncový bod, přidejte podřízený element InternalEndpoint do elementu Endpoints webové role nebo role pracovního procesu.
<Endpoints>
<InternalEndpoint name="Endpoint3" protocol="any" port="8999" />
</Endpoints>
Můžete také použít rozsah portů.
<Endpoints>
<InternalEndpoint name="Endpoint3" protocol="any">
<FixedPortRange max="8999" min="8995" />
</InternalEndpoint>
</Endpoints>
Role pracovního procesu vs. webové role
Při práci s pracovními i webovými rolemi je u koncových bodů jeden malý rozdíl. Webová role musí mít minimálně jeden vstupní koncový bod používající protokol HTTP .
<Endpoints>
<InputEndpoint name="StandardWeb" protocol="http" port="80" localPort="80" />
<!-- more endpoints may be declared after the first InputEndPoint -->
</Endpoints>
Použití sady .NET SDK pro přístup ke koncovému bodu
Spravovaná knihovna Azure poskytuje metody pro komunikaci instancí rolí za běhu. Z kódu spuštěného v rámci instance role můžete načíst informace o existenci jiných instancí rolí a jejich koncových bodů a také informace o aktuální instanci role.
Poznámka
Můžete načíst pouze informace o instancích rolí spuštěných ve vaší cloudové službě, které definují alespoň jeden interní koncový bod. Nemůžete získat data o instancích rolí spuštěných v jiné službě.
K načtení instancí role můžete použít vlastnost Instances . Nejprve použijte CurrentRoleInstance k vrácení odkazu na aktuální instanci role a potom pomocí vlastnosti Role vraťte odkaz na samotnou roli.
Když se k instanci role připojujete programově prostřednictvím sady .NET SDK, je poměrně snadný přístup k informacím o koncovém bodu. Například po připojení k prostředí konkrétní role můžete získat port konkrétního koncového bodu pomocí tohoto kódu:
int port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["StandardWeb"].IPEndpoint.Port;
Instances Vlastnost vrátí kolekci Objektů RoleInstance. Tato kolekce vždy obsahuje aktuální instanci. Pokud role nedefinuje interní koncový bod, kolekce zahrnuje aktuální instanci, ale žádné jiné instance. Počet instancí rolí v kolekci bude vždy 1 v případě, že pro roli není definovaný žádný interní koncový bod. Pokud role definuje interní koncový bod, jeho instance jsou zjistitelné za běhu a počet instancí v kolekci bude odpovídat počtu instancí zadaných pro roli v konfiguračním souboru služby.
Poznámka
Spravovaná knihovna Azure neposkytuje způsob, jak určit stav jiných instancí rolí, ale pokud vaše služba tuto funkci potřebuje, můžete tato posouzení stavu implementovat sami. Pomocí Azure Diagnostics můžete získat informace o spuštěných instancích rolí.
Pokud chcete zjistit číslo portu pro interní koncový bod v instanci role, můžete pomocí InstanceEndpoints
vlastnosti vrátit objekt Dictionary, který obsahuje názvy koncových bodů a jejich odpovídající IP adresy a porty. Vlastnost IPEndpoint
vrátí IP adresu a port pro zadaný koncový bod. Vlastnost PublicIPEndpoint
vrátí port pro koncový bod s vyrovnáváním zatížení. Část PublicIPEndpoint
vlastnosti IP adresa se nepoužívá.
Tady je příklad, který iteruje instance rolí.
foreach (RoleInstance roleInst in RoleEnvironment.CurrentRoleInstance.Role.Instances)
{
Trace.WriteLine("Instance ID: " + roleInst.Id);
foreach (RoleInstanceEndpoint roleInstEndpoint in roleInst.InstanceEndpoints.Values)
{
Trace.WriteLine("Instance endpoint IP address and port: " + roleInstEndpoint.IPEndpoint);
}
}
Tady je příklad role pracovního procesu, která získá koncový bod vystavený prostřednictvím definice služby a začne naslouchat připojením.
Upozornění
Tento kód bude fungovat pouze pro nasazenou službu. Při spuštění v emulátoru služby Azure Compute se elementy konfigurace služby, které vytvářejí přímé koncové body portů (elementy InstanceInputEndpoint ), ignorují.
using System;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;
namespace WorkerRole1
{
public class WorkerRole : RoleEntryPoint
{
public override void Run()
{
try
{
// Initialize method-wide variables
var epName = "Endpoint1";
var roleInstance = RoleEnvironment.CurrentRoleInstance;
// Identify direct communication port
var myPublicEp = roleInstance.InstanceEndpoints[epName].PublicIPEndpoint;
Trace.TraceInformation("IP:{0}, Port:{1}", myPublicEp.Address, myPublicEp.Port);
// Identify public endpoint
var myInternalEp = roleInstance.InstanceEndpoints[epName].IPEndpoint;
// Create socket listener
var listener = new Socket(
myInternalEp.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
// Bind socket listener to internal endpoint and listen
listener.Bind(myInternalEp);
listener.Listen(10);
Trace.TraceInformation("Listening on IP:{0},Port: {1}",
myInternalEp.Address, myInternalEp.Port);
while (true)
{
// Block the thread and wait for a client request
Socket handler = listener.Accept();
Trace.TraceInformation("Client request received.");
// Define body of socket handler
var handlerThread = new Thread(
new ParameterizedThreadStart(h =>
{
var socket = h as Socket;
Trace.TraceInformation("Local:{0} Remote{1}",
socket.LocalEndPoint, socket.RemoteEndPoint);
// Shut down and close socket
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
));
// Start socket handler on new thread
handlerThread.Start(handler);
}
}
catch (Exception e)
{
Trace.TraceError("Caught exception in run. Details: {0}", e);
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
// For information on handling configuration changes
// see the MSDN topic at https://go.microsoft.com/fwlink/?LinkId=166357.
return base.OnStart();
}
}
}
Pravidla síťového provozu pro řízení komunikace rolí
Po definování interních koncových bodů můžete přidat pravidla síťového provozu (na základě koncových bodů, které jste vytvořili), abyste mohli řídit, jak spolu můžou instance rolí vzájemně komunikovat. Následující diagram znázorňuje některé běžné scénáře řízení komunikace rolí:
Následující příklad kódu ukazuje definice rolí pro role zobrazené v předchozím diagramu. Každá definice role obsahuje aspoň jeden definovaný interní koncový bod:
<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<WebRole name="WebRole1" vmsize="Medium">
<Sites>
<Site name="Web">
<Bindings>
<Binding name="HttpIn" endpointName="HttpIn" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="HttpIn" protocol="http" port="80" />
<InternalEndpoint name="InternalTCP1" protocol="tcp" />
</Endpoints>
</WebRole>
<WorkerRole name="WorkerRole1">
<Endpoints>
<InternalEndpoint name="InternalTCP2" protocol="tcp" />
</Endpoints>
</WorkerRole>
<WorkerRole name="WorkerRole2">
<Endpoints>
<InternalEndpoint name="InternalTCP3" protocol="tcp" />
<InternalEndpoint name="InternalTCP4" protocol="tcp" />
</Endpoints>
</WorkerRole>
</ServiceDefinition>
Poznámka
K omezení komunikace mezi rolemi může dojít u interních koncových bodů pevných i automaticky přiřazených portů.
Ve výchozím nastavení po definování interního koncového bodu může komunikace proudit z libovolné role do interního koncového bodu role bez jakýchkoli omezení. Chcete-li omezit komunikaci, musíte do elementu ServiceDefinition v definičním souboru služby přidat element NetworkTrafficRules.
Scénář 1
Povolte pouze síťový provoz z role WebRole1 do role pracovního procesu 1.
<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<NetworkTrafficRules>
<OnlyAllowTrafficTo>
<Destinations>
<RoleEndpoint endpointName="InternalTCP2" roleName="WorkerRole1"/>
</Destinations>
<AllowAllTraffic/>
<WhenSource matches="AnyRule">
<FromRole roleName="WebRole1"/>
</WhenSource>
</OnlyAllowTrafficTo>
</NetworkTrafficRules>
</ServiceDefinition>
Scénář 2
Povoluje pouze síťový provoz z role WebRole1 do role pracovního procesu 1 a role pracovního procesu2.
<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<NetworkTrafficRules>
<OnlyAllowTrafficTo>
<Destinations>
<RoleEndpoint endpointName="InternalTCP2" roleName="WorkerRole1"/>
<RoleEndpoint endpointName="InternalTCP3" roleName="WorkerRole2"/>
</Destinations>
<WhenSource matches="AnyRule">
<FromRole roleName="WebRole1"/>
</WhenSource>
</OnlyAllowTrafficTo>
</NetworkTrafficRules>
</ServiceDefinition>
Scénář 3
Povoluje pouze síťový provoz z role WebRole1 do role pracovního procesu 1 a role pracovního procesu1 do role pracovního procesu 2.
<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<NetworkTrafficRules>
<OnlyAllowTrafficTo>
<Destinations>
<RoleEndpoint endpointName="InternalTCP2" roleName="WorkerRole1"/>
</Destinations>
<AllowAllTraffic/>
<WhenSource matches="AnyRule">
<FromRole roleName="WebRole1"/>
</WhenSource>
</OnlyAllowTrafficTo>
</NetworkTrafficRules>
<NetworkTrafficRules>
<OnlyAllowTrafficTo>
<Destinations>
<RoleEndpoint endpointName="InternalTCP3" roleName="WorkerRole2"/>
</Destinations>
<WhenSource matches="AnyRule">
<FromRole roleName="WorkerRole1"/>
</WhenSource>
</OnlyAllowTrafficTo>
</NetworkTrafficRules>
</ServiceDefinition>
Scénář 4
Povoluje pouze síťový provoz z role WebRole1 do role pracovního procesu 1, role WebRole1 do role pracovního procesu2 a role pracovního procesu1 do role pracovního procesu2.
<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<NetworkTrafficRules>
<OnlyAllowTrafficTo>
<Destinations>
<RoleEndpoint endpointName="InternalTCP2" roleName="WorkerRole1"/>
</Destinations>
<AllowAllTraffic/>
<WhenSource matches="AnyRule">
<FromRole roleName="WebRole1"/>
</WhenSource>
</OnlyAllowTrafficTo>
</NetworkTrafficRules>
<NetworkTrafficRules>
<OnlyAllowTrafficTo >
<Destinations>
<RoleEndpoint endpointName="InternalTCP3" roleName="WorkerRole2"/>
</Destinations>
<AllowAllTraffic/>
<WhenSource matches="AnyRule">
<FromRole roleName="WorkerRole1"/>
</WhenSource>
</OnlyAllowTrafficTo>
</NetworkTrafficRules>
<NetworkTrafficRules>
<OnlyAllowTrafficTo >
<Destinations>
<RoleEndpoint endpointName="InternalTCP4" roleName="WorkerRole2"/>
</Destinations>
<AllowAllTraffic/>
<WhenSource matches="AnyRule">
<FromRole roleName="WebRole1"/>
</WhenSource>
</OnlyAllowTrafficTo>
</NetworkTrafficRules>
</ServiceDefinition>
Referenční informace o schématu XML pro výše použité elementy najdete tady.
Další kroky
Přečtěte si další informace o modelu cloudové služby.