Comunicazione remota con i servizi in Java con Reliable ServicesService remoting in Java with Reliable Services

Per i servizi che non sono legati a un protocollo di comunicazione o uno stack particolare, ad esempio WebAPI, Windows Communication Foundation (WCF) o altri, il framework Reliable Services fornisce un meccanismo remoto per impostare in modo semplice e rapido chiamate di procedura remota per i servizi.For services that aren't tied to a particular communication protocol or stack, such as WebAPI, Windows Communication Foundation (WCF), or others, the Reliable Services framework provides a remoting mechanism to quickly and easily set up remote procedure calls for services. In questo articolo viene illustrato come impostare le chiamate di procedura remota per i servizi scritti con Java.This article discusses how to set up remote procedure calls for services written with Java.

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.

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 di ServiceProxy è un'operazione semplice e, pertanto, è possibile creare quanti proxy si desidera.ServiceProxy creation is a lightweight operation, so you can create as many as you need. Le istanze del proxy servizio possono essere usate più volte, fintanto che sono necessarie.Service Proxy instances can be reused as long as they are needed. Se una chiamata di procedura remota genera un'eccezione, è possibile comunque riusare la stessa istanza del proxy.If a remote procedure call throws an Exception, you can still reuse the same proxy instance. Ogni proxy servizio contiene un client di comunicazione usato per inviare messaggi sulla rete.Each ServiceProxy contains a communication client used to send messages over the wire. Durante le chiamate remote, vengono effettuati controlli interni per verificare che il client di comunicazione sia valido.While invoking remote calls, internal checks are performed to determine if the communication client is valid. In base ai risultati di tali controlli, se necessario, il client di comunicazione viene ricreato.Based on the results of those checks, the communication client is recreated if needed. Pertanto, se si verifica un'eccezione, non è necessario ricreare ServiceProxy.Therefore, if an exception occurs, you do not need to recreate ServiceProxy.

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/java/api/microsoft.servicefabric.services.communication.client._operation_retry_settings) È possibile configurare questi valori passando l'oggetto OperationRetrySettings al costruttore ServiceProxyFactory.(https://docs.microsoft.com/java/api/microsoft.servicefabric.services.communication.client._operation_retry_settings) You can configure these values by passing OperationRetrySettings object to ServiceProxyFactory constructor.

Passaggi successiviNext steps