Servizio remoto con Reliable ServicesService remoting with Reliable Services

Il framework Reliable Services fornisce un meccanismo remoto per impostare in modo semplice e rapido una chiamata di procedura remota per i servizi.The Reliable Services framework provides a remoting mechanism to quickly and easily set up remote procedure call for services.

Impostare la funzionalità remota in un servizioSet up remoting on a service

La procedura di impostazione della funzionalità remota per un servizio è costituita da due semplici passaggi.Setting up remoting for a service is done in two simple steps:

  1. Creare un'interfaccia per l’implementazione del servizio.Create an interface for your service to implement. Questa interfaccia definisce i metodi che sono disponibili per una chiamata di procedura remota nel servizioThis interface defines the methods that are available for a remote procedure call on your service. e devono essere metodi asincroni di restituzione di attività.The methods must be task-returning asynchronous methods. L'interfaccia deve implementare microsoft.serviceFabric.services.remoting.Service per segnalare che il servizio dispone di un'interfaccia remota.The interface must implement microsoft.serviceFabric.services.remoting.Service to signal that the service has a remoting interface.
  2. Usare un listener di comunicazione remota nel servizio.Use a remoting listener in your service. Si tratta di un’implementazione CommunicationListener che fornisce funzionalità di accesso remoto.This is an CommunicationListener implementation that provides remoting capabilities. FabricTransportServiceRemotingListener può essere usato per creare un listener di comunicazione remota con il protocollo di trasporto predefinito per la comunicazione remota.FabricTransportServiceRemotingListener can be used to create a remoting listener using the default remoting transport protocol.

Ad esempio, il servizio senza stato seguente espone un metodo singolo per ottenere "Hello World" su una chiamata RPC.For example, the following stateless service exposes a single method to get "Hello World" over a remote procedure call.

import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
import java.util.List;
import microsoft.servicefabric.services.communication.runtime.ServiceInstanceListener;
import microsoft.servicefabric.services.remoting.Service;
import microsoft.servicefabric.services.runtime.StatelessService;

public interface MyService extends Service {
    CompletableFuture<String> helloWorldAsync();
}

class MyServiceImpl extends StatelessService implements MyService {
    public MyServiceImpl(StatelessServiceContext context) {
       super(context);
    }

    public CompletableFuture<String> helloWorldAsync() {
        return CompletableFuture.completedFuture("Hello!");
    }

    @Override
    protected List<ServiceInstanceListener> createServiceInstanceListeners() {
        ArrayList<ServiceInstanceListener> listeners = new ArrayList<>();
        listeners.add(new ServiceInstanceListener((context) -> {
            return new FabricTransportServiceRemotingListener(context,this);
        }));
        return listeners;
    }
}

Nota

Gli argomenti e i tipi restituiti nell'interfaccia del servizio possono essere semplici, complessi o personalizzati ma, in tutti i casi, devono essere serializzabili.The arguments and the return types in the service interface can be any simple, complex, or custom types, but they must be serializable.

Chiamare i metodi del servizio remotoCall remote service methods

La chiamata dei metodi su un servizio mediante lo stack remoto viene eseguita usando un proxy locale al servizio tramite la classe microsoft.serviceFabric.services.remoting.client.ServiceProxyBase .Calling methods on a service by using the remoting stack is done by using a local proxy to the service through the microsoft.serviceFabric.services.remoting.client.ServiceProxyBase class. Il metodo ServiceProxyBase crea un proxy locale usando la stessa interfaccia implementata dal servizio.The ServiceProxyBase method creates a local proxy by using the same interface that the service implements. Con tale proxy, è possibile semplicemente chiamare dei metodi nell'interfaccia in modalità remota.With that proxy, you can simply call methods on the interface remotely.


MyService helloWorldClient = ServiceProxyBase.create(MyService.class, new URI("fabric:/MyApplication/MyHelloWorldService"));

CompletableFuture<String> message = helloWorldClient.helloWorldAsync();

Il framework remoto propaga le eccezioni generate nel servizio al client.The remoting framework propagates exceptions thrown at the service to the client. La logica di gestione delle eccezioni nel client tramite ServiceProxyBase , quindi, è in grado di gestire direttamente le eccezioni generate dal servizio.So exception-handling logic at the client by using ServiceProxyBase can directly handle exceptions that the service throws.

Durata del proxy servizioService Proxy Lifetime

La creazione del proxy servizio è un'operazione semplice, pertanto l'utente può creare quanti proxy desidera.ServiceProxy creation is a lightweight operation, so user can create as many as they need it. Il proxy servizio può essere usato più volte, fintanto che l'utente ne ha necessità.Service Proxy can be re-used as long as user need it. L'utente può usare nuovamente lo stesso proxy in caso di eccezione.User can re-use the same proxy in case of Exception. Ogni ServiceProxy contiene il client di comunicazione usato per inviare messaggi sulla rete.Each ServiceProxy contains communication client used to send messages over the wire. Durante la chiamata all'API, vengono effettuati controlli interni per verificare se il client di comunicazione usato è valido.While invoking API, we have internal check to see if communication client used is valid. In base al risultato, il client di comunicazione viene ricreato.Based on that result, we re-create the communication client. L'utente non ha pertanto necessità di ricreare il proxy servizio in caso di eccezione.Hence user do not need to recreate serviceproxy in case of Exception.

Durata di ServiceProxyFactoryServiceProxyFactory Lifetime

FabricServiceProxyFactory è una factory che crea proxy per diverse interfacce di connessione remota.FabricServiceProxyFactory is a factory that creates proxy for different remoting interfaces. Se si usa l'API ServiceProxyBase.create per la creazione del proxy, il framework crea una FabricServiceProxyFactory.If you use API ServiceProxyBase.create for creating proxy, then framework creates a FabricServiceProxyFactory. È utile per crearne una manualmente quando è necessario eseguire l'override delle proprietà ServiceRemotingClientFactory.It is useful to create one manually when you need to override ServiceRemotingClientFactory properties. La factory è un'operazione costosa.Factory is an expensive operation. FabricServiceProxyFactory gestisce la cache dei client di comunicazione.FabricServiceProxyFactory maintains cache of communication clients. La procedura consigliata consiste nel mantenere FabricServiceProxyFactory memorizzato nella cache il più a lungo possibile.Best practice is to cache FabricServiceProxyFactory for as long as possible.

Gestione delle eccezioni remoteRemoting Exception Handling

Tutte le eccezioni generate dall'API del servizio vengono inviate nuovamente al client come RuntimeException o FabricException.All the remote exception thrown by service API, are sent back to the client either as RuntimeException or FabricException.

Il proxy servizio non gestisce tutte le eccezioni di failover per la partizione del servizio per la quale è stato creato.ServiceProxy does handle all Failover Exception for the service partition it is created for. Risolve nuovamente gli endpoint in presenza di eccezioni di failover (eccezioni non temporanee) e tenta di nuovo la chiamata con l'endpoint corretto.It re-resolves the endpoints if there is Failover Exceptions(Non-Transient Exceptions) and retries the call with the correct endpoint. Il numero di tentativi per l'eccezione di failover è indefinito.Number of retries for failover Exception is indefinite. In caso di eccezioni temporanee ritenta solo la chiamata.In case of TransientExceptions, it only retries the call.

Parametri di ripetizione dei tentativi predefiniti sono forniti da [OperationRetrySettings].Default retry parameters are provied by [OperationRetrySettings]. (https://docs.microsoft.com/en-us/java/api/microsoft.servicefabric.services.communication.client._operation_retry_settings) L'utente può configurare questi valori passando l'oggetto OperationRetrySettings al costruttore di ServiceProxyFactory.(https://docs.microsoft.com/en-us/java/api/microsoft.servicefabric.services.communication.client._operation_retry_settings) User can configure these values by passing OperationRetrySettings object to ServiceProxyFactory constructor.

Passaggi successiviNext steps