Abilitare la comunicazione delle istanze del ruolo in azureEnable communication for role instances in azure

I ruoli del servizio cloud comunicano tramite connessioni interne ed esterne.Cloud service roles communicate through internal and external connections. Le connessioni esterne vengono chiamate endpoint di input mentre le connessioni interne vengono chiamate endpoint interni.External connections are called input endpoints while internal connections are called internal endpoints. In questo argomento viene descritto come modificare la definizione del servizio per creare gli endpoint.This topic describes how to modify the service definition to create endpoints.

Endpoint di inputInput endpoint

L'endpoint di input viene utilizzato quando si desidera esporre una porta all'esterno.The input endpoint is used when you want to expose a port to the outside. Specificare il tipo di protocollo e porta dell'endpoint che vengono poi applicati per le porte interne ed esterne per l'endpoint.You specify the protocol type and the port of the endpoint which then applies for both the external and internal ports for the endpoint. Se si desidera, è possibile specificare una porta interna diversa per l'endpoint con l’attributo localPort .If you want, you can specify a different internal port for the endpoint with the localPort attribute.

L'endpoint di input può utilizzare i seguenti protocolli: http, https, tcp, udp.The input endpoint can use the following protocols: http, https, tcp, udp.

Per creare un endpoint di input, aggiungere elemento figlio InputEndpoint all'elemento Endpoints del ruolo di lavoro o del ruolo Web.To create an input endpoint, add the InputEndpoint child element to the Endpoints element of either a web or worker role.

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

Endpoint di input dell'istanzaInstance input endpoint

Gli endpoint di input dell'istanza sono simili agli endpoint di input ma consentono di eseguire il mapping di specifiche porte pubbliche per ogni singola istanza del ruolo mediante il port forwarding nel servizio di bilanciamento del carico.Instance input endpoints are similar to input endpoints but allows you map specific public-facing ports for each individual role instance by using port forwarding on the load balancer. È possibile specificare una singola porta pubblica o un intervallo di porte.You can specify a single public-facing port, or a range of ports.

L'endpoint di input dell’istanza può usare solo i protocolli tcp o udp.The instance input endpoint can only use tcp or udp as the protocol.

Per creare un endpoint di input dell'istanza, aggiungere l'elemento figlio InstanceInputEndpoint all'elemento Endpoints del ruolo di lavoro o del ruolo Web.To create an instance input endpoint, add the InstanceInputEndpoint child element to the Endpoints element of either a web or worker role.

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

Endpoint internoInternal endpoint

Gli endpoint interni sono disponibili per la comunicazione da istanza a istanza.Internal endpoints are available for instance-to-instance communication. La porta è facoltativa e se omessa, viene assegnata una porta dinamica all'endpoint.The port is optional and if omitted, a dynamic port is assigned to the endpoint. Può essere utilizzato un intervallo di porte.A port range can be used. Esiste un limite di cinque endpoint interni per ogni ruolo.There is a limit of five internal endpoints per role.

L'endpoint interno può utilizzare i seguenti protocolli: http, https, tcp, udp.The internal endpoint can use the following protocols: http, tcp, udp, any.

Per creare un endpoint di input interno, aggiungere l'elemento figlio InternalEndpoint all'elemento Endpoints del ruolo di lavoro o del ruolo Web.To create an internal input endpoint, add the InternalEndpoint child element to the Endpoints element of either a web or worker role.

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

È possibile inoltre utilizzare un intervallo di porte.You can also use a port range.

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

Ruoli di lavoro a confronto con Ruoli WebWorker roles vs. Web roles

Esiste una piccola differenza tra gli endpoint quando si lavora con i ruoli di lavoro e i ruoli web.There is one minor difference with endpoints when working with both worker and web roles. Il ruolo web deve disporre almeno di un singolo endpoint di input che utilizzi il protocollo HTTP .The web role must have at minimum a single input endpoint using the HTTP protocol.

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

Uso di .NET SDK per accedere ad un endpointUsing the .NET SDK to access an endpoint

La libreria gestita di Azure fornisce metodi per la comunicazione di istanze del ruolo in fase di esecuzione.The Azure Managed Library provides methods for role instances to communicate at runtime. Dal codice eseguito all'interno di un'istanza del ruolo, è possibile recuperare informazioni sull'esistenza di altre istanze del ruolo e sui relativi endpoint, nonché le informazioni sull'istanza del ruolo corrente.From code running within a role instance, you can retrieve information about the existence of other role instances and their endpoints, as well as information about the current role instance.

Nota

È possibile recuperare solo le informazioni sulle istanze dei ruoli che sono in esecuzione nel servizio cloud e che definiscono almeno un endpoint interno.You can only retrieve information about role instances that are running in your cloud service and that define at least one internal endpoint. Non è possibile ottenere dati sulle istanze dei ruoli in esecuzione in un altro servizio.You cannot obtain data about role instances running in a different service.

È possibile utilizzare la proprietà Istanze per recuperare le istanze di un ruolo.You can use the Instances property to retrieve instances of a role. Usare prima di tutto CurrentRoleInstance per restituire un riferimento all'istanza del ruolo corrente, quindi usare la proprietà Role per restituire un riferimento al ruolo stesso.First use the CurrentRoleInstance to return a reference to the current role instance, and then use the Role property to return a reference to the role itself.

Quando ci si connette a un'istanza del ruolo a livello di programmazione tramite il SDK di .NET, è relativamente semplice accedere alle informazioni relative all’endpoint.When you connect to a role instance programmatically through the .NET SDK, it's relatively easy to access the endpoint information. Ad esempio, dopo essersi connessi a un ambiente di ruolo specifico, è possibile ottenere la porta di un endpoint specifico con il seguente codice:For example, after you've already connected to a specific role environment, you can get the port of a specific endpoint with this code:

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

La proprietà Instances restituisce una raccolta di oggetti RoleInstance.The Instances property returns a collection of RoleInstance objects. Tale raccolta contiene sempre l'istanza corrente.This collection always contains the current instance. Se il ruolo non definisce un endpoint interno, la raccolta include l'istanza corrente ma non altre istanze.If the role does not define an internal endpoint, the collection includes the current instance but no other instances. Il numero di istanze del ruolo nella raccolta sarà sempre 1 nel caso in cui non sia stato definito alcun endpoint interno per il ruolo.The number of role instances in the collection will always be 1 in the case where no internal endpoint is defined for the role. Se il ruolo definisce un endpoint interno, le relative istanze sono individuabili in fase di esecuzione e il numero di istanze nella raccolta corrisponderà al numero di istanze specificato per il ruolo nel file di configurazione del servizio.If the role defines an internal endpoint, its instances are discoverable at runtime, and the number of instances in the collection will correspond to the number of instances specified for the role in the service configuration file.

Nota

La libreria gestita di Azure non rappresenta un mezzo per determinare lo stato di altre istanze del ruolo, ma è possibile implementare tali valutazioni manualmente se il servizio necessita di tale funzionalità.The Azure Managed Library does not provide a means of determining the health of other role instances, but you can implement such health assessments yourself if your service needs this functionality. È possibile utilizzare la Diagnostica di Azure per ottenere informazioni sull'esecuzione di istanze del ruolo.You can use Azure Diagnostics to obtain information about running role instances.

Per determinare il numero di porta per un endpoint interno in un'istanza del ruolo, è possibile utilizzare la proprietà InstanceEndpoints per restituire un oggetto Dictionary che contenga i nomi degli endpoint e i corrispondenti indirizzi IP e porte.To determine the port number for an internal endpoint on a role instance, you can use the InstanceEndpoints property to return a Dictionary object that contains endpoint names and their corresponding IP addresses and ports. La proprietà IPEndpoint restituisce l'indirizzo IP e la porta per un endpoint specificato.The IPEndpoint property returns the IP address and port for a specified endpoint. La proprietà PublicIPEndpoint restituisce la porta per un endpoint con carico bilanciato.The PublicIPEndpoint property returns the port for a load balanced endpoint. La parte relativa all’indirizzo IP della proprietà PublicIPEndpoint non viene utilizzata.The IP address portion of the PublicIPEndpoint property is not used.

Di seguito è riportato un esempio che consente di eseguire l’iterazione delle istanze del ruolo.Here is an example that iterates role instances.

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

Di seguito è riportato un esempio di un ruolo di lavoro che ottiene l'endpoint esposto tramite la definizione del servizio e avvia l'ascolto per le connessioni.Here is an example of a worker role that gets the endpoint exposed through the service definition and starts listening for connections.

Avviso

Questo codice funziona solo per un servizio distribuito.This code will only work for a deployed service. Durante l'esecuzione nell'emulatore di calcolo di Azure, gli elementi di configurazione del servizio che creano endpoint porte dirette (elementiInstanceInputEndpoint ) vengono ignorati.When running in the Azure Compute Emulator, service configuration elements that create direct port endpoints (InstanceInputEndpoint elements) are ignored.

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 http://go.microsoft.com/fwlink/?LinkId=166357.
      return base.OnStart();
    }
  }
}

Regole di traffico di rete per controllare la comunicazione di ruoloNetwork traffic rules to control role communication

Dopo aver definito gli endpoint interni, è possibile aggiungere regole del traffico di rete (in base agli endpoint che sono stati creati) per controllare il modo in cui le istanze del ruolo possono comunicare tra loro.After you define internal endpoints, you can add network traffic rules (based on the endpoints that you created) to control how role instances can communicate with each other. Nel diagramma seguente vengono illustrati alcuni scenari comuni relativi al controllo della comunicazione del ruolo:The following diagram shows some common scenarios for controlling role communication:

Scenari di regole del traffico di reteNetwork Traffic Rules Scenarios

Il seguente esempio di codice mostra le definizioni di ruolo per i ruoli illustrati nel diagramma precedente.The following code example shows role definitions for the roles shown in the previous diagram. Ogni definizione di ruolo include almeno un endpoint interno definito:Each role definition includes at least one internal endpoint defined:

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

Nota

La restrizione della comunicazione tra ruoli può verificarsi con endpoint interni di porte fisse o assegnate automaticamente.Restriction of communication between roles can occur with internal endpoints of both fixed and automatically assigned ports.

Per impostazione predefinita, dopo aver definito un endpoint interno, la comunicazione può avvenire tra qualsiasi ruolo e l’endpoint interno di un ruolo senza restrizioni.By default, after an internal endpoint is defined, communication can flow from any role to the internal endpoint of a role without any restrictions. Per limitare la comunicazione, è necessario aggiungere un elemento NetworkTrafficRules all'elemento ServiceDefinition nel file di definizione del servizio.To restrict communication, you must add a NetworkTrafficRules element to the ServiceDefinition element in the service definition file.

Scenario 1Scenario 1

Consentire solo il traffico di rete da WebRole1 a WorkerRole1.Only allow network traffic from WebRole1 to 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 2Scenario 2

Consente solo il traffico di rete da WebRole1 a WorkerRole1 e WorkerRole2.Only allows network traffic from WebRole1 to WorkerRole1 and 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 3Scenario 3

Consente solo il traffico di rete da WebRole1 a WorkerRole1 e da WorkerRole1 a WorkerRole2.Only allows network traffic from WebRole1 to WorkerRole1, and WorkerRole1 to 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 4Scenario 4

Consente solo il traffico di rete da WebRole1 a WorkerRole1, WebRole1 a WorkerRole2 e da WorkerRole1 a WorkerRole2.Only allows network traffic from WebRole1 to WorkerRole1, WebRole1 to WorkerRole2, and WorkerRole1 to 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>

Un riferimento allo schema XML per gli elementi utilizzati in precedenza è reperibile qui.An XML schema reference for the elements used above can be found here.

Passaggi successiviNext steps

Ulteriori informazioni sul modellodel servizio Cloud.Read more about the Cloud Service model.