Удаленное взаимодействие службы в Java с Reliable Services
Для служб, которые не привязаны к определенному протоколу обмена данными или стеку, например веб-API, Windows Communication Foundation (WCF) и другим, платформа Reliable Services предоставляет механизм удаленного взаимодействия для быстрой и простой настройки удаленного вызова процедур. В этой статье рассматривается, как настраивать удаленные вызовы процедур для служб на Java.
Настройка удаленного доступа в службе
Процесс настройки удаленного доступа для службы состоит из двух простых этапов.
- Создание интерфейса для реализации в службе. Этот интерфейс определяет методы, которые будут доступны для удаленного вызова процедур в службе. Эти методы должны быть асинхронными методами, возвращающими задачи. Интерфейс должен реализовать
microsoft.serviceFabric.services.remoting.Service
, чтобы показать, что служба имеет интерфейс удаленного взаимодействия. - Используйте прослушиватель удаленного взаимодействия в службе. Это реализация
CommunicationListener
, которая предоставляет возможности удаленного взаимодействия.FabricTransportServiceRemotingListener
можно использовать, чтобы создать прослушиватель удаленного взаимодействия с использованием транспортного протокола удаленного взаимодействия по умолчанию.
Например, приведенная ниже служба без отслеживания состояния предоставляет один метод для получения "Hello World" посредством удаленного вызова процедуры.
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;
}
}
Примечание.
Аргументы и возвращаемые данные в интерфейсе службы могут иметь простые, сложные или настраиваемые типы, но они должны быть сериализуемыми.
Вызов удаленных методов службы
Вызов методов в службе с помощью стека удаленного взаимодействия осуществляется с помощью локального прокси-сервера для службы через класс microsoft.serviceFabric.services.remoting.client.ServiceProxyBase
. Метод ServiceProxyBase
создает локальный прокси-сервер, используя тот же интерфейс, который реализует служба. С помощью этого прокси можно без труда удаленно вызвать методы в интерфейсе.
MyService helloWorldClient = ServiceProxyBase.create(MyService.class, new URI("fabric:/MyApplication/MyHelloWorldService"));
CompletableFuture<String> message = helloWorldClient.helloWorldAsync();
Платформа удаленного взаимодействия распространяет исключения, созданные в службе, на клиент. Поэтому логика обработки исключений на стороне клиента с использованием ServiceProxyBase
может напрямую обрабатывать порождаемые службой исключения.
Время существования ServiceProxy
Создание ServiceProxy не требует больших ресурсов, поэтому вы можете создавать такие объекты в любых количествах. Экземпляры ServiceProxy можно использовать повторно. Если удаленный вызов процедуры создает исключение, вы по-прежнему можете использовать тот же экземпляр прокси-сервера. Каждый объект ServiceProxy содержит клиент обмена данными, используемый для отправки сообщений по сети. При запуске удаленных вызовов проводятся внутренние проверки для определения работоспособности этого клиента. В зависимости от результата проверки клиент может быть создан повторно. Поэтому, если возникает исключение, вам не нужно заново создавать ServiceProxy
.
Время существования ServiceProxyFactory
FabricServiceProxyFactory — это фабрика, которая создает прокси-сервер для различных интерфейсов удаленного взаимодействия. Если вы используете API ServiceProxyBase.create
для создания прокси-сервера, то платформа создает FabricServiceProxyFactory
.
При необходимости переопределить свойства ServiceRemotingClientFactory имеет смысл создать фабрику вручную.
Создание фабрики — ресурсоемкая операция. FabricServiceProxyFactory
хранит кэш клиента обмена данными.
Рекомендуется кэшировать FabricServiceProxyFactory
на как можно больший период времени.
Обработка исключений удаленного взаимодействия
Все исключения удаленного взаимодействия, порождаемые API службы, отправляются обратно в клиент как RuntimeException или FabricException.
ServiceProxy обрабатывает все исключения отработки отказа для секции службы, для которой он создан. Он повторно разрешает конечные точки в случае исключений отработки отказа (повторяющихся исключений) и повторяет вызов к правильной конечной точке. Число повторных попыток для исключения отработки отказа не ограничено. В случае исключений TransientException только повторяется попытка вызова.
Параметры повтора по умолчанию определяются OperationRetrySettings. Вы можете настроить эти значения, передав объект OperationRetrySettings в конструктор ServiceProxyFactory.