Создание первого приложения Java Service Fabric Reliable Actors в Linux

Это краткое руководство поможет вам создать первое приложение Java Azure Service Fabric в среде разработки Linux всего за несколько минут. По завершении вы получите простое однослужбное приложение Java, работающее в локальном кластере разработки.

Необходимые условия

Прежде чем приступить к работе, установите пакет SDK Service Fabric, ИНТЕРФЕЙС командной строки Service Fabric, Yeoman, настройте среду разработки Java и настройте кластер разработки в среде разработки Linux. Если вы используете Mac OS X, вы можете настроить среду разработки на Mac с помощью Docker.

Также установите интерфейс командной строки Service Fabric.

Установка и настройка генераторов для Java

Service Fabric предоставляет средства формирования шаблонов, которые помогут вам создать приложение Java Service Fabric из терминала с помощью генератора шаблонов Yeoman. Если Yeoman еще не установлен, ознакомьтесь с инструкциями по настройке Yeoman в Service Fabric для начала работы с Linux . Выполните следующую команду, чтобы установить генератор шаблонов Service Fabric Yeoman для Java.

npm install -g generator-azuresfjava

Основные понятия

Чтобы приступить к работе с надежными субъектами, необходимо только понять несколько основных понятий:

  • Служба акторов. Надежные субъекты упаковываются в надежные службы, которые можно развернуть в инфраструктуре Service Fabric. Экземпляры актора активируются в именованной службе.

  • Регистрация актера. Как и в случае с надежными службами, служба Reliable Actor должна быть зарегистрирована в среде выполнения Service Fabric. Кроме того, тип субъекта необходимо зарегистрировать в среде выполнения субъекта.

  • Интерфейс актора. Интерфейс субъекта используется для определения строго типизированного общедоступного интерфейса субъекта. В терминологии модели надежных субъектов интерфейс субъекта определяет типы сообщений, которые субъект может понять и обработать. Интерфейс субъекта используется другими субъектами и клиентскими приложениями для отправки (асинхронно) сообщений субъекту. Надежные субъекты могут реализовать несколько интерфейсов.

  • Класс ActorProxy. Класс ActorProxy используется клиентскими приложениями для вызова методов, предоставляемых через интерфейс субъекта. Класс ActorProxy предоставляет две важные функциональные возможности:

    • Разрешение имен: он может найти актера в кластере (определить узел кластера, где он размещен).
    • Обработка сбоев. Он может повторять вызовы метода и повторно разрешать расположение субъекта после сбоя, требующего перемещения субъекта на другой узел в кластере.

Следующие правила, относящиеся к интерфейсам субъектов, стоит упомянуть:

  • Методы интерфейса актора не разрешается перегружать.
  • Методы интерфейса актора не должны иметь параметры с ключевым словом out, ref или необязательные параметры.
  • Универсальные интерфейсы не поддерживаются.

Создание приложения

Приложение Service Fabric содержит одну или несколько служб, каждая из которых имеет определенную роль в предоставлении функциональных возможностей приложения. Генератор, который вы установили в последнем разделе, упрощает создание вашей первой службы и ее добавление в дальнейшем. Вы также можете создавать, создавать и развертывать приложения Java Service Fabric с помощью подключаемого модуля для Eclipse. См. статью "Создание и развертывание первого приложения Java с помощью Eclipse". Для этого краткого запуска используйте Yeoman для создания приложения с одной службой, которая хранит и получает значение счетчика.

  1. В терминале введите yo azuresfjava.
  2. Присвойте приложению имя.
  3. Выберите тип первой службы и назовите ее. В этом руководстве выберите Надежную службу акторов. Дополнительные сведения о других типах служб см. в обзоре модели программирования Service Fabric. Генератор Yeoman Service Fabric для Java

Если вы назовете приложение "HelloWorldActorApplication" и актор "HelloWorldActor", создается следующая структура приложения:

HelloWorldActorApplication/
├── build.gradle
├── HelloWorldActor
│   ├── build.gradle
│   ├── settings.gradle
│   └── src
│       └── reliableactor
│           ├── HelloWorldActorHost.java
│           └── HelloWorldActorImpl.java
├── HelloWorldActorApplication
│   ├── ApplicationManifest.xml
│   └── HelloWorldActorPkg
│       ├── Code
│       │   ├── entryPoint.sh
│       │   └── _readme.txt
│       ├── Config
│       │   ├── _readme.txt
│       │   └── Settings.xml
│       ├── Data
│       │   └── _readme.txt
│       └── ServiceManifest.xml
├── HelloWorldActorInterface
│   ├── build.gradle
│   └── src
│       └── reliableactor
│           └── HelloWorldActor.java
├── HelloWorldActorTestClient
│   ├── build.gradle
│   ├── settings.gradle
│   ├── src
│   │   └── reliableactor
│   │       └── test
│   │           └── HelloWorldActorTestClient.java
│   └── testclient.sh
├── install.sh
├── settings.gradle
└── uninstall.sh

Базовые основополагающие блоки надежных актеров

Основные понятия, описанные ранее, преобразуются в основные строительные блоки службы Надёжного Актора.

Интерфейс актора

Это содержит определение интерфейса для субъекта. Этот интерфейс определяет контракт субъекта, совместно используемый реализацией субъекта и клиентами, вызывающими субъект, поэтому обычно имеет смысл определить его в месте, которое отделяется от реализации субъекта и может использоваться несколькими другими службами или клиентскими приложениями.

HelloWorldActorInterface/src/reliableactor/HelloWorldActor.java:

public interface HelloWorldActor extends Actor {
    @Readonly   
    CompletableFuture<Integer> getCountAsync();

    CompletableFuture<?> setCountAsync(int count);
}

Служба акторов

Это содержит реализацию актера и код регистрации актера. Класс актора реализует интерфейс актора. Вот где ваш актер выполняет свою работу.

HelloWorldActor/src/reliableactor/HelloWorldActorImpl:

@ActorServiceAttribute(name = "HelloWorldActorService")
@StatePersistenceAttribute(statePersistence = StatePersistence.Persisted)
public class HelloWorldActorImpl extends FabricActor implements HelloWorldActor {
    private Logger logger = Logger.getLogger(this.getClass().getName());

    public HelloWorldActorImpl(FabricActorService actorService, ActorId actorId){
        super(actorService, actorId);
    }

    @Override
    protected CompletableFuture<?> onActivateAsync() {
        logger.log(Level.INFO, "onActivateAsync");

        return this.stateManager().tryAddStateAsync("count", 0);
    }

    @Override
    public CompletableFuture<Integer> getCountAsync() {
        logger.log(Level.INFO, "Getting current count value");
        return this.stateManager().getStateAsync("count");
    }

    @Override
    public CompletableFuture<?> setCountAsync(int count) {
        logger.log(Level.INFO, "Setting current count value {0}", count);
        return this.stateManager().addOrUpdateStateAsync("count", count, (key, value) -> count > value ? count : value);
    }
}

Регистрация актера

Служба актора должна быть зарегистрирована с типом службы в рабочей среде Service Fabric. Чтобы служба актеров выполняла экземпляры актера, тип актера также должен быть зарегистрирован в службе актеров. Метод ActorRuntime регистрации осуществляет данную функцию для актеров.

HelloWorldActor/src/reliableactor/HelloWorldActorHost:

public class HelloWorldActorHost {

private static final Logger logger = Logger.getLogger(HelloWorldActorHost.class.getName());

public static void main(String[] args) throws Exception {

        try {

            ActorRuntime.registerActorAsync(HelloWorldActorImpl.class, (context, actorType) -> new FabricActorService(context, actorType, (a,b)-> new HelloWorldActorImpl(a,b)), Duration.ofSeconds(10));
            Thread.sleep(Long.MAX_VALUE);
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Exception occurred", e);
            throw e;
        }
    }
}

Создайте приложение

Шаблоны Yeoman Service Fabric включают скрипт сборки для Gradle, который можно использовать для создания приложения из терминала. Зависимости Java Service Fabric извлекаются из Maven. Чтобы создать и работать с приложениями Java Service Fabric, необходимо убедиться, что установлен JDK и Gradle. Если они не установлены, ознакомьтесь с руководством начало работы с Service Fabric на Linux для инструкций по установке JDK и Gradle.

Чтобы создать и упаковать приложение, выполните следующее:

cd HelloWorldActorApplication
gradle

Развертывание приложения

После создания приложения его можно развернуть в локальном кластере.

  1. Подключитесь к локальному кластеру Service Fabric (кластер должен быть настроен и запущен).

    sfctl cluster select --endpoint http://localhost:19080
    
  2. Запустите скрипт установки, предоставленный в шаблоне, чтобы скопировать пакет приложения в хранилище образов кластера, зарегистрировать тип приложения и создать экземпляр приложения.

    ./install.sh
    

Развертывание встроенного приложения совпадает с любым другим приложением Service Fabric. Подробные инструкции см. в документации по управлению приложением Service Fabric с помощью интерфейса командной строки Service Fabric .

Параметры этих команд можно найти в созданных манифестах в пакете приложения.

После развертывания приложения откройте браузер и перейдите в Service Fabric Explorer по адресу http://localhost:19080/Explorer. Затем разверните узел "Приложения" и обратите внимание, что теперь есть запись для типа приложения и другого для первого экземпляра этого типа.

Это важно

Чтобы развернуть приложение в защищенном кластере Linux в Azure, необходимо настроить сертификат для проверки приложения с помощью среды выполнения Service Fabric. Это позволяет службам Reliable Actors взаимодействовать с базовыми API среды выполнения Service Fabric. Дополнительные сведения см. в статье "Настройка приложения Reliable Services для запуска в кластерах Linux".

Запустите тестовый клиент и выполните отработку отказа

Актеры ничего не делают самостоятельно. Для отправки сообщений им требуется другая служба или клиент. Шаблон актора включает простой тестовый скрипт, который можно использовать для взаимодействия со службой акторов.

Замечание

Тестовый клиент использует класс ActorProxy для взаимодействия с акторами, которые должны выполняться в том же кластере, что и акторная служба, или совместно использовать одно и то же пространство IP-адресов. Тестовый клиент можно запустить на том же компьютере, что и локальный кластер разработки. Однако для взаимодействия с субъектами в удаленном кластере необходимо развернуть шлюз в кластере, который обрабатывает внешнюю связь с субъектами.

  1. Запустите скрипт с помощью утилиты watch, чтобы просмотреть результат работы актор-сервиса. Скрипт теста вызывает метод setCountAsync() на актере для увеличения счетчика, затем вызывает метод getCountAsync() на актере для получения нового значения счетчика, и выводит это значение в консоль.

    Для macOS X необходимо скопировать папку HelloWorldTestClient в расположение в контейнере, выполнив следующие дополнительные команды.

     docker cp HelloWorldTestClient [first-four-digits-of-container-ID]:/home
     docker exec -it [first-four-digits-of-container-ID] /bin/bash
     cd /home
    
    cd HelloWorldActorTestClient
    watch -n 1 ./testclient.sh
    
  2. В Service Fabric Explorer найдите узел, на котором размещена первичная реплика для актерной службы. На снимке экрана ниже это узел 3. Основная реплика сервиса обрабатывает операции чтения и записи. Изменения состояния сервиса затем реплицируются на вторичные реплики, работающие на узлах 0 и 1, как показано на нижеприведенном снимке экрана.

    Поиск основной реплики в Service Fabric Explorer

  3. В узлах выберите узел, найденный на предыдущем шаге, а затем в меню "Действия " выберите деактивировать (перезапустить ). Это действие перезапускает узел, на котором выполняется первичная реплика службы, и принудительно инициирует переключение на резервную реплику на одну из вторичных реплик, работающих на другом узле. Эта вторичная реплика повышена до первичной, на другом узле создается другая вторичная реплика, а первичная реплика начинает выполнять операции чтения и записи. По мере перезапуска узла следите за выходными данными от тестового клиента и обратите внимание, что счетчик продолжает увеличиваться, несмотря на резервирование.

Удаление приложения

Используйте скрипт удаления, предоставленный в шаблоне, чтобы удалить экземпляр приложения, отменить регистрацию пакета приложения и удалить пакет приложения из хранилища образов кластера.

./uninstall.sh

В обозревателе Service Fabric вы видите, что тип приложения и приложения больше не отображается в узле "Приложения ".

Библиотеки Java Service Fabric в Maven

Библиотеки Java Service Fabric размещены в Maven. Вы можете добавить зависимости в pom.xml или build.gradle вашего проекта, чтобы использовать библиотеки Java Service Fabric из mavenCentral.

Actors

Поддержка надежных субъектов Service Fabric для приложения.

<dependency>
    <groupId>com.microsoft.servicefabric</groupId>
    <artifactId>sf-actors</artifactId>
    <version>1.0.0</version>
</dependency>
repositories {
    mavenCentral()
}
dependencies {
    compile 'com.microsoft.servicefabric:sf-actors:1.0.0'
}

Services

Поддержка Надежных служб Service Fabric для приложения.

<dependency>
    <groupId>com.microsoft.servicefabric</groupId>
    <artifactId>sf-services</artifactId>
    <version>1.0.0</version>
</dependency>
repositories {
    mavenCentral()
}
dependencies {
    compile 'com.microsoft.servicefabric:sf-services:1.0.0'
}

Прочее

Транспорт

Поддержка уровня транспорта для приложения Java Service Fabric. Не нужно явно добавлять эту зависимость в приложения Надежного Актора или службы, если вы не программируете на уровне транспорта.

<dependency>
    <groupId>com.microsoft.servicefabric</groupId>
    <artifactId>sf-transport</artifactId>
    <version>1.0.0</version>
</dependency>
repositories {
    mavenCentral()
}
dependencies {
    compile 'com.microsoft.servicefabric:sf-transport:1.0.0'
}

Поддержка Fabric

Поддержка системного уровня для Service Fabric, которая взаимодействует с родной средой выполнения Service Fabric. Вам не нужно явно добавлять эту зависимость в приложения Reliable Actor или Service. Эта зависимость автоматически загружается из Maven при включении других зависимостей, приведенных выше.

<dependency>
    <groupId>com.microsoft.servicefabric</groupId>
    <artifactId>sf</artifactId>
    <version>1.0.0</version>
</dependency>
repositories {
    mavenCentral()
}
dependencies {
    compile 'com.microsoft.servicefabric:sf:1.0.0'
}

Дальнейшие действия