Sdílet prostřednictvím


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í:

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 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.