Connettersi e comunicare con i servizi in Service FabricConnect and communicate with services in Service Fabric

In Service Fabric un servizio viene eseguito in una posizione nel cluster di Service Fabric, in genere distribuito su più macchine virtuali.In Service Fabric, a service runs somewhere in a Service Fabric cluster, typically distributed across multiple VMs. Può essere spostato da una posizione all'altra, dal proprietario del servizio o automaticamente da Service Fabric.It can be moved from one place to another, either by the service owner, or automatically by Service Fabric. I servizi non sono statisticamente associati a un computer o a un indirizzo specifico.Services are not statically tied to a particular machine or address.

Un'applicazione di Service Fabric è in genere costituita da molti servizi diversi, ognuno dei quali esegue un'attività specializzata.A Service Fabric application is generally composed of many different services, where each service performs a specialized task. Questi servizi possono comunicare tra loro per formare una funzione completa, ad esempio il rendering di diverse parti di un'applicazione Web.These services may communicate with each other to form a complete function, such as rendering different parts of a web application. Sono inoltre presenti applicazioni client che si connettono ai servizi e comunicano con essi.There are also client applications that connect to and communicate with services. Questo documento illustra come configurare la comunicazione con e tra i servizi in Service Fabric.This document discusses how to set up communication with and between your services in Service Fabric.

Questo video di Microsoft Virtual Academy illustra anche la comunicazione tra servizi:

This Microsoft Virtual Academy video also discusses service communication:


Usare un protocollo personalizzatoBring your own protocol

Service Fabric semplifica la gestione del ciclo di vita dei servizi ma non prende alcuna decisione sulle operazioni che devono essere eseguite dai servizi, incluse le comunicazioni.Service Fabric helps manage the lifecycle of your services but it does not make decisions about what your services do. incluse le comunicazioni.This includes communication. Quando il servizio viene aperto da Service Fabric, può configurare un endpoint per le richieste in ingresso, usando qualsiasi protocollo o stack di comunicazione.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. Il servizio rimarrà in ascolto su un indirizzo IP:porta normale usando qualsiasi schema di indirizzamento, ad esempio un URI.Your service will listen on a normal IP:port address using any addressing scheme, such as a URI. In questo caso, dovranno usare porte diverse o un meccanismo di condivisione di porte, ad esempio il driver del kernel http.sys in 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. In entrambi i casi, ogni istanza o replica del servizio in un processo host deve essere indirizzabile in modo univoco.In either case, each service instance or replica in a host process must be uniquely addressable.

Endpoint del servizio

Individuazione e risoluzione del servizioService discovery and resolution

In un sistema distribuito è possibile che i servizi si spostino da un computer a un altro nel tempoIn a distributed system, services may move from one machine to another over time. per vari motivi, incluso il bilanciamento delle risorse, aggiornamenti, failover o aumento del numero di istanze. Gli indirizzi dell'endpoint di servizio subiscono quindi modifiche quando il servizio si sposta in nodi con indirizzi IP diversi ed è possibile che si aprano su porte diverse se il servizio usa una porta selezionata in modo dinamico.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.

Distribuzione dei servizi

Service Fabric offre un servizio di individuazione e risoluzione denominato servizio Naming.Service Fabric provides a discovery and resolution service called the Naming Service. Il servizio Naming gestisce una tabella che esegue il mapping delle istanze del servizio denominato agli indirizzi dell'endpoint su cui rimangono in ascolto.The Naming Service maintains a table that maps named service instances to the endpoint addresses they listen on. Tutte le istanze del servizio denominato in Service Fabric hanno nomi univoci rappresentati come URI, ad esempio "fabric:/MyApplication/MyService".All named service instances in Service Fabric have unique names represented as URIs, for example, "fabric:/MyApplication/MyService". Il nome del servizio non cambia per tutta la durata del servizio. Solo gli indirizzi dell'endpoint possono essere modificati quando i servizi si spostano.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. analogamente ai siti Web che hanno URL costanti, ma il cui indirizzo IP può cambiare.This is analogous to websites that have constant URLs but where the IP address may change. Analogamente a DNS sul Web, che risolve URL di siti Web in indirizzi IP, Service Fabric ha un registrar che esegue il mapping dei nomi di servizio ai rispettivi indirizzi di endpoint.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.

Endpoint del servizio

La risoluzione e la connessione ai servizi prevedono l'esecuzione in ciclo dei passaggi seguenti:Resolving and connecting to services involves the following steps run in a loop:

  • Risoluzione: ottenere dal servizio Naming l'endpoint pubblicato da un servizio.Resolve: Get the endpoint that a service has published from the Naming Service.
  • Connessione: connettersi al servizio sul protocollo usato nell'endpoint.Connect: Connect to the service over whatever protocol it uses on that endpoint.
  • Ripetizione dei tentativi: è possibile che un tentativo di connessione abbia esito negativo per svariati motivi, ad esempio se il servizio si è spostato dopo l'ultima risoluzione dell'indirizzo dell'endpoint.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. In questo caso, è necessario provare a ripetere i passaggi precedenti di risoluzione e connessione e il ciclo viene ripetuto finché la connessione non riesce.In that case, the preceding resolve and connect steps need to be retried, and this cycle is repeated until the connection succeeds.

Connessione ad altri serviziConnecting to other services

I servizi che si connettono tra loro in un cluster possono in genere accedere direttamente agli endpoint di altri servizi perché i nodi di un cluster si trovano nella stessa rete locale.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. Per facilitare la connessione tra servizi, Service Fabric offre servizi aggiuntivi che usano Naming Service,To make is easier to connect between services, Service Fabric provides additional services that use the Naming Service. un servizio DNS e un servizio di proxy inverso.A DNS service and a reverse proxy service.

Servizio DNSDNS service

Poiché molti servizi, in particolare quelli in contenitori, possono avere un nome di URL esistente, la possibilità di risolverli usando il protocollo DNS standard, anziché il protocollo Naming Service, è molto utile, in particolare negli scenari di applicazioni "lift-and-shift".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. Questo è esattamente ciò che fa il servizio DNS.This is exactly what the DNS service does. Consente di eseguire il mapping di nomi DNS a nomi di servizi e di conseguenza di risolvere gli indirizzi IP degli endpoint.It enables you to map DNS names to a service name and hence resolve endpoint IP addresses.

Come mostrato nel diagramma seguente, il servizio DNS, in esecuzione sul cluster di Service Fabric, esegue il mapping dei nomi DNS ai nomi dei servizi, che vengono quindi risolti da Naming Service per restituire gli indirizzi degli endpoint a cui connettersi.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. 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

Per altre informazioni su come usare il servizio DNS, vedere l'articolo DNS service in Azure Service Fabric (Servizio DNS in Azure Service Fabric).For more details on how to use the DNS service see DNS service in Azure Service Fabric article.

Servizio di proxy inversoReverse proxy service

Il proxy inverso indirizza i servizi presenti nel cluster che espongono endpoint HTTP, incluso HTTPS.The reverse proxy addresses services in the cluster that exposes HTTP endpoints including HTTPS. Il proxy inverso semplifica in misura significativa la chiamata di altri servizi e dei relativi metodi grazie alla disponibilità di un formato URI specifico. Gestisce inoltre i passaggi di risoluzione, connessione e ripetizione necessari per consentire a un servizio di comunicare con un altro servizio mediante Naming Service.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. In altri termini, durante la chiamata di altri servizi nasconde Naming Service all'utente, rendendo l'operazione semplice quanto la chiamata a un URL.In other words, it hides the Naming Service from you when calling other services by making this as simple as calling a URL.

Endpoint del servizio

Per altre informazioni su come usare il servizio di proxy inverso, vedere l'articolo Proxy inverso in Azure Service Fabric.For more details on how to use the reverse proxy service see Reverse proxy in Azure Service Fabric article.

Connessioni da client esterniConnections from external clients

I servizi che si connettono tra loro in un cluster possono in genere accedere direttamente agli endpoint di altri servizi perché i nodi di un cluster si trovano nella stessa rete locale.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. In alcuni ambienti, tuttavia, è possibile che un cluster si trovi dietro un servizio di bilanciamento del carico che indirizza il traffico esterno in ingresso attraverso un set limitato di porte.In some environments, however, a cluster may be behind a load balancer that routes external ingress traffic through a limited set of ports. In questi casi, i servizi possono comunicare comunque tra di loro e risolvere gli indirizzi usando il servizio Naming, ma sono necessari passaggi aggiuntivi per consentire ai client esterni di connettersi ai servizi.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.

Service Fabric in AzureService Fabric in Azure

Un cluster di Service Fabric in Azure viene posizionato dietro un servizio di bilanciamento del carico di Azure.A Service Fabric cluster in Azure is placed behind an Azure Load Balancer. Tutto il traffico esterno verso il cluster deve passare attraverso il servizio di bilanciamento del carico.All external traffic to the cluster must pass through the load balancer. Il servizio di bilanciamento del carico inoltrerà automaticamente il traffico in ingresso su una porta specifica verso un nodo casuale che ha la stessa porta aperta.The load balancer will automatically forward traffic inbound on a given port to a random node that has the same port open. Il servizio di bilanciamento del carico di Azure riconosce solo le porte aperte sui nodi, non le porte aperte dai singoli servizi.The Azure Load Balancer only knows about ports open on the nodes, it does not know about ports open by individual services.

Servizio di bilanciamento del carico di Azure e topologia di Service Fabric

Ad esempio, per accettare il traffico esterno sulla porta 80, è necessario configurare gli elementi seguenti:For example, in order to accept external traffic on port 80, the following things must be configured:

  1. Scrivere un servizio che resta in ascolto sulla porta 80.Write a service that listens on port 80. Configurare la porta 80 nel file ServiceManifest.xml del servizio e aprire un listener nel servizio, ad esempio un server Web self-hosted.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. Creare un cluster di Service Fabric in Azure e specificare la porta 80 come porta di endpoint personalizzata per il tipo di nodo che ospiterà il servizio.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 sono presenti più tipi di nodo, è possibile configurare un vincolo di posizionamento sul servizio per assicurare che venga eseguito solo sul tipo di nodo con la porta di endpoint personalizzata aperta.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.

    Apertura di una porta su un tipo di nodo

  3. Dopo la creazione del cluster, configurare il servizio di bilanciamento del carico di Azure nel gruppo di risorse del cluster per inoltrare il traffico sulla 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. Quando si crea un cluster tramite il portale di Azure, il cluster viene configurato automaticamente per ogni porta di endpoint personalizzata configurata.When creating a cluster through the Azure portal, this is set up automatically for each custom endpoint port that was configured.

    Inoltro di traffico nel servizio di bilanciamento del carico di Azure

  4. Il servizio di bilanciamento del carico di Azure usa un probe per determinare se inviare o meno il traffico a un nodo specifico.The Azure Load Balancer uses a probe to determine whether or not to send traffic to a particular node. Il probe controlla periodicamente un endpoint su ogni nodo per determinare se il nodo risponde o meno.The probe periodically checks an endpoint on each node to determine whether or not the node is responding. Se il probe non riesce a ricevere una risposta dopo un numero configurato di volte, il servizio di bilanciamento del carico smette di inviare traffico a quel nodo.If the probe fails to receive a response after a configured number of times, the load balancer stops sending traffic to that node. Quando si crea un cluster tramite il portale di Azure, viene configurato automaticamente un probe per ogni porta di endpoint personalizzata configurata.When creating a cluster through the Azure portal, a probe is automatically set up for each custom endpoint port that was configured.

    Inoltro di traffico nel servizio di bilanciamento del carico di Azure

È importante ricordare che il servizio di bilanciamento del carico di Azure e il probe riconoscono solo i nodi, non i servizi in esecuzione sui nodi.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. Il servizio di bilanciamento del carico di Azure invierà sempre il traffico ai nodi che rispondono al probe, quindi occorre assicurarsi che i servizi siano disponibili sui nodi che sono in grado di rispondere al probe.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: opzioni predefinite per l'API di comunicazioneReliable Services: Built-in communication API options

Il framework Reliable Services include alcune opzioni di comunicazione predefinite.The Reliable Services framework ships with several pre-built communication options. la cui scelta dipende dal modello di programmazione adottato, dal framework di comunicazione e dal linguaggio di programmazione usato per scrivere i servizi.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.

  • Nessun protocollo specifico: se non si ha una preferenza particolare per il framework di comunicazione, ma si vuole essere immediatamente operativi, l'opzione ideale è costituita dalle comunicazioni remote del servizio, che consentono chiamate a procedure remote fortemente tipizzate per 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. Questo è il modo più semplice e veloce per iniziare a comunicare con i servizi.This is the easiest and fastest way to get started with service communication. Le comunicazioni remote del servizio gestiscono la risoluzione degli indirizzi del servizio, la connessione, la ripetizione dei tentativi e la gestione degli errori.Service remoting handles resolution of service addresses, connection, retry, and error handling. Questo è disponibile sia per applicazioni C# che per applicazioni Java.This is available for both C# and Java applications.
  • HTTP: per comunicazioni indipendenti dal linguaggio, HTTP costituisce la scelta standard di settore, con strumenti e server HTTP disponibili in molti linguaggi diversi, tutti supportati da 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. I servizi possono usare qualsiasi stack HTTP disponibile, inclusa l'API Web ASP.NET per applicazioni C#.Services can use any HTTP stack available, including ASP.NET Web API for C# applications. I client scritti in C# possono sfruttare le classi ICommunicationClient e ServicePartitionClient. Per Java usare invece le classi CommunicationClient e FabricServicePartitionClient per la risoluzione del servizio, le connessioni HTTP e i cicli di ripetizione dei tentativi.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 il codice esistente usa WCF come framework di comunicazione, è possibile scegliere WcfCommunicationListener per il lato server e le classi WcfCommunicationClient e ServicePartitionClient per il client.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. Questo comunque è disponibile solo per applicazioni C# in cluster basati su Windows.This however is only available for C# applications on Windows based clusters. Per altre informazioni, vedere l'articolo Stack di comunicazione basato su WCF per Reliable Services.For more details, see this article about WCF-based implementation of the communication stack.

Uso di protocolli personalizzati e altri framework di comunicazioneUsing custom protocols and other communication frameworks

I servizi possono usare qualsiasi protocollo o framework per le comunicazioni, ad esempio un protocollo binario personalizzato su socket TCP o eventi di streaming tramite l'Hub eventi di Azure o l'Hub IoT di 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. Service Fabric fornisce API di comunicazione a cui è possibile collegare lo stack di comunicazione, mentre tutte le operazioni di individuazione e connessione vengono eseguite in modo indipendente dall'utente.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. Per altre informazioni, vedere l'articolo Modello di comunicazione Reliable Service .See this article about the Reliable Service communication model for more details.

Passaggi successiviNext steps

Per altre informazioni sui concetti e sulle API disponibili, vedere il modello di comunicazione di Reliable Services, quindi iniziare subito a usare le del servizio oppure ottenere informazioni approfondite su come scrivere un listener di comunicazione usando l'API Web con self-hosting OWIN.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.