Povolení komunikace pro instance rolí v Azure Cloud Services (Classic)
Důležité
Od 1. září 2024 je služba Cloud Services (Classic) pro všechny zákazníky zastaralá. Microsoft zastaví a vypne všechna stávající spuštěná nasazení a data se od října 2024 trvale ztratí. Nová nasazení by měla používat nový model nasazení založený na Azure Resource Manageru 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. Tento článek 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í porty koncového bodu. Pokud chcete, můžete pro koncový bod zadat jiný interní port s atributem 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 InputEndpointu 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í namapovat konkrétní veřejné porty pro každou instanci jednotlivých rolí pomocí přesměrování portů v nástroji pro vyrovnávání zatížení. Můžete zadat jeden veřejně přístupný 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
Interní koncové body jsou k dispozici pro komunikaci mezi instancemi. Port je nepovinný a pokud tento parametr vynecháte, přiřadí se k koncovému bodu dynamický port. Lze použít rozsah portů. Existuje limit pěti interních koncových bodů na roli.
Interní koncový bod může používat následující protokoly: http, tcp, udp, any.
Pokud chcete vytvořit interní vstupní koncový bod, přidejte podřízený prvek InternalEndpointu 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 versus webové role
Při práci s pracovními i webovými rolemi existuje jeden malý rozdíl s koncovými body. Webová role musí mít minimálně jeden vstupní koncový bod pomocí protokolu 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 instance rolí ke komunikaci za běhu. Z kódu spuštěného v instanci role můžete načíst informace o existenci jiných instancí rolí a jejich koncových bodech. Můžete také získat informace o aktuální instanci role.
Poznámka:
Můžete načíst jenom informace o instancích rolí, které běží ve vaší cloudové službě a které definují alespoň jeden interní koncový bod. Nelze získat data o instancích rolí spuštěných v jiné službě.
Pomocí vlastnosti Instances můžete načíst instance role. Nejprve použijte CurrentRoleInstance vrátit odkaz na aktuální instanci role a pak pomocí Role vlastnost vrátit odkaz na samotnou roli.
Když se prostřednictvím sady .NET SDK připojíte k instanci role prostřednictvím kódu programu, je relativně snadný přístup k informacím o koncovém bodu. Například po připojení k určitému prostředí 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 vrací kolekci RoleInstance objekty. Tato kolekce vždy obsahuje aktuální instanci. Pokud role nedefinuje interní koncový bod, kolekce obsahuje aktuální instanci, ale žádné jiné instance. Počet instancí rolí v kolekci je vždy jeden v případě, že pro tuto roli není definován žádný interní koncový bod. Pokud role definuje interní koncový bod, jeho instance jsou zjistitelné za běhu a počet instancí v kolekci odpovídá počtu instancí zadaných pro roli v konfiguračním souboru služby.
Poznámka:
Spravovaná knihovna Azure neposkytuje způsob určení stavu jiných instancí rolí, ale takové hodnocení stavu můžete implementovat sami, pokud vaše služba tuto funkci potřebuje. Pomocí azure Diagnostics můžete získat informace o spuštěných instancích rolí.
Pokud chcete určit číslo portu pro interní koncový bod instance 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. Tato IPEndpoint
vlastnost vrátí IP adresu a port pro zadaný koncový bod. Vlastnost PublicIPEndpoint
vrátí port koncového bodu s vyrovnáváním zatížení. Část PublicIPEndpoint
IP adresy vlastnosti 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.
Upozorňující
Tento kód bude fungovat pouze pro nasazenou službu. Při spuštění v emulátoru služby Azure Compute se ignorují elementy konfigurace služby, které vytvářejí koncové body přímého portu (elementy InstanceInputEndpoint ).
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ě vytvořených koncových bodů) a řídit, jak spolu instance rolí můžou 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 zahrnuje alespoň jeden interní koncový bod definovaný:
<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í může komunikace po definování interního koncového bodu proudit z jakékoli role do interního koncového bodu role bez jakýchkoli omezení. Chcete-li omezit komunikaci, musíte přidat NetworkTrafficRules element do ServiceDefinition element v definičním souboru služby.
Scénář 1
Povoluje pouze síťový provoz z WebRole1 do WorkerRole1.
<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 WebRole1 na WorkerRole1 a WorkerRole2.
<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 WebRole1 do WorkerRole1 a WorkerRole1 do WorkerRole2.
<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 WebRole1 do WorkerRole1, WebRole1 do WorkerRole2 a WorkerRole1 do WorkerRole2.
<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 ke schématu XML pro použité elementy najdete tady.
Další kroky
Přečtěte si další informace o modelu cloudové služby.