Aktivera kommunikation för rollinstanser i Azure Cloud Services (klassisk)

Viktigt

Cloud Services (klassisk) är nu inaktuell för nya kunder och dras tillbaka den 31 augusti 2024 för alla kunder. Nya distributioner bör använda den nya Azure Resource Manager-baserade distributionsmodellen Azure Cloud Services (utökat stöd).

Molntjänstroller kommunicerar via interna och externa anslutningar. Externa anslutningar kallas för indataslutpunkter medan interna anslutningar kallas interna slutpunkter. I det här avsnittet beskrivs hur du ändrar tjänstdefinitionen för att skapa slutpunkter.

Slutpunkt för indata

Indataslutpunkten används när du vill exponera en port utanför. Du anger protokolltypen och porten för slutpunkten som sedan gäller för både externa och interna portar för slutpunkten. Om du vill kan du ange en annan intern port för slutpunkten med attributet localPort.

Indataslutpunkten kan använda följande protokoll: http, https, tcp, udp.

Om du vill skapa en slutpunkt för indata lägger du till det underordnade InputEndpoint-elementet i endpoints-elementet för en webb- eller arbetsroll.

<Endpoints>
  <InputEndpoint name="StandardWeb" protocol="http" port="80" localPort="80" />
</Endpoints> 

Slutpunkt för instansindata

Slutpunkter för instansindata liknar indataslutpunkter, men gör att du kan mappa specifika offentliga portar för varje enskild rollinstans genom att använda port vidarebefordran på lastbalanseraren. Du kan ange en enskild offentlig port eller ett portintervall.

Instansens indataslutpunkt kan bara använda tcp eller udp som protokoll.

Om du vill skapa en slutpunkt för instansindata lägger du till det underordnade instanceInputEndpoint-elementet i endpoints-elementet för en webb- eller arbetsroll.

<Endpoints>
  <InstanceInputEndpoint name="Endpoint2" protocol="tcp" localPort="10100">
    <AllocatePublicPortFrom>
      <FixedPortRange max="10109" min="10105" />
    </AllocatePublicPortFrom>
  </InstanceInputEndpoint>
</Endpoints>

Intern slutpunkt

Interna slutpunkter är tillgängliga för kommunikation mellan instanser. Porten är valfri och om den utelämnas tilldelas en dynamisk port till slutpunkten. Ett portintervall kan användas. Det finns en gräns på fem interna slutpunkter per roll.

Den interna slutpunkten kan använda följande protokoll: http, tcp, udp, valfri.

Om du vill skapa en intern slutpunkt för indata lägger du till det underordnade internalEndpoint-elementet i elementet Endpoints för en webb- eller arbetsroll.

<Endpoints>
  <InternalEndpoint name="Endpoint3" protocol="any" port="8999" />
</Endpoints> 

Du kan också använda ett portintervall.

<Endpoints>
  <InternalEndpoint name="Endpoint3" protocol="any">
    <FixedPortRange max="8999" min="8995" />
  </InternalEndpoint>
</Endpoints>

Arbetsroller jämfört med webbroller

Det finns en mindre skillnad med slutpunkter när du arbetar med både arbets- och webbroller. Webbrollen måste minst ha en enda slutpunkt för indata som använder HTTP-protokollet.

<Endpoints>
  <InputEndpoint name="StandardWeb" protocol="http" port="80" localPort="80" />
  <!-- more endpoints may be declared after the first InputEndPoint -->
</Endpoints>

Använda .NET SDK för att få åtkomst till en slutpunkt

Azure Managed Library innehåller metoder för rollinstanser att kommunicera vid körning. Från kod som körs i en rollinstans kan du hämta information om förekomsten av andra rollinstanser och deras slutpunkter, samt information om den aktuella rollinstansen.

Anteckning

Du kan bara hämta information om rollinstanser som körs i molntjänsten och som definierar minst en intern slutpunkt. Du kan inte hämta data om rollinstanser som körs i en annan tjänst.

Du kan använda egenskapen Instanser för att hämta instanser av en roll. Använd först CurrentRoleInstance för att returnera en referens till den aktuella rollinstansen och använd sedan egenskapen Role för att returnera en referens till själva rollen.

När du ansluter till en rollinstans programmatiskt via .NET SDK är det relativt enkelt att komma åt slutpunktsinformationen. När du till exempel redan har anslutit till en viss rollmiljö kan du hämta porten för en specifik slutpunkt med den här koden:

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

Egenskapen Instances returnerar en samling RoleInstance-objekt. Den här samlingen innehåller alltid den aktuella instansen. Om rollen inte definierar en intern slutpunkt innehåller samlingen den aktuella instansen men inga andra instanser. Antalet rollinstanser i samlingen är alltid 1 om ingen intern slutpunkt har definierats för rollen. Om rollen definierar en intern slutpunkt kan dess instanser upptäckas vid körning och antalet instanser i samlingen motsvarar det antal instanser som har angetts för rollen i tjänstkonfigurationsfilen.

Anteckning

Azure Managed Library tillhandahåller inte ett sätt att fastställa hälsotillståndet för andra rollinstanser, men du kan implementera sådana hälsoutvärderingar själv om tjänsten behöver den här funktionen. Du kan använda Azure Diagnostics för att hämta information om att köra rollinstanser.

Om du vill fastställa portnumret för en intern slutpunkt på en rollinstans kan du använda egenskapen för att returnera ett ordlisteobjekt som innehåller slutpunktsnamn och deras motsvarande InstanceEndpoints IP-adresser och portar. Egenskapen IPEndpoint returnerar IP-adressen och porten för en angiven slutpunkt. Egenskapen PublicIPEndpoint returnerar porten för en belastningsutjämnad slutpunkt. IP-adressdelen av PublicIPEndpoint egenskapen används inte.

Här är ett exempel som itererar rollinstanser.

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);
    }
}

Här är ett exempel på en arbetsroll som exponerar slutpunkten via tjänstdefinitionen och börjar lyssna efter anslutningar.

Varning

Den här koden fungerar bara för en distribuerad tjänst. När du kör i Azure Compute Emulator ignoreras tjänstkonfigurationselement som skapar direkta portslutpunkter (InstanceInputEndpoint-element).

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();
    }
  }
}

Regler för nätverkstrafik för att styra rollkommunikationen

När du har definierat interna slutpunkter kan du lägga till regler för nätverkstrafik (baserat på de slutpunkter som du har skapat) för att styra hur rollinstanser kan kommunicera med varandra. I följande diagram visas några vanliga scenarier för att styra rollkommunikationen:

Scenarier för regler för nätverkstrafik

I följande kodexempel visas rolldefinitioner för de roller som visas i föregående diagram. Varje rolldefinition innehåller minst en definierad intern slutpunkt:

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

Anteckning

Begränsning av kommunikationen mellan roller kan ske med interna slutpunkter för både fasta och automatiskt tilldelade portar.

När en intern slutpunkt har definierats kan kommunikationen som standard flöda från valfri roll till den interna slutpunkten för en roll utan begränsningar. Om du vill begränsa kommunikationen måste du lägga till ett NetworkTrafficRules-element till elementet ServiceDefinition i tjänstdefinitionsfilen.

Scenario 1

Tillåt endast nätverkstrafik från WebRole1 till 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>

Scenario 2

Tillåter endast nätverkstrafik från WebRole1 till WorkerRole1 och 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>

Scenario 3

Tillåter endast nätverkstrafik från WebRole1 till WorkerRole1 och WorkerRole1 till 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>

Scenario 4

Tillåter endast nätverkstrafik från WebRole1 till WorkerRole1, WebRole1 till WorkerRole2 och WorkerRole1 till 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>

En XML-schemareferens för de element som används ovan finns här.

Nästa steg

Läs mer om Cloud Service-modellen.