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. |