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

Le porte dinamiche non sono supportate dal servizio DNS.Dynamic ports are not supported by the DNS service. Per risolvere i servizi esposti su porte dinamiche, usare il servizio proxy inverso.To resolve services exposed on dynamic ports, use the reverse proxy service.

Abilitazione del servizio DNSEnabling the DNS service

Quando si crea un cluster tramite il portale, il servizio DNS è abilitato per impostazione predefinita nella casella di controllo Includi servizio DNS nel menu Configurazione cluster:When you create a cluster using the portal, the DNS service is enabled by default in the Include DNS service check box on the Cluster configuration menu:

Abilitazione del servizio DNS tramite il portale

Se non si usa il portale per creare il cluster o se si sta aggiornando un cluster esistente, è necessario abilitare il servizio DNS in un modello:If you're not using the portal to create your cluster or you're updating an existing cluster, you'll need to enable the DNS service in a template:

  • Per distribuire un nuovo cluster è possibile usare i modelli di esempio oppure creare un proprio modello di Gestione risorse.To deploy a new cluster, you can either use the sample templates or create a your own Resource Manager template.
  • Per aggiornare un cluster esistente, è possibile passare al gruppo di risorse del cluster nel portale e fare clic su Script di automazione per lavorare con un modello che rispecchia lo stato corrente del cluster e delle altre risorse del gruppo.To update an existing cluster, you can navigate to the cluster's resource group on the portal and click Automation Script to work with a template that reflects the current state of the cluster and other resources in the group. Per maggiori informazioni, vedere Esportare il modello da un gruppo di risorse.To learn more, see Export the template from resource group.

Quando si dispone di un modello, è possibile abilitare il servizio DNS seguendo questa procedura:After you have a template, you can enable the DNS service with the following steps:

  1. Verificare che apiversion sia impostato su 2017-07-01-preview o versione successiva 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 or later 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. Al termine dell'aggiornamento, il servizio di sistema DNS viene avviato nel cluster.When the upgrade completes, the DNS system service starts running in your cluster. Il nome del servizio è fabric:/System/DnsService, e sarà possibile trovarlo nella sezione Sistema del servizio in Service Fabric Explorer.The service name is fabric:/System/DnsService, and you can find it under the System service section in Service Fabric explorer.

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 scegliendo tra il 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.

Il nome DNS per il servizio può essere risolto in tutto il cluster.The DNS name for your service is resolvable throughout the cluster. È consigliabile utilizzare uno schema di denominazione <ServiceDnsName>.<AppInstanceName>, ad esempio service1.application1.It is highly recommended that you use a naming scheme of <ServiceDnsName>.<AppInstanceName>; for example, service1.application1. Tale pratica assicura l'univocità del nome DNS in tutto il cluster.Doing so ensures the uniqueness of the DNS name throughout the cluster. Se un'applicazione viene distribuita usando Docker Compose, i nomi DNS vengono automaticamente assegnati ai servizi utilizzando questo schema di denominazione.If an application is deployed using Docker compose, services are automatically assigned DNS names using this naming scheme.

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 servizio 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 service for http calls to call a particular service partition. Le porte dinamiche non sono supportate dal servizio DNS.Dynamic ports are not supported by the DNS service. Per risolvere i servizi su porte dinamiche, è possibile usare il proxy inverso.You can use the reverse proxy to resolve services that use dynamic ports.

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