Comunicação remota de serviços em Java com serviços confiáveis
Para serviços que não estão vinculados a um determinado protocolo ou pilha de comunicação, como WebAPI, Windows Communication Foundation (WCF) ou outros, a estrutura de Serviços Confiáveis fornece um mecanismo de comunicação remota para configurar rápida e facilmente chamadas de procedimento remoto para serviços. Este artigo descreve como configurar chamadas de procedimento remoto para serviços escritos com Java.
Configurar a comunicação remota em um serviço
A configuração da comunicação remota para um serviço é feita em duas etapas simples:
- Crie uma interface para o seu serviço implementar. Essa interface define os métodos que estão disponíveis para uma chamada de procedimento remoto em seu serviço. Os métodos devem ser métodos assíncronos de retorno de tarefa. A interface deve ser implementada
microsoft.serviceFabric.services.remoting.Service
para sinalizar que o serviço tem uma interface remota. - Use um ouvinte remoto em seu serviço. Esta é uma
CommunicationListener
implementação que fornece recursos de comunicação remota.FabricTransportServiceRemotingListener
pode ser usado para criar um ouvinte remoto usando o protocolo de transporte remoto padrão.
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 devem ser serializáveis.
Chamar métodos de serviço remoto
Chamar métodos em um serviço usando a pilha de comunicação remota é feito usando 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 usando a mesma interface que o serviço implementa. Com esse proxy, você 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 estrutura de comunicação remota propaga exceções lançadas no serviço para o cliente. Portanto, a lógica de tratamento de exceções no cliente usando ServiceProxyBase
pode lidar diretamente com exceções que o serviço lança.
Tempo de vida do proxy de serviço
A criação do ServiceProxy é uma operação leve, para que você possa criar quantos precisar. As instâncias de Proxy de Serviço podem ser reutilizadas desde que sejam necessárias. Se uma chamada de procedimento remoto lançar uma Exceção, você ainda poderá reutilizar a mesma instância de proxy. Cada ServiceProxy contém um cliente de comunicação usado para enviar mensagens por fio. Ao invocar chamadas remotas, verificações internas são realizadas 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 será necessário recriar ServiceProxy
o .
Tempo de vida do ServiceProxyFactory
FabricServiceProxyFactory é uma fábrica que cria proxy para diferentes interfaces de comunicação remota. Se você usar a API ServiceProxyBase.create
para criar proxy, a estrutura criará um FabricServiceProxyFactory
arquivo .
É útil criar um manualmente quando você precisa substituir as propriedades ServiceRemotingClientFactory .
Fábrica é uma operação cara. FabricServiceProxyFactory
mantém cache de clientes de comunicação.
A prática recomendada é armazenar em cache FabricServiceProxyFactory
o máximo de tempo possível.
Tratamento de exceções de comunicação remota
Todas as exceções remotas lançadas pela API de serviço são enviadas de volta ao cliente como RuntimeException ou FabricException.
ServiceProxy manipula todas as Exceções de Failover para a partição de serviço para a qual foi criado. Ele resolve novamente os pontos de extremidade se houver exceções de failover (exceções não transitórias) e tenta novamente a chamada com o ponto de extremidade correto. Número de novas tentativas para failover A exceção é indefinida. No caso de TransientExceptions, ele só tenta novamente a chamada.
Os parâmetros de repetição padrão são fornecidos por OperationRetrySettings. Você pode configurar esses valores passando o objeto OperationRetrySettings para o construtor ServiceProxyFactory.