Povolení komunikace pro instance rolí v Azure Cloud Services (Classic)

Důležité

Cloud Services (Classic) se teď pro nové zákazníky zastaralá a vyřadí se 31 2024 pro všechny zákazníky. Nová nasazení by měla používat nový model nasazení založený Azure Resource Manager 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 tak, aby se vytvořily koncové body.

Vstupní koncový bod

Vstupní koncový bod se používá, když chcete port zveřejnit zvenku. Zadáte typ protokolu a port koncového bodu, který pak platí 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 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 se podobají vstupním koncovým bodům, ale umožňují mapování konkrétních veřejně přístupných portů pro každou jednotlivou 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 jenom 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 volitelný a pokud je vynechán, přiřadí se ke koncovému bodu dynamický port. Je možné použít rozsah portů. Pro každou roli existuje limit pěti interních koncových bodů.

Interní koncový bod může používat následující protokoly: http, tcp, udp, jakýkoli.

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 drobný rozdíl. Webová role musí mít alespoň 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 instanci role můžete načíst informace o existenci další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í, které běží ve vaší cloudové službě a definují alespoň jeden interní koncový bod. Nelze 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 instanci CurrentRoleInstance k vrácení odkazu na aktuální instanci role a potom pomocí vlastnosti Role vraťte odkaz na samotnou roli.

Když se připojíte k instanci role prostřednictvím kódu programu prostřednictvím sady .NET SDK, je poměrně snadný přístup k informacím o koncovém bodu. Například po připojení ke konkrétnímu prostředí role můžete pomocí tohoto kódu získat port konkrétního koncového bodu:

int port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["StandardWeb"].IPEndpoint.Port;

Vlastnost Instances vrací kolekci objektů RoleInstance. 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 bude vždy 1 v případě, že pro roli není definovaný žádný interní koncový bod. Pokud role definuje interní koncový bod, její instance jsou zjistitelné za běhu a počet instancí v kolekci bude odpovídat počtu instancí zadaným 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 takové posouzení stavu můžete implementovat sami, pokud vaše služba tuto funkci potřebuje. Pomocí nástroje Azure Diagnostics získat informace o spouštění instancí rolí.

Pokud chcete určit číslo portu interního koncového bodu v instanci role, můžete pomocí vlastnosti vrátit objekt Dictionary, který obsahuje názvy koncových bodů a jejich odpovídající IP adresy InstanceEndpoints a porty. Vlastnost IPEndpoint 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 vlastnosti IP adresa PublicIPEndpoint se nepouží.

Tady je příklad iterace instancí 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 Azure Compute Emulator se prvky konfigurace služby, které vytvářejí přímé koncové body portu (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) a řídit, jak spolu instance rolí mohou komunikovat. Následující diagram znázorňuje některé běžné scénáře řízení komunikace rolí:

Scénáře pravidel síťového provozu

Následující příklad kódu ukazuje definice rolí pro role zobrazené v předchozím diagramu. Každá definice role obsahuje alespoň 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í může po dokončení definice interního koncového bodu komunikace proudit z jakékoli role do interního koncového bodu role bez jakýchkoli omezení. Pokud chcete komunikaci omezit, musíte do elementu ServiceDefinition v definiční souboru služby přidat element NetworkTrafficRules.

Scénář 1

Povolte 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 jenom síťový provoz z WebRole1 do 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 jenom 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 jenom 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>

Odkaz na schéma XML pro prvky použité výše najdete tady.

Další kroky

Přečtěte si další informace o modelu cloudové služby.