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:
- 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. - 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.