Komunikacja zdalna usługi w języku Java za pomocą usług Reliable Services

W przypadku usług, które nie są powiązane z określonym protokołem komunikacyjnym lub stosem, takimi jak WebAPI, Windows Communication Foundation (WCF) lub inne usługi, platforma Reliable Services zapewnia mechanizm komunikacji zdalnej umożliwiający szybkie i łatwe konfigurowanie wywołań procedur zdalnych dla usług. W tym artykule omówiono sposób konfigurowania zdalnych wywołań procedur dla usług napisanych za pomocą języka Java.

Konfigurowanie komunikacji zdalniej w usłudze

Konfigurowanie komunikacji zdalnej dla usługi odbywa się w dwóch prostych krokach:

  1. Utwórz interfejs do zaimplementowania usługi. Ten interfejs definiuje metody, które są dostępne dla zdalnego wywołania procedury w usłudze. Metody muszą zwracać metody asynchroniczne. Interfejs musi implementować microsoft.serviceFabric.services.remoting.Service , aby zasygnalizować, że usługa ma interfejs komunikacji zdalniej.
  2. Użyj odbiornika komunikacji zdalniej w usłudze. Jest to implementacja CommunicationListener , która zapewnia możliwości komunikacji zdalniej. FabricTransportServiceRemotingListener można użyć do utworzenia odbiornika komunikacji zdalniej przy użyciu domyślnego protokołu transportu komunikacji zdalniej.

Na przykład następująca usługa bezstanowa uwidacznia pojedynczą metodę pobierania "Hello world" za pośrednictwem zdalnego wywołania 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;
    }
}

Uwaga

Argumenty i typy zwracane w interfejsie usługi mogą być dowolnymi prostymi, złożonymi lub niestandardowymi typami, ale muszą być serializowalne.

Wywoływanie metod usługi zdalnej

Wywoływanie metod w usłudze przy użyciu stosu komunikacji telefonicznej odbywa się przy użyciu lokalnego serwera proxy do usługi za pośrednictwem microsoft.serviceFabric.services.remoting.client.ServiceProxyBase klasy . Metoda ServiceProxyBase tworzy lokalny serwer proxy przy użyciu tego samego interfejsu, który implementuje usługa. Za pomocą tego serwera proxy można po prostu zdalnie wywoływać metody w interfejsie.


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

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

Platforma komunikacji zdalnie propaguje wyjątki zgłaszane do usługi do klienta. W związku z tym logika obsługi wyjątków na kliencie przy użyciu metody ServiceProxyBase może bezpośrednio obsługiwać wyjątki zgłaszane przez usługę.

Okres istnienia serwera proxy usługi

Tworzenie elementu ServiceProxy to uproszczona operacja, dzięki czemu można utworzyć dowolną liczbę operacji. Wystąpienia serwera proxy usługi można używać ponownie, o ile są potrzebne. Jeśli wywołanie procedury zdalnej zgłasza wyjątek, nadal można ponownie użyć tego samego wystąpienia serwera proxy. Każdy element ServiceProxy zawiera klienta komunikacji używanego do wysyłania komunikatów za pośrednictwem przewodu. Podczas wywoływania wywołań zdalnych wykonywane są wewnętrzne kontrole w celu określenia, czy klient komunikacji jest prawidłowy. Na podstawie wyników tych testów klient komunikacji jest odtwarzany w razie potrzeby. W związku z tym, jeśli wystąpi wyjątek, nie trzeba ponownie utworzyć ServiceProxyelementu .

Okres istnienia usługi ServiceProxyFactory

FabricServiceProxyFactory to fabryka, która tworzy serwer proxy dla różnych interfejsów komunikacji wirtualnej. Jeśli używasz interfejsu API ServiceProxyBase.create do tworzenia serwera proxy, platforma tworzy element FabricServiceProxyFactory. Warto utworzyć jedną ręcznie, gdy trzeba zastąpić właściwości ServiceRemotingClientFactory . Fabryka jest kosztowną operacją. FabricServiceProxyFactory przechowuje pamięć podręczną klientów komunikacji. Najlepszym rozwiązaniem jest buforowanie FabricServiceProxyFactory tak długo, jak to możliwe.

Obsługa wyjątków komunikacji zdalnej

Wszystkie wyjątki zdalne zgłaszane przez interfejs API usługi są wysyłane z powrotem do klienta jako RuntimeException lub FabricException.

Usługa ServiceProxy obsługuje wszystkie wyjątki trybu failover dla partycji usługi, dla których została utworzona. Spowoduje to ponowne rozwiązanie punktów końcowych w przypadku wyjątków trybu failover (wyjątków innych niż przejściowe) i ponawia próbę wywołania z poprawnym punktem końcowym. Liczba ponownych prób dla wyjątku trybu failover jest nieokreślony. W przypadku wyjąteku TransientExceptions tylko ponawia próbę wywołania.

Domyślne parametry ponawiania prób są wyzwalane przez element OperationRetrySettings. Te wartości można skonfigurować, przekazując obiekt OperationRetrySettings do konstruktora ServiceProxyFactory.

Następne kroki