Udostępnij za pośrednictwem


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, platforma Reliable Services udostępnia mechanizm komunikacji zdalnej umożliwiający szybkie i łatwe konfigurowanie zdalnych wywołań procedur 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 zdalnie w usłudze

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

  1. Utwórz interfejs, który ma zostać zaimplementowany przez usługę. Ten interfejs definiuje metody, które są dostępne dla zdalnego wywołania procedury w usłudze. Metody muszą zwracać metody asynchroniczne. Interfejs musi zaimplementować microsoft.serviceFabric.services.remoting.Service , aby zasygnalizować, że usługa ma interfejs komunikacji zdalnie.
  2. Użyj odbiornika komunikacji zdalnie w usłudze. Jest to implementacja CommunicationListener , która zapewnia możliwości komunikacji zdalniej. FabricTransportServiceRemotingListener można użyć do utworzenia odbiornika komunikacji zdalnie 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 w usłudze do klienta. Dlatego logika obsługi wyjątków na kliencie przy użyciu programu ServiceProxyBase może bezpośrednio obsługiwać wyjątki zgłaszane przez usługę.

Okres istnienia serwera proxy usługi

Tworzenie usługi ServiceProxy to uproszczona operacja, dzięki czemu można utworzyć tyle, ile potrzebujesz. 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żda usługa ServiceProxy zawiera klienta komunikacji używanego do wysyłania komunikatów za pośrednictwem przewodu. Podczas wywoływania zdalnych wywołań są wykonywane wewnętrzne kontrole w celu określenia, czy klient komunikacji jest prawidłowy. Na podstawie wyników tych testów klient komunikacji jest ponownie utworzony w razie potrzeby. W związku z tym, jeśli wystąpi wyjątek, nie trzeba ponownie utworzyć ServiceProxyelementu .

Okres istnienia parametru 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 zdalnie

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órej została utworzona. Spowoduje to ponowne rozwiązanie punktów końcowych, jeśli istnieją wyjątki trybu failover (wyjątki inne 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 funkcji TransientExceptions wywołanie jest ponawiane tylko ponawianie próby.

Domyślne parametry ponawiania są wyzwalane przez operacjęRetrySettings. Te wartości można skonfigurować, przekazując obiekt OperationRetrySettings do konstruktora ServiceProxyFactory.

Następne kroki