Comunicazione remota con i servizi in Java con 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. In questo articolo viene illustrato come impostare le chiamate di procedura remota per i servizi scritti con Java.

Impostare la funzionalità remota in un servizio

La procedura di impostazione della funzionalità remota per un servizio è costituita da due semplici passaggi.

  1. Creare un'interfaccia per l’implementazione del servizio. Questa interfaccia definisce i metodi che sono disponibili per una chiamata di procedura remota nel servizio e devono essere metodi asincroni di restituzione di attività. L'interfaccia deve implementare microsoft.serviceFabric.services.remoting.Service per segnalare che il servizio dispone di un'interfaccia remota.
  2. Usare un listener di comunicazione remota nel servizio. Si tratta di un’implementazione CommunicationListener che fornisce funzionalità di accesso remoto. FabricTransportServiceRemotingListener può essere usato per creare un listener di comunicazione remota con il protocollo di trasporto predefinito per la comunicazione remota.

Ad esempio, il servizio senza stato seguente espone un metodo singolo per ottenere "Hello World" su una chiamata RPC.

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 remoto

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 . Il metodo ServiceProxyBase crea un proxy locale usando la stessa interfaccia implementata dal servizio. Con tale proxy, è possibile semplicemente chiamare dei metodi nell'interfaccia in modalità remota.


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. La logica di gestione delle eccezioni nel client tramite ServiceProxyBase , quindi, è in grado di gestire direttamente le eccezioni generate dal servizio.

Durata del proxy servizio

La creazione di ServiceProxy è un'operazione semplice e, pertanto, è possibile creare quanti proxy si desidera. Le istanze del proxy servizio possono essere usate più volte, fintanto che sono necessarie. Se una chiamata di procedura remota genera un'eccezione, è possibile comunque riusare la stessa istanza del proxy. Ogni proxy servizio contiene un client di comunicazione usato per inviare messaggi sulla rete. Durante le chiamate remote, vengono effettuati controlli interni per verificare che il client di comunicazione sia valido. In base ai risultati di tali controlli, se necessario, il client di comunicazione viene ricreato. Pertanto, se si verifica un'eccezione, non è necessario ricreare ServiceProxy.

Durata di ServiceProxyFactory

FabricServiceProxyFactory è una factory che crea proxy per diverse interfacce di connessione remota. Se si usa l'API ServiceProxyBase.create per la creazione del proxy, il framework crea una FabricServiceProxyFactory. È utile per crearne una manualmente quando è necessario eseguire l'override delle proprietà ServiceRemotingClientFactory. La factory è un'operazione costosa. FabricServiceProxyFactory gestisce la cache dei client di comunicazione. La procedura consigliata consiste nel mantenere FabricServiceProxyFactory memorizzato nella cache il più a lungo possibile.

Gestione delle eccezioni remote

Tutte le eccezioni generate dall'API del servizio vengono inviate nuovamente al client come RuntimeException o FabricException.

ServiceProxy gestisce tutte le eccezioni di failover per la partizione del servizio per cui viene creato. Risolve nuovamente gli endpoint in presenza di eccezioni di failover (eccezioni non temporanee) e tenta di nuovo la chiamata con l'endpoint corretto. Il numero di tentativi per l'eccezione di failover è indefinito. In caso di eccezioni temporanee ritenta solo la chiamata.

I parametri di ripetizione dei tentativi predefiniti vengono specificati da OperationRetrySettings. È possibile configurare questi valori passando l'oggetto OperationRetrySettings al costruttore ServiceProxyFactory.

Passaggi successivi