領先一步
VMware 提供培訓和認證,以加速您的進步。
瞭解更多我非常興奮地宣佈 Project Reactor 的第一個里程碑版本! Project Reactor 是一個基礎框架,用於在 JVM 上構建非同步快速資料應用程式。 Reactor 1.0.0.M1 中的一些優點包括:響應式組合助手 Stream 和 Promise、TcpServer 和 TcpClient,以及 Groovy 和 Spring 支援。 受 Reactive Extenstions、RxJava、新的 JDK 8 Stream API(以及 Scala 和其他)的啟發,這些 Composables 使協調非同步任務變得非常簡單。 它們使用 Consumers 支援傳統的回撥式程式設計,而且還提供簡潔的組合 API,其中包含諸如map(Function fn)
、filter(Predicate
、batch(int size)
等方法。
Reactor 從一開始就被設計成一個高效能、高擴充套件的平臺,用於構建下一代大資料應用程式。 在將應用程式擴充套件到數百、數千甚至數百萬使用者時,非同步架構明顯優於每個請求一個執行緒的架構。 Reactor 的非同步基礎為大資料應用程式提供了堅實的基礎,這些應用程式每秒處理成千上萬甚至數百萬個事件。 它提供了將非同步任務連結在一起的簡單工具,並使執行這些任務就像呼叫單個方法一樣容易。
Streams 是一種簡單的方式,用於非同步處理資料流經應用程式。 在 Reactor 中,Stream 實際上有兩個部分:Deferred(釋出者)和實際的 Stream(消費者)。 您可以在 Stream 上分配處理程式,以使用組合方法和簡單的回撥來處理資料。
在使用 Stream 和 JDK Lambdas 進一步處理之前,轉換和過濾進入應用程式的資料,然後將其放入佇列中,看起來如下所示
// Create Environment in which Reactors operate
Environment env = new Environment();
// Create a Stream using the high-speed LMAX Disruptor RingBuffer
Deferred<Trade, Stream<Trade>> incoming = Streams.<Trade>defer()
.env(env)
.dispatcher(Environment.RING_BUFFER)
.get();
// Work with the incoming trades
Stream<Trade> trades = incoming.compose();
Stream<Order> orders = trades.map(trade -> tradeService.placeTrade(trade));
// Filter out large orders from small
Stream<Order> highPriority = orders.filter(order -> order.getSize() >= 1000);
Stream<Order> lowPriority = orders.filter(order -> order.getSize() < 1000);
// Consume the orders in different ways
highPriority.consume(order -> orderService.executeNow(order));
lowPriority.consume(order -> orderService.executeLater(order));
M1 還包括一個易於使用的 TCP 客戶端和伺服器。 在快速的 Netty 網路庫的支援下,Reactor 驅動的 syslog 伺服器可以在伺服器級硬體上每秒接收大約 100 萬條訊息。 Reactor TCP 支援包括一個簡單的 Codec 工具,該工具很容易擴充套件到核心中提供的預設編解碼器集之外,並且設計為輕量級的,使用了 Reactor 的 Buffer 類,該類提供了諸如對資料進行極其有效的檢視,以及一系列用於處理標準 Java NIO ByteBuffers 的輔助方法 - 但避免了直接處理 ByteBuffer 的痛苦。
Reactor 的 TCP 支援開箱即用,支援 JSON。 要建立一個使用 JSON 作為協議的基於 TCP 的 RPC 伺服器,就像這樣簡單
TcpServer<Pojo, Pojo> server = new TcpServerSpec<Pojo, Pojo>(NettyTcpServer.class)
.env(env)
.codec(new JsonCodec<>(Pojo.class))
.consume(conn -> {
conn.consume(data -> {
// handle incoming data
});
})
.get()
.start();
Reactor M1 還提供了強大的 Groovy 支援。 它提供了助手來使使用閉包消耗事件非常簡潔。 不用說,用 Groovy 編寫 Reactor 事件處理非常容易。 使用閉包處理 Reactors 使得非同步程式碼實際上可讀!
def env = new Environment()
// Create Reactor using default RingBuffer Dispatcher
def reactor = Reactors.reactor().env(env).get()
reactor.on('topic') { String s ->
// handle data
}
// Publish an event to a topic
r1.notify 'topic', 'Hello World!'
Reactor M1 還包括 Spring 支援,使得編寫事件驅動的 POJO 就像 MVC 控制器一樣簡單。 透過使用 @On
註釋方法,可以透過元件掃描獲取的 bean 可以自動連線到 Reactor 並被通知事件。
一個簡單的基於 JavaConfig 的 Spring 配置可能如下所示
public class HandlerBean {
@On(reactor = "@rootReactor", selector = '$("test")')
public void handleTest() {
// event 'test' was fired
}
}
@Configuration
public class AnnotatedHandlerConfig {
@Bean
public Environment env() {
return new Environment();
}
@Bean
public Reactor rootReactor() {
return env().getRootReactor();
}
}
只需將 Reactor 注入到服務層,當事件準備就緒時,使用 notify()
方法在 Reactor 上釋出它們。
Maven 工件可在 SpringSource Artifactory 儲存庫中找到。 在 Gradle 專案中,您可以這樣拉取 Reactor
ext {
reactorVersion = '1.0.0.M1'
}
repositories {
maven { url 'http://repo.springsource.org/libs-milestone' }
mavenCentral()
}
dependencies {
// Reactor Core
compile 'org.projectreactor:reactor-core:$reactorVersion'
}
原始碼可在 GitHub 上找到:https://github.com/reactor/reactor
加入 Reactor Google+ 社群 以瞭解 Reactor 的最新動態,或 在 Twitter 上關注我們 @ProjectReactor。
文件可在 GitHub Wiki 和 API Javadoc 上找到。
您還可以在 GitHub Issues 上提交問題並跟蹤開發進度。
我們將在今年的 SpringOne 上進行 關於 Reactor 的完整課程。 如果您還沒有計劃參加,那麼您真的應該參加! 議程中充滿了關於 Spring 社群正在做的令人興奮的事情的精彩課程。 快來加入我們吧!
SpringOne2GX 2013,9 月 9-12 日,加利福尼亞州聖克拉拉
我迫不及待地想投入到下一個 sprint 中,以實現 1.0 GA。 我們很樂意邀請您一起加入!