Ligue-se e se comunicar com serviços no Service FabricConnect and communicate with services in Service Fabric

No Service Fabric, um serviço é executado em algum lugar no cluster do Service Fabric, geralmente distribuído por várias VMs.In Service Fabric, a service runs somewhere in a Service Fabric cluster, typically distributed across multiple VMs. Ele pode ser movido de um lugar para outro, o proprietário do serviço, tanto pelo automaticamente pelo Service Fabric.It can be moved from one place to another, either by the service owner, or automatically by Service Fabric. Os serviços não estão estaticamente vinculados a uma máquina específica ou o endereço.Services are not statically tied to a particular machine or address.

Uma aplicação do Service Fabric em geral, é composta por vários serviços diferentes, onde cada serviço executa uma tarefa de especializados.A Service Fabric application is generally composed of many different services, where each service performs a specialized task. Estes serviços podem se comunicar entre si para formar uma função de conclua, como partes diferentes do processamento de um aplicativo web.These services may communicate with each other to form a complete function, such as rendering different parts of a web application. Também existem aplicações de cliente que se ligam para e comunicam com os serviços.There are also client applications that connect to and communicate with services. Este documento explica como configurar a comunicação com e entre os seus serviços no Service Fabric.This document discusses how to set up communication with and between your services in Service Fabric.

Traga seu próprio protocoloBring your own protocol

Service Fabric ajuda a gerir o ciclo de vida dos seus serviços, mas não faz decisões sobre o que fazem seus serviços.Service Fabric helps manage the lifecycle of your services but it does not make decisions about what your services do. Isto inclui a comunicação.This includes communication. Quando seu serviço é aberto pelo Service Fabric, que é a oportunidade de seu serviço de configurar um ponto final para pedidos recebidos, com qualquer pilha de protocolo ou comunicação que pretende.When your service is opened by Service Fabric, that's your service's opportunity to set up an endpoint for incoming requests, using whatever protocol or communication stack you want. O serviço irá escutar um normal IP: porta usando qualquer esquema de endereçamento, como um URI de endereço.Your service will listen on a normal IP:port address using any addressing scheme, such as a URI. Várias instâncias de serviço ou réplicas podem partilhar um processo de host, caso em que eles terão de utilizar portas diferentes ou utilizar um mecanismo de compartilhamento da porta, como o driver do kernel HTTP. sys no Windows.Multiple service instances or replicas may share a host process, in which case they will either need to use different ports or use a port-sharing mechanism, such as the http.sys kernel driver in Windows. Em ambos os casos, cada instância de serviço ou a réplica num processo de anfitrião tem de ser exclusivamente endereçável.In either case, each service instance or replica in a host process must be uniquely addressable.

pontos finais de serviço

Deteção do serviço e resoluçãoService discovery and resolution

Num sistema distribuído, os serviços podem mover de uma máquina para outra ao longo do tempo.In a distributed system, services may move from one machine to another over time. Isto pode acontecer por várias razões, incluindo balanceamento, atualizações, as ativações pós-falha ou Escalamento horizontal de recurso. Isso significa que os endereços de ponto final de serviço alterar à medida que o serviço se move para nós com endereços IP diferentes e pode abrir nas portas diferentes, se o serviço utiliza uma porta dinamicamente selecionada.This can happen for various reasons, including resource balancing, upgrades, failovers, or scale-out. This means service endpoint addresses change as the service moves to nodes with different IP addresses, and may open on different ports if the service uses a dynamically selected port.

Distribuição de serviços

O Service Fabric fornece um serviço de deteção e resolução chamado o serviço de nomenclatura.Service Fabric provides a discovery and resolution service called the Naming Service. O serviço de nomenclatura mantém uma tabela que é mapeado com o nome instâncias de serviço para os endereços de ponto final que escutam.The Naming Service maintains a table that maps named service instances to the endpoint addresses they listen on. Todas as instâncias de serviço com nome no Service Fabric possuem nomes exclusivos representados como URIs, por exemplo, "fabric:/MyApplication/MyService".All named service instances in Service Fabric have unique names represented as URIs, for example, "fabric:/MyApplication/MyService". O nome do serviço não se altera ao longo do tempo de vida do serviço, é apenas os endereços de ponto de extremidade que podem ser alteradas quando mover de serviços.The name of the service does not change over the lifetime of the service, it's only the endpoint addresses that can change when services move. Isso é análogo aos Web sites que tenham URLs constantes, mas onde pode alterar o endereço IP.This is analogous to websites that have constant URLs but where the IP address may change. E semelhante ao DNS na web, que resolve os URLs de Web site para endereços IP, Service Fabric tem uma entidade de registo que mapeia nomes de serviço para o respetivo endereço de ponto final.And similar to DNS on the web, which resolves website URLs to IP addresses, Service Fabric has a registrar that maps service names to their endpoint address.

pontos finais de serviço

Resolução e ligar a serviços envolvem os seguintes passos que executar num loop:Resolving and connecting to services involves the following steps run in a loop:

  • Resolver: Obter o ponto final que publicou um serviço do serviço de nomenclatura.Resolve: Get the endpoint that a service has published from the Naming Service.
  • Ligar: Liga ao serviço através de qualquer protocolo utiliza no ponto de extremidade.Connect: Connect to the service over whatever protocol it uses on that endpoint.
  • Repita: Uma tentativa de ligação poderá falhar por diversas razões, para o exemplo, se o serviço foi movido, uma vez que a última vez que o endereço de ponto final foi resolvido.Retry: A connection attempt may fail for any number of reasons, for example if the service has moved since the last time the endpoint address was resolved. Nesse caso, precedente resolver e ligue-se passos têm de ser repetida e esse ciclo é repetido até que a ligação é bem-sucedida.In that case, the preceding resolve and connect steps need to be retried, and this cycle is repeated until the connection succeeds.

Ligar a outros serviçosConnecting to other services

Ligar entre si dentro de um cluster em geral de serviços podem acessar diretamente os pontos finais de outros serviços porque os nós num cluster estão na mesma rede local.Services connecting to each other inside a cluster generally can directly access the endpoints of other services because the nodes in a cluster are on the same local network. Para tornar mais fácil ligar entre os serviços, o Service Fabric fornece serviços adicionais que utilizam o serviço de nomenclatura.To make is easier to connect between services, Service Fabric provides additional services that use the Naming Service. Um serviço DNS e um serviço de proxy inverso.A DNS service and a reverse proxy service.

Serviço DNSDNS service

Já que muitos serviços, especialmente em contentores de serviços, pode ter um nome de URL existente, ser capaz de resolver estes usando o DNS padrão protocol (em vez do protocolo de Naming Service) é muito conveniente, especialmente em cenários de "lift- and -shift" de aplicações.Since many services, especially containerized services, can have an existing URL name, being able to resolve these using the standard DNS protocol (rather than the Naming Service protocol) is very convenient, especially in application "lift and shift" scenarios. Isso é exatamente o que faz o serviço DNS.This is exactly what the DNS service does. Permite-lhe mapear nomes DNS para um nome de serviço e, por conseguinte, resolver endereços IP do ponto final.It enables you to map DNS names to a service name and hence resolve endpoint IP addresses.

Conforme mostrado no diagrama seguinte, o serviço DNS, em execução no cluster do Service Fabric, mapeia nomes DNS para nomes de serviço que são, em seguida, resolvidos pelo serviço de nomenclatura para devolver os endereços de ponto de extremidade para ligar a.As shown in the following diagram, the DNS service, running in the Service Fabric cluster, maps DNS names to service names which are then resolved by the Naming Service to return the endpoint addresses to connect to. O nome DNS para o serviço está disponível no momento da criação.The DNS name for the service is provided at the time of creation.

pontos finais de serviço

Para obter mais detalhes sobre como utilizar o DNS do serviço ver serviço DNS no Azure Service Fabric artigo.For more details on how to use the DNS service see DNS service in Azure Service Fabric article.

Serviço de proxy inversoReverse proxy service

O proxy inverso lida com os serviços do cluster que expõe os pontos de extremidade HTTP incluindo HTTPS.The reverse proxy addresses services in the cluster that exposes HTTP endpoints including HTTPS. O proxy inverso simplifica a chamar outros serviços e seus métodos, fazendo com que um formato URI específico e manipula o resolver, ligar, repita os passos necessários para um serviço comunicar com outra com o serviço de nomenclatura.The reverse proxy greatly simplifies calling other services and their methods by having a specific URI format and handles the resolve, connect, retry steps required for one service to communicate with another using the Naming Service. Em outras palavras, ele oculta o serviço de nomenclatura do utilizador ao chamar outros serviços, fazendo isso tão simples quanto chamar um URL.In other words, it hides the Naming Service from you when calling other services by making this as simple as calling a URL.

pontos finais de serviço

Para obter mais detalhes sobre como utilizar o serviço de proxy inverso, consulte proxy no Azure Service Fabric inverso artigo.For more details on how to use the reverse proxy service see Reverse proxy in Azure Service Fabric article.

Ligações de clientes externosConnections from external clients

Ligar entre si dentro de um cluster em geral de serviços podem acessar diretamente os pontos finais de outros serviços porque os nós num cluster estão na mesma rede local.Services connecting to each other inside a cluster generally can directly access the endpoints of other services because the nodes in a cluster are on the same local network. Em alguns ambientes, no entanto, um cluster pode ser atrás de um balanceador de carga que encaminha o tráfego de entrada externos por meio de um conjunto limitado de portas.In some environments, however, a cluster may be behind a load balancer that routes external ingress traffic through a limited set of ports. Nestes casos, serviços ainda podem comunicar entre si e resolver os endereços com o serviço de nomenclatura, mas são necessárias etapas adicionais para permitir que os clientes externos se ligam aos serviços.In these cases, services can still communicate with each other and resolve addresses using the Naming Service, but extra steps must be taken to allow external clients to connect to services.

O Service Fabric no AzureService Fabric in Azure

Um cluster do Service Fabric no Azure é colocado atrás de um balanceador de carga do Azure.A Service Fabric cluster in Azure is placed behind an Azure Load Balancer. Todo o tráfego externo para o cluster tem de passar pelo balanceador de carga.All external traffic to the cluster must pass through the load balancer. O Balanceador de carga automaticamente irá reencaminhar o tráfego de entrada numa determinada porta para um aleatório que tenha a mesma porta abrir.The load balancer will automatically forward traffic inbound on a given port to a random node that has the same port open. O Azure Load Balancer só sabe sobre portas, abertas na nós, ele não sabe sobre portas abertas por indivíduo serviços.The Azure Load Balancer only knows about ports open on the nodes, it does not know about ports open by individual services.

Topologia de Balanceador de carga e o Service Fabric do Azure

Por exemplo, para aceitar o tráfego na porta externo 80, tem de ser configurados os seguintes procedimentos:For example, in order to accept external traffic on port 80, the following things must be configured:

  1. Escreva um serviço que fica à escuta na porta 80.Write a service that listens on port 80. Configurar a porta 80 no servicemanifest. XML do serviço e abra um serviço de escuta no serviço, por exemplo, um servidor web de hospedagem interna.Configure port 80 in the service's ServiceManifest.xml and open a listener in the service, for example, a self-hosted web server.

    <Resources>
        <Endpoints>
            <Endpoint Name="WebEndpoint" Protocol="http" Port="80" />
        </Endpoints>
    </Resources>
    
        class HttpCommunicationListener : ICommunicationListener
        {
            ...
    
            public Task<string> OpenAsync(CancellationToken cancellationToken)
            {
                EndpointResourceDescription endpoint =
                    serviceContext.CodePackageActivationContext.GetEndpoint("WebEndpoint");
    
                string uriPrefix = $"{endpoint.Protocol}://+:{endpoint.Port}/myapp/";
    
                this.httpListener = new HttpListener();
                this.httpListener.Prefixes.Add(uriPrefix);
                this.httpListener.Start();
    
                string publishUri = uriPrefix.Replace("+", FabricRuntime.GetNodeContext().IPAddressOrFQDN);
                return Task.FromResult(publishUri);
            }
    
            ...
        }
    
        class WebService : StatelessService
        {
            ...
    
            protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
            {
                return new[] { new ServiceInstanceListener(context => new HttpCommunicationListener(context))};
            }
    
            ...
        }
    
        class HttpCommunicationlistener implements CommunicationListener {
            ...
    
            @Override
            public CompletableFuture<String> openAsync(CancellationToken arg0) {
                EndpointResourceDescription endpoint =
                    this.serviceContext.getCodePackageActivationContext().getEndpoint("WebEndpoint");
                try {
                    HttpServer server = com.sun.net.httpserver.HttpServer.create(new InetSocketAddress(endpoint.getPort()), 0);
                    server.start();
    
                    String publishUri = String.format("http://%s:%d/",
                        this.serviceContext.getNodeContext().getIpAddressOrFQDN(), endpoint.getPort());
                    return CompletableFuture.completedFuture(publishUri);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
    
            ...
        }
    
        class WebService extends StatelessService {
            ...
    
            @Override
            protected List<ServiceInstanceListener> createServiceInstanceListeners() {
                <ServiceInstanceListener> listeners = new ArrayList<ServiceInstanceListener>();
                listeners.add(new ServiceInstanceListener((context) -> new HttpCommunicationlistener(context)));
                return listeners;       
            }
    
            ...
        }
    
  2. Criar um Cluster do Service Fabric no Azure e especifique a porta 80 como uma porta de ponto final personalizado para o tipo de nó que irá alojar o serviço.Create a Service Fabric Cluster in Azure and specify port 80 as a custom endpoint port for the node type that will host the service. Se tiver mais de um tipo de nó, pode configurar uma restrição de posicionamento no serviço para se certificar de que só é executada no tipo de nó que tenha a porta de ponto final personalizado aberta.If you have more than one node type, you can set up a placement constraint on the service to ensure it only runs on the node type that has the custom endpoint port opened.

    Abrir uma porta num tipo de nó

  3. Depois do cluster ter sido criado, configure o Balanceador de carga do Azure no grupo de recursos do cluster para encaminhar o tráfego na porta 80.Once the cluster has been created, configure the Azure Load Balancer in the cluster's Resource Group to forward traffic on port 80. Ao criar um cluster através do portal do Azure, este passo é configurado automaticamente para cada porta de ponto final personalizado que foi configurada.When creating a cluster through the Azure portal, this is set up automatically for each custom endpoint port that was configured.

    Encaminhamento de tráfego no balanceador de carga do Azure

  4. O Balanceador de carga do Azure utiliza uma sonda para determinar se deve ou não enviar tráfego para um determinado nó.The Azure Load Balancer uses a probe to determine whether or not to send traffic to a particular node. A sonda verifica periodicamente a um ponto de extremidade em cada nó para determinar se é ou não o nó está a responder.The probe periodically checks an endpoint on each node to determine whether or not the node is responding. Se a sonda falhará receber uma resposta após um número de vezes configurado, o Balanceador de carga deixará de enviar o tráfego para esse nó.If the probe fails to receive a response after a configured number of times, the load balancer stops sending traffic to that node. Ao criar um cluster através do portal do Azure, uma sonda é configurada automaticamente para cada porta de ponto final personalizado que foi configurada.When creating a cluster through the Azure portal, a probe is automatically set up for each custom endpoint port that was configured.

    Encaminhamento de tráfego no balanceador de carga do Azure

É importante lembrar-se de que o Balanceador de carga do Azure e a sonda apenas sabem sobre o nós, e não a serviços em execução em nós.It's important to remember that the Azure Load Balancer and the probe only know about the nodes, not the services running on the nodes. O Azure Load Balancer sempre irão enviar o tráfego a nós respondem à sonda, pelo que deve ter cuidado para garantir que os serviços estão disponíveis em nós que são capazes de responder para a sonda.The Azure Load Balancer will always send traffic to nodes that respond to the probe, so care must be taken to ensure services are available on the nodes that are able to respond to the probe.

Reliable Services: Opções de API de comunicação incorporadaReliable Services: Built-in communication API options

A estrutura de Reliable Services vem com várias opções de comunicação criados previamente.The Reliable Services framework ships with several pre-built communication options. A decisão sobre qual um funcionará melhor para depende da opção do modelo de programação, a estrutura de comunicação e a linguagem de programação que seus serviços são escritos em.The decision about which one will work best for you depends on the choice of the programming model, the communication framework, and the programming language that your services are written in.

  • Nenhum protocolo específico: Se não tiver uma opção específica do framework de comunicação, mas pretende obter algo cópia de segurança e a funcionar rapidamente, em seguida, é a opção ideal para comunicação remota do serviço, que permite a rigidez de tipos de procedimento remoto chama para Reliable Services e Reliable Actors.No specific protocol: If you don't have a particular choice of communication framework, but you want to get something up and running quickly, then the ideal option for you is service remoting, which allows strongly-typed remote procedure calls for Reliable Services and Reliable Actors. Esta é a maneira mais fácil e rápida para iniciar a comunicação de serviço.This is the easiest and fastest way to get started with service communication. Comunicação remota do serviço processa a resolução de endereços do serviço, ligação, tente novamente e tratamento de erros.Service remoting handles resolution of service addresses, connection, retry, and error handling. Isto está disponível para C# e aplicações de Java.This is available for both C# and Java applications.
  • HTTP: Para a comunicação de linguagem desconhecida, o HTTP fornece uma opção de norma da indústria com ferramentas e servidores HTTP disponíveis em várias linguagens diferentes, todos suportadas pelo Service Fabric.HTTP: For language-agnostic communication, HTTP provides an industry-standard choice with tools and HTTP servers available in many different languages, all supported by Service Fabric. Os serviços podem utilizar qualquer pilha HTTP disponível, incluindo ASP.NET Web API para C# aplicações.Services can use any HTTP stack available, including ASP.NET Web API for C# applications. Os clientes gravados em C# pode tirar partido do ICommunicationClient e ServicePartitionClient classes, ao passo que para Java, utilize o CommunicationClient e FabricServicePartitionClient classes, para resolução de serviço, ligações HTTP e loops de repetição.Clients written in C# can leverage the ICommunicationClient and ServicePartitionClient classes, whereas for Java, use the CommunicationClient and FabricServicePartitionClient classes, for service resolution, HTTP connections, and retry loops.
  • WCF: Se tiver o código existente que usa WCF como sua arquitetura de comunicação, em seguida, pode utilizar o WcfCommunicationListener no lado do servidor e WcfCommunicationClient e ServicePartitionClient classes para o cliente.WCF: If you have existing code that uses WCF as your communication framework, then you can use the WcfCommunicationListener for the server side and WcfCommunicationClient and ServicePartitionClient classes for the client. Isso no entanto só está disponível para C# clusters baseados em aplicativos no Windows.This however is only available for C# applications on Windows based clusters. Para obter mais detalhes, consulte este artigo baseadas no WCF implementação da pilha de comunicação.For more details, see this article about WCF-based implementation of the communication stack.

Usando protocolos personalizados e outras estruturas de comunicaçãoUsing custom protocols and other communication frameworks

Os serviços podem utilizar qualquer protocolo ou a arquitetura para a comunicação, quer se trate de um protocolo binário personalizado através de soquetes TCP ou eventos de transmissão em fluxo por meio os Hubs de eventos do Azure ou IoT Hub do Azure.Services can use any protocol or framework for communication, whether its a custom binary protocol over TCP sockets, or streaming events through Azure Event Hubs or Azure IoT Hub. O Service Fabric fornece comunicação APIs que pode conectar sua pilha de comunicações, enquanto todo o trabalho para descoberta e ligação é abstraído do utilizador.Service Fabric provides communication APIs that you can plug your communication stack into, while all the work to discover and connect is abstracted from you. Veja este artigo o modelo de comunicação de Reliable Service para obter mais detalhes.See this article about the Reliable Service communication model for more details.

Passos SeguintesNext steps

Saiba mais sobre os conceitos e as APIs disponíveis na modelo de comunicação de Reliable Services, em seguida, começar rapidamente com comunicação remota do serviço ou aprofundar-se de que aprender a escrever uma comunicação serviço de escuta usando API da Web com o OWIN hospedar internamente.Learn more about the concepts and APIs available in the Reliable Services communication model, then get started quickly with service remoting or go in-depth to learn how to write a communication listener using Web API with OWIN self-host.