Статьи

Cloud Foundry Java Client — Потоковые события

Клиент Cloud Foundry Java предоставляет привязки на основе Java для взаимодействия с работающим экземпляром Cloud Foundry . Одна из замечательных особенностей этого проекта заключается в том, что он использует API-интерфейсы на основе Reactive Stream для сигнатур методов, особенно с использованием реализации Reactor , это особенно полезно при использовании потоковых данных.

В этом посте я хочу продемонстрировать конкретный случай использования, где эта библиотека действительно сияет — в потоковых событиях из Cloud Foundry

Loggregator — это подсистема в Cloud Foundry, отвечающая за объединение всех журналов, созданных в системе, и обеспечивает способы передачи этой информации во внешние системы. Компонент «Traffic Controller» в Loggregator предоставляет конечную точку на основе Websocket для потоковой передачи этих событий, Java-клиент Cloud Foundry абстрагирует базовые детали подключения клиента websocket и предоставляет удобный способ использования этой информации.

В качестве предварительного условия вам понадобится работающий экземпляр Cloud Foundry, чтобы опробовать образец, и лучший способ заставить его работать локально — использовать PCF Dev .

Предполагая, что у вас есть работающий экземпляр, способ подключения к этому экземпляру из кода с использованием библиотеки cf-java-client заключается в следующем:

1
2
3
4
5
6
SpringCloudFoundryClient cfClient = SpringCloudFoundryClient.builder()
                .host("api.local.pcfdev.io")
                .username("admin")
                .password("admin")
                .skipSslValidation(true)
                .build();

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

1
2
3
DopplerClient dopplerClient = ReactorDopplerClient.builder()
      .cloudFoundryClient(cfClient)
      .build();

По сути, допплеровский клиент предоставляет методы для потоковой передачи базовых событий. Если вас интересует вся нефильтрованная информация (соответственно называемая пожарным рукавом), вы можете сделать это следующим образом:

1
2
3
Flux<Event> cfEvents = this.dopplerClient.firehose(
    FirehoseRequest.builder()
      .subscriptionId(UUID.randomUUID().toString()).build());

В результате получается тип Flux из библиотеки Reactor, инкапсулирующий потоковые данные, который можно наблюдать, подключив подписчика, скажем, для базового примера подписчика, просто регистрирующего события на консоли следующим образом:

1
cfEvents.subscribe(e -> LOGGER.info(e.toString()));

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

1
2
3
4
5
cfEvents
 .filter(e -> LogMessage.class.isInstance(e))
 .map(e -> (LogMessage)e)
 .map(LogMessage::getMessage)
 .subscribe(LOGGER::info);

Если вы хотите поиграть с этим примером, который в качестве дополнительного бонуса включил Spring Boot , он будет доступен в моем репозитории github .

Ссылка: Клиент Cloud Foundry Java — потоковая передача событий от нашего партнера по JCG Биджу Кунджуммена в блоге all and sundry.