Статьи

Практические операции с Reactor — получение сведений о приложении Cloud Foundry

CF-Java-Client — это библиотека, которая обеспечивает программный доступ к API-интерфейсу Cloud Foundry Cloud Controller . Он построен на основе Project Reactor , реализации спецификации Reactive Streams, и это увлекательное упражнение, использующее эту библиотеку, чтобы сделать что-то практичное в среде Cloud Foundry.

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

Начнем с того, что основой всех операций API с cf-java-client является тип, который неудивительно называется CloudFoundryClient (org.cloudfoundry.client.CloudFoundryClient), и на странице github cf-java-client есть сведения о том, как получить экземпляр этого типа.

Учитывая экземпляр CloudFoundryClient, подробности приложения с его идентификатором можно получить следующим образом:

1
2
Mono<GetApplicationResponse> applicationResponseMono = this.cloudFoundryClient
  .applicationsV2().get(GetApplicationRequest.builder().applicationId(applicationId).build());

Обратите внимание, что API возвращает тип реактора «Mono» , это, в общем, поведение всех вызовов API cf-java-client.

  • Если API возвращает один элемент, то обычно возвращается тип Mono
  • Если ожидается, что API вернет более одного элемента, возвращается тип Flux , и
  • Если API вызывается исключительно для побочных эффектов — скажем, печать некоторой информации, то он возвращает тип Mono <Void>

Следующим шагом является получение идентификатора пространства из ответа и вызов API, чтобы получить сведения о пространстве, и выглядит так:

1
2
3
4
Mono<Tuple2<GetApplicationResponse, GetSpaceResponse>> appAndSpaceMono = applicationResponseMono
  .and(appResponse -> this.cloudFoundryClient.spaces()
    .get(GetSpaceRequest.builder()
      .spaceId(appResponse.getEntity().getSpaceId()).build()));

Здесь я использую оператор «и» для объединения ответа приложения с другим Mono, который возвращает информацию о пространстве, в результате получается тип «Tuple2», содержащий как фрагменты информации — детали приложения и детали пространства, в котором он находится в.

Наконец, чтобы получить организацию, в которой развернуто приложение:

1
2
3
4
5
6
7
8
Mono<Tuple3<GetApplicationResponse, GetSpaceResponse, GetOrganizationResponse>> t3 =
  appAndSpaceMono.then(tup2 -> this.cloudFoundryClient.organizations()
      .get(GetOrganizationRequest.builder()
        .organizationId(tup2.getT2().getEntity()
          .getOrganizationId())
        .build())
      .map(orgResp -> Tuples.of(tup2.getT1(), tup2.getT2(),
        orgResp)));

Здесь операция «then» используется для извлечения сведений об организации с учетом идентификатора из предыдущего шага и добавления результата к предыдущему кортежу для создания типа Tuple3, содержащего « Сведения о приложении», « Сведения о пространстве» и « Сведения об организации». ». « Then » является эквивалентом оператора flatMap, знакомого в мире Scala и ReactiveX.

Это, по сути, охватывает то, как вы обычно имеете дело с библиотекой «cf-java-client» и используете тот факт, что она построена на превосходной библиотеке «Reactor» и ее коллекции очень полезных операторов для получения результатов. Просто сделайте последний шаг по преобразованию результата в тип, который может быть более релевантным для вашего домена, и обработайте любые ошибки на этом пути:

1
2
3
4
5
6
7
Mono<AppDetail> appDetail = 
 t3.map(tup3 -> {
   String appName = tup3.getT1().getEntity().getName();
   String spaceName = tup3.getT2().getEntity().getName();
   String orgName = tup3.getT3().getEntity().getName();
   return new AppDetail(appName, orgName, spaceName);
  }).otherwiseReturn(new AppDetail("", "", ""));

Если вы заинтересованы в испытании рабочего примера, у меня есть пример, доступный в моем репозитории github здесь — https://github.com/bijukunjummen/boot-firehose-to-syslog

И код, показанный в статье, доступен здесь — https://github.com/bijukunjummen/boot-firehose-to-syslog/blob/master/src/main/java/io.pivotal.cf.nozzle/service/CfAppDetailsService .Ява

Ссылка: Практические операции с Reactor. Получите подробную информацию о приложении Cloud Foundry от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry.