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

Viktigt

Cloud Services (klassisk) är nu inaktuell för nya kunder och kommer att 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ökad support).

Molntjänstroller kommunicerar via interna och externa anslutningar. Externa anslutningar kallas indataslutpunkter medan interna anslutningar kallas interna slutpunkter. Det här avsnittet beskriver 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 de externa och interna portarna 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 InputEndpointunderordnad i elementet Slutpunkter för 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 det underordnade elementet InstanceInputEndpoint i elementet Slutpunkter för 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, 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 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 redan 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 1 om 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 antalet instanser som angetts för rollen i tjänstkonfigurationsfilen.

Anteckning

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 tjänsten behöver den här funktionen. Du kan använda Azure Diagnostics för att hämta information om hur du kör 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 som exponeras 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 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 vilken roll som helst 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 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 ovan finns här.

Nästa steg

Läs mer om cloud service-modellen.