Клиент 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. |