Remo do serviço em Java com o Reliable Services

Para serviços que não estão associados a um protocolo ou pilha de comunicação específico, como WebAPI, Windows Communication Foundation (WCF) ou outros, a arquitetura reliable Services fornece um mecanismo de remo para configurar rápida e facilmente chamadas de procedimento remoto para serviços. Este artigo aborda como configurar chamadas de procedimento remoto para serviços escritos com Java.

Configurar a comunicação remota num serviço

A configuração da comunicação remota para um serviço é efetuada em dois passos simples:

  1. Crie uma interface para o seu serviço implementar. Esta interface define os métodos que estão disponíveis para uma chamada de procedimento remoto no seu serviço. Os métodos têm de ser métodos assíncronos que devolvem tarefas. A interface tem de implementar microsoft.serviceFabric.services.remoting.Service para sinalizar que o serviço tem uma interface remota.
  2. Utilize um serviço de escuta remoting. Esta é uma implementação CommunicationListener que fornece capacidades de remoting. FabricTransportServiceRemotingListener pode ser utilizado para criar um serviço de escuta remoting com o protocolo de transporte remoting predefinido.

Por exemplo, o seguinte serviço sem estado expõe um único método para obter "Hello World" através de uma chamada de procedimento remoto.

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

Nota

Os argumentos e os tipos de retorno na interface de serviço podem ser tipos simples, complexos ou personalizados, mas têm de ser serializáveis.

Chamar métodos de serviço remoto

Os métodos de chamada num serviço através da pilha remoting são efetuados através de um proxy local para o serviço através da microsoft.serviceFabric.services.remoting.client.ServiceProxyBase classe. O ServiceProxyBase método cria um proxy local com a mesma interface que o serviço implementa. Com esse proxy, pode simplesmente chamar métodos na interface remotamente.


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

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

A arquitetura de remoting propaga as exceções emitidas no serviço para o cliente. Assim, a lógica de processamento de exceções no cliente através da utilização ServiceProxyBase pode processar diretamente as exceções que o serviço lança.

Duração do Proxy de Serviço

A criação do ServiceProxy é uma operação simples, pelo que pode criar quantos precisar. As instâncias do Proxy de Serviço podem ser reutilizadas desde que sejam necessárias. Se uma chamada de procedimento remoto emitir uma Exceção, ainda pode reutilizar a mesma instância de proxy. Cada ServiceProxy contém um cliente de comunicação utilizado para enviar mensagens através do cabo. Ao invocar chamadas remotas, são efetuadas verificações internas para determinar se o cliente de comunicação é válido. Com base nos resultados dessas verificações, o cliente de comunicação é recriado, se necessário. Portanto, se ocorrer uma exceção, não precisa de recriar ServiceProxy.

Duração do ServiceProxyFactory

FabricServiceProxyFactory é uma fábrica que cria proxy para diferentes interfaces remoting. Se utilizar a API ServiceProxyBase.create para criar proxy, a arquitetura cria um FabricServiceProxyFactory. É útil criar um manualmente quando precisar de substituir as propriedades serviceRemotingClientFactory . A fábrica é uma operação dispendiosa. FabricServiceProxyFactory mantém a cache de clientes de comunicação. A melhor prática é colocar em cache FabricServiceProxyFactory o máximo de tempo possível.

Processamento de Exceções Remoting

Todas as exceções remotas emitidas pela API de serviço são enviadas de volta para o cliente como RuntimeException ou FabricException.

O ServiceProxy processa todas as Exceções de Ativação Pós-falha para a partição de serviço para a qual foi criado. Resolve novamente os pontos finais se existirem Exceções de Ativação Pós-falha (Exceções Não Transitórias) e repetirá a chamada com o ponto final correto. O número de tentativas de ativação pós-falha Exceção está indefinido. No caso de TransientExceptions, apenas repetirá a chamada.

Os parâmetros de repetição predefinidos são proviados por OperationRetrySettings. Pode configurar estes valores ao transmitir o objeto OperationRetrySettings para o construtor ServiceProxyFactory.

Passos seguintes