Servizio DNS in Azure Service FabricDNS Service in Azure Service Fabric

Il servizio DNS è un servizio di sistema facoltativo che è possibile abilitare nel cluster per individuare altri servizi usando il protocollo DNS.The DNS Service is an optional system service that you can enable in your cluster to discover other services using the DNS protocol.

Molti servizi, in particolare quelli in contenitori, possono avere un nome di URL esistente. La possibilità di risolverli usando il protocollo DNS standard, invece del protocollo di servizio Naming, è preferibile, in particolare negli scenari di applicazioni "lift-and-shift".Many services, especially containerized services, can have an existing URL name, and being able to resolve them using the standard DNS protocol (rather than the Naming Service protocol) is desirable, particularly in "lift and shift" scenarios. Il servizio DNS consente di eseguire il mapping di nomi DNS a nomi di servizi e di conseguenza di risolvere gli indirizzi IP degli endpoint.The DNS service enables you to map DNS names to a service name and hence resolve endpoint IP addresses.

Il servizio DNS esegue il mapping dei nomi DNS ai nomi di servizi, che vengono quindi risolti dal servizio Naming per restituire l'endpoint di servizio.The DNS service maps DNS names to service names, which in turn are resolved by the Naming Service to return the service endpoint. Il nome DNS per il servizio viene fornito al momento della creazione.The DNS name for the service is provided at the time of creation.

Endpoint del servizio

Abilitazione del servizio DNSEnabling the DNS service

È innanzitutto necessario abilitare il servizio DNS nel cluster.First you need to enable the DNS service in your cluster. Ottenere il modello per il cluster che si vuole distribuire.Get the template for the cluster that you want to deploy. È possibile usare i modelli di esempio o creare un modello di Resource Manager.You can either use the sample templates or create a Resource Manager template. Per abilitare il servizio DNS, seguire questa procedura:You can enable the DNS service with the following steps:

  1. Verificare che apiversion sia impostato su 2017-07-01-preview per la risorsa Microsoft.ServiceFabric/clusters e, se non lo è, aggiornarlo come illustrato nel frammento seguente:Check that the apiversion is set to 2017-07-01-preview for the Microsoft.ServiceFabric/clusters resource, and if not, update it as shown in the following snippet:

    {
        "apiVersion": "2017-07-01-preview",
        "type": "Microsoft.ServiceFabric/clusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    
  2. A questo punto abilitare il servizio DNS aggiungendo la sezione addonFeatures seguente dopo la sezione fabricSettings, come illustrato nel frammento seguente:Now enable the DNS service by adding the following addonFeatures section after the fabricSettings section as shown in the following snippet:

        "fabricSettings": [
        ...      
        ],
        "addonFeatures": [
            "DnsService"
        ],
    
  3. Dopo avere aggiornato il modello di cluster con le modifiche precedenti, applicarle e consentire il completamento dell'aggiornamento.Once you have updated your cluster template with the preceding changes, apply them and let the upgrade complete. Dopo aver completato l'aggiornamento, viene avviata l'esecuzione nel cluster del servizio di sistema DNS, denominato fabric:/System/DnsService, sotto la sezione dei servizi di sistema in Service Fabric Explorer.Once complete, the DNS system service starts running in your cluster that is called fabric:/System/DnsService under system service section in the Service Fabric explorer.

In alternativa, è possibile abilitare il servizio DNS tramite il portale durante la creazione del cluster.Alternatively, you can enable the DNS service through the portal at the time of cluster creation. Il servizio DNS può essere abilitato selezionando la casella per Include DNS service nel menu Cluster configuration, come illustrato nello screenshot seguente:The DNS service can be enabled by checking the box for Include DNS service in the Cluster configuration menu as shown in the following screenshot:

Abilitazione del servizio DNS tramite il portale

Impostazione del nome DNS del servizioSetting the DNS name for your service

Quando il servizio DNS è in esecuzione nel cluster, è possibile impostare un nome DNS per i servizi in modo dichiarativo per i servizi predefiniti in ApplicationManifest.xml oppure tramite i comandi di PowerShell.Once the DNS service is running in your cluster, you can set a DNS name for your services either declaratively for default services in the ApplicationManifest.xml or through Powershell commands.

Impostazione del nome DNS per un servizio predefinito nel file ApplicationManifest.xmlSetting the DNS name for a default service in the ApplicationManifest.xml

Aprire il progetto in Visual Studio, o nell'editor preferito, quindi aprire il file ApplicationManifest.xml.Open your project in Visual Studio, or your favorite editor, and open the ApplicationManifest.xml file. Passare alla sezione relativa ai servizi predefiniti e per ciascuno di esso aggiungere l'attributo ServiceDnsName.Go to the default services section, and for each service add the ServiceDnsName attribute. Nell'esempio seguente viene mostrato come impostare il nome DNS del servizio su service1.application1The following example shows how to set the DNS name of the service to service1.application1

    <Service Name="Stateless1" ServiceDnsName="service1.application1">
    <StatelessService ServiceTypeName="Stateless1Type" InstanceCount="[Stateless1_InstanceCount]">
        <SingletonPartition />
    </StatelessService>
    </Service>

Dopo aver distribuito l'applicazione, l'istanza del servizio in Service Fabric Explorer visualizza il nome DNS di tale istanza, come mostrato nella figura seguente:Once the application is deployed, the service instance in the Service Fabric explorer shows the DNS name for this instance, as shown in the following figure:

Endpoint del servizio

Impostazione del nome DNS per un servizio mediante PowerShellSetting the DNS name for a service using Powershell

È possibile impostare il nome DNS di un servizio al momento della creazione usando New-ServiceFabricService Powershell.You can set the DNS name for a service when creating it using the New-ServiceFabricService Powershell. Nell'esempio seguente viene creato un nuovo servizio senza stato con il nome DNS service1.application1The following example creates a new stateless service with the DNS name service1.application1

    New-ServiceFabricService `
    -Stateless `
    -PartitionSchemeSingleton `
    -ApplicationName `fabric:/application1 `
    -ServiceName fabric:/application1/service1 `
    -ServiceTypeName Service1Type `
    -InstanceCount 1 `
    -ServiceDnsName service1.application1

Uso del protocollo DNS nei serviziUsing DNS in your services

Se si distribuisce più di un servizio, è possibile trovare gli endpoint di altri servizi con cui comunicare usando un nome DNS.If you deploy more than one service, you can find the endpoints of other services to communicate with by using a DNS name. Il servizio DNS è valido solo per i servizi senza stato perché il protocollo DNS non può comunicare con i servizi con stato.The DNS service is only applicable to stateless services, since the DNS protocol cannot communicate with stateful services. Per i servizi con stato, è possibile usare il proxy inverso predefinito in modo che le chiamate HTTP siano dirette a una particolare partizione del servizio.For stateful services, you can use the built-in reverse proxy for http calls to call a particular service partition.

Il codice seguente illustra come chiamare un altro servizio. Si tratta semplicemente di una normale chiamata HTTP in cui si specificano la porta ed eventuali percorsi facoltativi come parte dell'URL.The following code shows how to call another service, which is simply a regular http call where you provide the port and any optional path as part of the URL.

public class ValuesController : Controller
{
    // GET api
    [HttpGet]
    public async Task<string> Get()
    {
        string result = "";
        try
        {
            Uri uri = new Uri("http://service1.application1:8080/api/values");
            HttpClient client = new HttpClient();
            var response = await client.GetAsync(uri);
            result = await response.Content.ReadAsStringAsync();

        }
        catch (Exception e)
        {
            Console.Write(e.Message);
        }

        return result;
    }
}

Passaggi successiviNext steps

Per altre informazioni sulla comunicazione tra i servizi all'interno del cluster, vedere Connettersi e comunicare con i servizi in Service FabricLearn more about service communication within the cluster with connect and communicate with services