Serviço DNS no Azure Service FabricDNS Service in Azure Service Fabric

O serviço DNS é um serviço de sistema opcional que você pode habilitar em seu cluster para descobrir outros serviços usando o protocolo DNS.The DNS Service is an optional system service that you can enable in your cluster to discover other services using the DNS protocol.

Muitos serviços, especialmente serviços em contêineres, são endereçáveis por meio de uma URL pré-existente.Many services, especially containerized services, are addressable through a pre-existing URL. A capacidade de resolver esses serviços usando o protocolo DNS padrão, em vez do protocolo Service Fabric Serviço de Nomenclatura, é desejável.Being able to resolve these services using the standard DNS protocol, rather than the Service Fabric Naming Service protocol, is desirable. O serviço DNS permite mapear nomes DNS para um nome de serviço e, portanto, resolver endereços IP de ponto de extremidade.The DNS service enables you to map DNS names to a service name and hence resolve endpoint IP addresses. Essa funcionalidade mantém a portabilidade de serviços em contêineres em diferentes plataformas e pode facilitar os cenários de "deslocamento e mudança", permitindo que você use URLs de serviço existentes em vez de ter que reescrever o código para aproveitar o Serviço de Nomenclatura.Such functionality maintains the portability of containerized services across different platforms and can make "lift and shift" scenarios easier, by letting you use existing service URLs rather than having to rewrite code to leverage the Naming Service.

O serviço DNS mapeia nomes DNS para nomes de serviço que, por sua vez, são resolvidos pelo Serviço de Nomenclatura para retornar o ponto de extremidade de serviço.The DNS service maps DNS names to service names, which in turn are resolved by the Naming Service to return the service endpoint. O nome DNS para o serviço é fornecido no momento da criação.The DNS name for the service is provided at the time of creation. O diagrama a seguir mostra como o serviço DNS funciona para serviços sem estado.The following diagram shows how the DNS service works for stateless services.

Pontos de extremidade de serviço

A partir do Service Fabric versão 6,3, o protocolo DNS Service Fabric foi estendido para incluir um esquema para endereçar serviços com estado particionados.Beginning with Service Fabric version 6.3, the Service Fabric DNS protocol has been extended to include a scheme for addressing partitioned stateful services. Essas extensões possibilitam a resolução de endereços IP de partição específicos usando uma combinação de nome DNS de serviço com estado e o nome da partição.These extensions make it possible to resolve specific partition IP addresses using a combination of stateful service DNS name and the partition name. Há suporte para todos os três esquemas de particionamento:All three partitioning schemes are supported:

  • Particionamento nomeadoNamed partitioning
  • Particionamento de intervaloRanged partitioning
  • Particionamento singletonSingleton partitioning

O diagrama a seguir mostra como o serviço DNS funciona para serviços com estado particionados.The following diagram shows how the DNS service works for partitioned stateful services.

pontos de extremidade de serviço com estado

Não há suporte para portas dinâmicas no serviço DNS.Dynamic ports are not supported by the DNS service. Para resolver os serviços expostos em portas dinâmicas, use o serviço de proxy reverso.To resolve services exposed on dynamic ports, use the reverse proxy service.

Habilitando o serviço DNSEnabling the DNS service

Nota

O serviço DNS para serviços de Service Fabric ainda não tem suporte no Linux.DNS service for Service Fabric services is not yet supported on Linux.

Quando você cria um cluster usando o portal, o serviço DNS é habilitado por padrão na caixa de seleção incluir serviço DNS no menu configuração do 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:

Habilitando o serviço DNS por meio do portal

Se você não estiver usando o portal para criar o cluster ou se estiver atualizando um cluster existente, será necessário habilitar o serviço DNS em um modelo:If you're not using the portal to create your cluster or if you're updating an existing cluster, you'll need to enable the DNS service in a template:

  • Para implantar um novo cluster, você pode usar os modelos de exemplo ou criar seu próprio modelo do Resource Manager.To deploy a new cluster, you can either use the sample templates or create your own Resource Manager template.
  • Para atualizar um cluster existente, você pode navegar até o grupo de recursos do cluster no portal e clicar em script de automação para trabalhar com um modelo que reflete o estado atual do cluster e outros recursos no grupo.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. Para saber mais, consulte exportar o modelo do grupo de recursos.To learn more, see Export the template from resource group.

Depois de ter um modelo, você pode habilitar o serviço DNS com as seguintes etapas:After you have a template, you can enable the DNS service with the following steps:

  1. Verifique se o apiversion está definido como 2017-07-01-preview ou posterior para o Microsoft.ServiceFabric/clusters recurso e, se não, atualize-o conforme mostrado no exemplo a seguir: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 example:

    {
        "apiVersion": "2017-07-01-preview",
        "type": "Microsoft.ServiceFabric/clusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    
  2. Agora, habilite o serviço DNS de uma das seguintes maneiras:Now enable the DNS service in one of the following ways:

    • Para habilitar o serviço DNS com as configurações padrão, adicione-o addonFeatures à seção dentro properties da seção, conforme mostrado no exemplo a seguir:To enable the DNS service with default settings, add it to the addonFeatures section inside the properties section as shown in the following example:

        "properties": {
          ...
          "addonFeatures": [
            "DnsService"
            ],
          ...
        }
      
    • Para habilitar o serviço com outras configurações padrão, adicione uma DnsService seção fabricSettings à seção dentro da properties seção.To enable the service with other than default settings, add a DnsService section to the fabricSettings section inside the properties section. Nesse caso, você não precisa adicionar o DnsService ao addonFeatures.In this case, you don't need to add the DnsService to addonFeatures. Para saber mais sobre as propriedades que podem ser definidas para o serviço DNS, consulte configurações do serviço DNS.To learn more about the properties that can be set for the DNS Service, see DNS Service settings.

          "properties": {
            ...  
            "fabricSettings": [
              ...
              {
                "name": "DnsService",
                "parameters": [
                  {
                    "name": "IsEnabled",
                    "value": "true"
                  },
                  {
                    "name": "PartitionSuffix",
                    "value": "--"
                  },
                  {
                    "name": "PartitionPrefix",
                    "value": "--"
                  }
                ]
              },
              ...
             ]
           }
      
  3. Depois de atualizar o modelo de cluster com suas alterações, aplique-as e permita que a atualização seja concluída.Once you have updated the cluster template with your changes, apply them and let the upgrade complete. Quando a atualização for concluída, o serviço do sistema DNS começará a ser executado no cluster.When the upgrade completes, the DNS system service starts running in your cluster. O nome do serviço fabric:/System/DnsServiceé, e você pode encontrá-lo na seção serviço do sistema no Service Fabric Explorer.The service name is fabric:/System/DnsService, and you can find it under the System service section in Service Fabric explorer.

Nota

Ao atualizar o DNS de desabilitado para habilitado, Service Fabric Explorer pode não refletir o novo estado.When upgrading DNS from disabled to enabled, Service Fabric Explorer may not reflect the new state. Para resolver, reinicie os nós modificando o UpgradePolicy em seu modelo de Azure Resource Manager.To solve, restart the nodes by modifying the UpgradePolicy in your Azure Resource Manager template. Consulte a referência do modelo de Service Fabric para obter mais informações.See the Service Fabric Template Reference for more.

Configurando o nome DNS para seu serviçoSetting the DNS name for your service

Você pode definir um nome DNS para seus serviços de forma declarativa para serviços padrão no arquivo ApplicationManifest. xml ou por meio de comandos do PowerShell.You can set a DNS name for your services either declaratively for default services in the ApplicationManifest.xml file or through PowerShell commands.

O nome DNS do serviço é resolvível em todo o cluster, portanto, é importante garantir a exclusividade do nome DNS no cluster.The DNS name for your service is resolvable throughout the cluster so it is important to ensure the uniqueness of the DNS name across the cluster.

É altamente recomendável que você use um esquema de nomenclatura <ServiceDnsName>.<AppInstanceName>de; por exemplo service1.application1,.It is highly recommended that you use a naming scheme of <ServiceDnsName>.<AppInstanceName>; for example, service1.application1. Se um aplicativo for implantado usando o Docker Compose, os serviços serão atribuídos automaticamente a nomes DNS usando esse esquema de nomenclatura.If an application is deployed using Docker compose, services are automatically assigned DNS names using this naming scheme.

Definindo o nome DNS para um serviço padrão no ApplicationManifest. xmlSetting the DNS name for a default service in the ApplicationManifest.xml

Abra o projeto no Visual Studio ou seu editor favorito e abra o arquivo ApplicationManifest. xml.Open your project in Visual Studio, or your favorite editor, and open the ApplicationManifest.xml file. Vá para a seção serviços padrão e, para cada serviço, adicione ServiceDnsName o atributo.Go to the default services section, and for each service add the ServiceDnsName attribute. O exemplo a seguir mostra como definir o nome DNS do serviço comoservice1.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>

Depois que o aplicativo for implantado, a instância de serviço no Service Fabric Explorer mostrará o nome DNS dessa instância, conforme mostrado na figura a seguir: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:

Pontos de extremidade de serviço

O exemplo a seguir define o nome DNS para um serviço com statefulsvc.appestado como.The following example sets the DNS name for a stateful service to statefulsvc.app. O serviço usa um esquema de particionamento nomeado.The service uses a named partitioning scheme. Observe que os nomes de partição são letras minúsculas.Notice that the partition names are lower-case. Esse é um requisito para partições que serão destinadas a consultas DNS; para obter mais informações, consulte fazendo consultas DNS em uma partição de serviço com estado.This is a requirement for partitions that will be targeted in DNS queries; for more information, see Making DNS queries on a stateful service partition.

    <Service Name="Stateful1" ServiceDnsName="statefulsvc.app" />
      <StatefulService ServiceTypeName="ProcessingType" TargetReplicaSetSize="2" MinReplicaSetSize="2">
        <NamedPartition>
         <Partition Name="partition1" />
         <Partition Name="partition2" />
        </NamedPartition>
      </StatefulService>
    </Service>

Definindo o nome DNS para um serviço usando o PowerShellSetting the DNS name for a service using Powershell

Você pode definir o nome DNS para um serviço ao criá-lo usando New-ServiceFabricService o comando do PowerShell.You can set the DNS name for a service when creating it using the New-ServiceFabricService Powershell command. O exemplo a seguir cria um novo serviço sem estado com o nome DNSservice1.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

Apresentação Fazendo consultas DNS em uma partição de serviço com estado[Preview] Making DNS queries on a stateful service partition

A partir do Service Fabric versão 6,3, o serviço DNS Service Fabric dá suporte a consultas para partições de serviço.Beginning with Service Fabric version 6.3, the Service Fabric DNS service supports queries for service partitions.

Para partições que serão usadas em consultas DNS, as seguintes restrições de nomenclatura se aplicam:For partitions that will be used in DNS queries, the following naming restrictions apply:

  • Os nomes de partição devem estar em conformidade com o DNS.Partition names should be DNS-compliant.
  • Nomes de partição com vários rótulos (que incluem ponto, '. ', no nome) não devem ser usados.Multi-label partition names (that include dot, '.', in the name) should not be used.
  • Os nomes de partição devem estar em letras minúsculas.Partition names should be lower-case.

As consultas DNS direcionadas a uma partição são formatadas da seguinte maneira:DNS queries that target a partition are formatted as follows:

    <First-Label-Of-Partitioned-Service-DNSName><PartitionPrefix><Target-Partition-Name>< PartitionSuffix>.<Remaining- Partitioned-Service-DNSName>

Em que:Where:

  • O primeiro rótulo de-serviço-particionado-Service-DnsName é a primeira parte do nome DNS do serviço.First-Label-Of-Partitioned-Service-DNSName is the first part of your service DNS name.
  • PartitionPrefix é um valor que pode ser definido na seção DnsService do manifesto do cluster ou por meio do modelo do Resource Manager do cluster.PartitionPrefix is a value that can be set in the DnsService section of the cluster manifest or through the cluster's Resource Manager template. O valor padrão é "--".The default value is "--". Para saber mais, consulte configurações do serviço DNS.To learn more, see DNS Service settings.
  • Target-Partition-Name é o nome da partição.Target-Partition-Name is the name of the partition.
  • PartitionSuffix é um valor que pode ser definido na seção DnsService do manifesto do cluster ou por meio do modelo do Resource Manager do cluster.PartitionSuffix is a value that can be set in the DnsService section of the cluster manifest or through the cluster's Resource Manager template. O valor padrão é uma cadeia de caracteres vazia.The default value is empty string. Para saber mais, consulte configurações do serviço DNS.To learn more, see DNS Service settings.
  • Restante-partitiond-Service-DnsName é a parte restante do seu nome DNS do serviço.Remaining-Partitioned-Service-DNSName is the remaining part of your service DNS name.

Os exemplos a seguir mostram consultas DNS para serviços particionados em execução em um cluster com configurações padrão PartitionPrefix para PartitionSuffixe:The following examples show DNS queries for partitioned services running on a cluster that has default settings for PartitionPrefix and PartitionSuffix:

  • Para resolver a partição "0" de um serviço com o backendrangedschemesvc.application nome DNS que usa um esquema de particionamento de intervalo backendrangedschemesvc-0.application, use.To resolve partition “0” of a service with DNS name backendrangedschemesvc.application that uses a ranged partitioning scheme, use backendrangedschemesvc-0.application.
  • Para resolver a partição "primeiro" de um serviço com o backendnamedschemesvc.application nome DNS que usa um esquema de particionamento nomeado backendnamedschemesvc-first.application, use.To resolve partition “first” of a service with DNS name backendnamedschemesvc.application that uses a named partitioning scheme, use backendnamedschemesvc-first.application.

O serviço DNS retorna o endereço IP da réplica primária da partição.The DNS service returns the IP address of the primary replica of the partition. Se nenhuma partição for especificada, o serviço retornará o endereço IP da réplica primária de uma partição selecionada aleatoriamente.If no partition is specified, the service returns the IP address of the primary replica of a randomly selected partition.

Usando o DNS em seus serviçosUsing DNS in your services

Se você implantar mais de um serviço, poderá encontrar os pontos de extremidade de outros serviços com os quais se comunicar usando um 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. O serviço DNS funciona para serviços sem estado e, no Service Fabric versão 6,3 e posterior, para serviços com estado.The DNS service works for stateless services, and, in Service Fabric version 6.3 and later, for stateful services. Para serviços com estado em execução em versões do Service Fabric anteriores a 6,3, você pode usar o serviço de proxy reverso interno para chamadas http para chamar uma partição de serviço específica.For stateful services running on versions of Service Fabric prior to 6.3, you can use the built-in reverse proxy service for http calls to call a particular service partition.

Não há suporte para portas dinâmicas no serviço DNS.Dynamic ports are not supported by the DNS service. Você pode usar o serviço de proxy reverso para resolver serviços que usam portas dinâmicas.You can use the reverse proxy service to resolve services that use dynamic ports.

O código a seguir mostra como chamar um serviço sem estado por meio do DNS.The following code shows how to call a stateless service through DNS. É simplesmente uma chamada http regular em que você fornece o nome DNS, a porta e qualquer caminho opcional como parte da URL.It is simply a regular http call where you provide the DNS name, 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;
    }
}

O código a seguir mostra uma chamada em uma partição específica de um serviço com estado.The following code shows a call on a specific partition of a stateful service. Nesse caso, o nome DNS contém o nome da partição (Partition1).In this case, the DNS name contains the partition name (partition1). A chamada pressupõe um cluster com valores padrão para PartitionPrefix e PartitionSuffix.The call assumes a cluster with default values for PartitionPrefix and PartitionSuffix.

public class ValuesController : Controller
{
    // GET api
    [HttpGet]
    public async Task<string> Get()
    {
        string result = "";
        try
        {
            Uri uri = new Uri("http://service2-partition1.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;
    }
}

Problemas ConhecidosKnown Issues

  • Para Service Fabric versões 6,3 e superiores, há um problema com as pesquisas de DNS para nomes de serviço que contêm um hífen no nome DNS.For Service Fabric versions 6.3 and higher, there is a problem with DNS lookups for service names containing a hyphen in the DNS name. Para obter mais informações sobre esse problema, acompanhe o seguinte problema do GitHub.For more information on this issue, please track the following GitHub Issue. Uma correção para isso está disponível na próxima atualização 6,3.A fix for this is coming in the next 6.3 update.

  • O serviço DNS para serviços de Service Fabric ainda não tem suporte no Linux.DNS service for Service Fabric services is not yet supported on Linux. O serviço DNS tem suporte para contêineres no Linux.DNS service is supported for containers on Linux. A resolução manual usando o Fabric Client/ServicePartitionResolver é a alternativa disponível.Manual resolution using Fabric Client/ServicePartitionResolver is the available alternative.

Passos seguintesNext steps

Saiba mais sobre a comunicação de serviço no cluster com conectar e se comunicar com os serviçosLearn more about service communication within the cluster with connect and communicate with services