Vzdálená komunikace služby v Javě s Reliable Services

Pro služby, které nejsou vázány na konkrétní komunikační protokol nebo zásobník, jako je WebAPI, Windows Communication Foundation (WCF) nebo jiné, poskytuje rozhraní Reliable Services mechanismus vzdálené komunikace pro rychlé a snadné nastavení vzdálených volání procedur pro služby. Tento článek popisuje, jak nastavit vzdálená volání procedur pro služby napsané v Javě.

Nastavení vzdálené komunikace ve službě

Nastavení vzdálené komunikace pro službu se provádí ve dvou jednoduchých krocích:

  1. Vytvořte rozhraní pro vaši službu, která se má implementovat. Toto rozhraní definuje metody, které jsou k dispozici pro vzdálené volání procedur ve vaší službě. Metody musí být asynchronní metody vracející úlohy. Rozhraní musí implementovat microsoft.serviceFabric.services.remoting.Service , aby signalizovalo, že služba má rozhraní vzdálené komunikace.
  2. Použijte ve službě naslouchací proces vzdálené komunikace. Jedná se o CommunicationListener implementaci, která poskytuje možnosti vzdálené komunikace. FabricTransportServiceRemotingListener lze použít k vytvoření naslouchacího procesu vzdálené komunikace pomocí výchozího protokolu přenosu vzdálené komunikace.

Například následující bezstavová služba zveřejňuje jednu metodu pro získání "Hello World" přes vzdálené volání procedury.

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;
    }
}

Poznámka

Argumenty a návratové typy v rozhraní služby mohou být jakékoli jednoduché, složité nebo vlastní typy, ale musí být serializovatelné.

Volání metod vzdálené služby

Volání metod ve službě pomocí zásobníku vzdálené komunikace se provádí pomocí místního proxy serveru pro službu prostřednictvím microsoft.serviceFabric.services.remoting.client.ServiceProxyBase třídy . Metoda ServiceProxyBase vytvoří místní proxy server pomocí stejného rozhraní, které služba implementuje. S tímto proxy serverem můžete jednoduše vzdáleně volat metody v rozhraní.


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

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

Architektura vzdálené komunikace šíří výjimky vyvolané službou do klienta. Takže logika zpracování výjimek v klientovi pomocí ServiceProxyBase může přímo zpracovávat výjimky, které služba vyvolává.

Životnost proxy serveru služby

Vytvoření ServiceProxy je jednoduchá operace, takže jich můžete vytvořit tolik, kolik potřebujete. Instance proxy služby je možné opakovaně používat, pokud jsou potřeba. Pokud volání vzdálené procedury vyvolá výjimku, můžete stále znovu použít stejnou instanci proxy serveru. Každá služba ServiceProxy obsahuje komunikačního klienta, který se používá k odesílání zpráv prostřednictvím přenosu. Při volání vzdálených volání se provádějí interní kontroly, které určují, jestli je komunikační klient platný. Na základě výsledků těchto kontrol se v případě potřeby znovu vytvoří komunikační klient. Proto pokud dojde k výjimce, nemusíte znovu vytvářet ServiceProxy.

Životnost ServiceProxyFactory

FabricServiceProxyFactory je továrna, která vytváří proxy server pro různá rozhraní vzdálené komunikace. Pokud k vytváření proxy používáte rozhraní API ServiceProxyBase.create , pak architektura vytvoří FabricServiceProxyFactory. Pokud potřebujete přepsat vlastnosti ServiceRemotingClientFactory , je užitečné ho vytvořit ručně. Továrna je nákladná operace. FabricServiceProxyFactory udržuje mezipaměť komunikačních klientů. Osvědčeným postupem je ukládat do mezipaměti FabricServiceProxyFactory co nejdéle.

Zpracování výjimek vzdálené komunikace

Všechny vzdálené výjimky vyvolané rozhraním API služby se odesílají zpět do klienta jako RuntimeException nebo FabricException.

ServiceProxy zpracovává všechny výjimky převzetí služeb při selhání pro oddíl služby, pro který je vytvořený. Přeloží koncové body, pokud existují výjimky převzetí služeb při selhání (nepřechádné výjimky), a znovu se pokusí o volání se správným koncovým bodem. Počet opakování pro výjimku převzetí služeb při selhání je neurčitý. V případě TransientExceptions pouze opakuje volání.

Výchozí parametry opakování jsou nastavené pomocí OperationRetrySettings. Tyto hodnoty můžete nakonfigurovat předáním objektu OperationRetrySettings konstruktoru ServiceProxyFactory.

Další kroky