Cloud Foundry Java客户端提供了基于Java的绑定,用于与正在运行的Cloud Foundry实例进行交互。 这个项目的优点之一是它采用了基于Reactive Stream的API作为方法签名,特别是使用Reactor实现,这在使用流数据时特别有用。
在这篇文章中,我想展示一个真正使该库发挥作用的特定用例-在Cloud Foundry的流事件中
Loggregator是Cloud Foundry中的子系统,负责汇总系统内产生的所有日志,并提供了将该信息流式传输到外部系统的方式。 Loggregator中的“流量控制器”组件公开了基于Websocket的端点,这些端点流出了这些事件,Cloud Foundry Java客户端抽象了基础的websocket客户端连接详细信息,并提供了一种使用此信息的简洁方法。
作为前提条件,您将需要一个运行中的Cloud Foundry实例来试用该示例,并使它在本地运行的最佳方法是使用PCF Dev 。
假设您有一个正在运行的实例,使用cf-java-client库从代码连接到该实例的方式如下:
SpringCloudFoundryClient cfClient = SpringCloudFoundryClient.builder()
.host("api.local.pcfdev.io")
.username("admin")
.password("admin")
.skipSslValidation(true)
.build();
使用此方法,可以通过以下方式创建流量控制器的客户端:
DopplerClient dopplerClient = ReactorDopplerClient.builder()
.cloudFoundryClient(cfClient)
.build();
基本上就是这样,多普勒客户端提供了流式处理基础事件的方法,如果您对所有未过滤的信息(适当地称为firehose)感兴趣,则可以通过以下方式进行:
Flux<Event> cfEvents = this.dopplerClient.firehose(
FirehoseRequest.builder()
.subscriptionId(UUID.randomUUID().toString()).build());
结果是Reactor库中的Flux类型封装了流数据,可以通过附加订户来观察流数据,例如,对于订户的基本示例,只需将事件以以下方式记录到控制台即可:
cfEvents.subscribe(e -> LOGGER.info(e.toString()));
但是, Flux的真正功能在于它提供的非常强大的流利方法,因此,例如,如果我对仅应用程序级日志的子集感兴趣,那么我实质上想过滤数据,从中提取日志并通过以下方式打印日志:
cfEvents
.filter(e -> LogMessage.class.isInstance(e))
.map(e -> (LogMessage)e)
.map(LogMessage::getMessage)
.subscribe(LOGGER::info);
如果您想使用此示例(作为附加奖励已启用了Spring Boot) ,请在github存储库中使用它 。
翻译自: https://www.javacodegeeks.com/2016/05/cloud-foundry-java-client-streaming-events.html