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

Viktigt!

Cloud Services (klassisk) är nu inaktuellt för alla kunder från och med den 1 september 2024. Alla befintliga distributioner som körs stoppas och stängs av av Microsoft och data kommer att förloras kontinuerligt från och med oktober 2024. Nya distributioner bör använda den nya Azure Resource Manager-baserade distributionsmodellen Azure Cloud Services (utökad support).

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

Indataslutpunkt

Indataslutpunkten används när du vill exponera en port för utsidan. 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 indataslutpunkt lägger du till elementet InputEndpoint underordnad till elementet Endpoints i antingen en webb- eller arbetsroll.

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

Instansens indataslutpunkt

Instansens indataslutpunkter liknar indataslutpunkter, men gör att du kan mappa specifika offentliga portar för varje enskild rollinstans med hjälp av portvidarebefordring på lastbalanseraren. Du kan ange en enda offentlig port eller ett portintervall.

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

Om du vill skapa en instansindataslutpunkt lägger du till elementet InstanceInputEndpoint i elementet Endpoints i antingen 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 instans-till-instanskommunikation. 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, any.

Om du vill skapa en intern indataslutpunkt lägger du till det underordnade elementet InternalEndpoint i elementet Slutpunkter för antingen 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 ha minst en enda indataslutpunkt med hjälp av 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 komma åt 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. Du kan också hämta information om den aktuella rollinstansen.

Kommentar

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 Instances 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 Roll 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 har anslutit till en specifik 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 en i det fall där ingen intern slutpunkt har definierats för rollen. Om rollen definierar en intern slutpunkt kan dess instanser identifieras vid körning och antalet instanser i samlingen motsvarar det antal instanser som angetts för rollen i tjänstkonfigurationsfilen.

Kommentar

Azure Managed Library tillhandahåller inte något sätt att fastställa hälsotillståndet för andra rollinstanser, men du kan implementera sådana hälsoutvärderingar själv om din tjänst 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 InstanceEndpoints egenskapen för att returnera ett ordlisteobjekt som innehåller slutpunktsnamn och deras motsvarande IP-adresser och portar. Egenskapen IPEndpoint returnerar IP-adressen och porten för en angiven slutpunkt. Egenskapen PublicIPEndpoint returnerar porten för en belastningsutjämningsslutpunkt. 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 hämtar slutpunkten exponerad 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-emulatorn 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 rollkommunikation

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

Scenarier för nätverkstrafikregler

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

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

Kommentar

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 några begränsningar. För att begränsa kommunikationen måste du lägga till ett NetworkTrafficRules-element i ServiceDefinition-elementet 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 finns här.

Nästa steg

Läs mer om Cloud Service-modellen.