Vzdálená komunikace služeb v Javě s využitím Reliable Services
Pro služby, které nejsou svázané s konkrétním komunikačním protokolem nebo zásobníkem, jako je WebAPI, Windows Communication Foundation (WCF) nebo jiné, poskytuje architektura 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é pomocí Javy.
Nastavení vzdálené komunikace ve službě
Nastavení vzdálené komunikace pro službu se provádí ve dvou jednoduchých krocích:
- Vytvořte rozhraní pro implementaci vaší služby. Toto rozhraní definuje metody, které jsou k dispozici pro vzdálené volání procedury ve vaší službě. Metody musí být asynchronní metody vracející úkoly. Rozhraní musí implementovat, aby signalizovalo
microsoft.serviceFabric.services.remoting.Service
, že služba má rozhraní vzdálené komunikace. - Ve službě použijte 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 přenosového protokolu 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 do služby prostřednictvím microsoft.serviceFabric.services.remoting.client.ServiceProxyBase
třídy. Metoda ServiceProxyBase
vytvoří místní proxy pomocí stejného rozhraní, které služba implementuje. S tímto proxy serverem můžete jednoduše volat metody na dálku 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í může ServiceProxyBase
přímo zpracovat výjimky, které služba vyvolá.
Životnost proxy serveru služby
Vytvoření ServiceProxy je jednoduchá operace, takže můžete vytvořit tolik, kolik potřebujete. Instance proxy služby je možné opakovaně používat, pokud jsou potřeba. Pokud vzdálené volání procedury vyvolá výjimku, můžete stále znovu použít stejnou instanci proxy serveru. Každý serviceProxy obsahuje komunikačního klienta sloužícího k odesílání zpráv přes drát. Při volání vzdálených volání se provádí interní kontroly, které určují, jestli je komunikační klient platný. Na základě výsledků těchto kontrol se komunikační klient v případě potřeby znovu vytvoří. Proto pokud dojde k výjimce, nemusíte znovu vytvořit ServiceProxy
.
Životnost služby ServiceProxyFactory
FabricServiceProxyFactory je továrna, která vytváří proxy pro různá rozhraní vzdálené komunikace. Pokud k vytváření proxy používáte rozhraní API ServiceProxyBase.create
, vytvoří FabricServiceProxyFactory
rozhraní .
Pokud potřebujete přepsat vlastnosti ServiceRemotingClientFactory , je vhodné ho vytvořit ručně.
Továrna je náročná operace. FabricServiceProxyFactory
udržuje mezipaměť komunikačních klientů.
Osvědčeným postupem je ukládání do mezipaměti FabricServiceProxyFactory
co nejdéle.
Zpracování výjimek vzdálené komunikace
Veškerá vzdálená výjimka vyvolaná rozhraním API služby se odešle zpět klientovi 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. Znovu vyřeší koncové body v případě, že dojde k výjimkám převzetí služeb při selhání (ne přechodné výjimky) a opakuje 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 neomezená. V případě TransientExceptions se volání opakuje pouze.
Výchozí parametry opakování jsou provied by OperationRetrySettings. Tyto hodnoty můžete nakonfigurovat předáním objektu OperationRetrySettings do konstruktoru ServiceProxyFactory.