Spring Cloud Data Flow:來自被重構的SpringXD
Pivotal在上周(譯者注:這篇新聞發表于2015年9月25日)的SpringOne2GX會議上宣布了對其大數據產品Spring XD進行了完全的重構,并且給予它一個新的品牌名稱Spring Cloud Data Flow. 這個新產品將可執行的應用作為其模塊基礎,并且聚焦在這些應用的編排上。雖然新產品從Spring XD那里保留了高層的REST API、shell和UI,從而保證了后向兼容,但新舊產品的底層卻大不相同。
Spring XD中基于Zookeeper的運行環境不見了,取而代之的是服務提供總線(SPI :service provider interface),SPI在其它系統中也有應用,如Pivotal Cloud Foundry、Lattice和Yarn,主要用做微服務應用的加載、擴展和監控。迄今為止SPI的應用案例包括,Lattice系統中使用receptor API來加載模塊,以及Cloud Foundry中 cloud controller API的使用。當然,它也有運行在進程中的本地實現,這和老的XD產品中的單節點運行比較類似。
“在這個變化的過程中一個基本理念是我們保留了許多高層的API”, Pollack在會議中講到,“但是在這個下面我們進行了巨大的重構以克服那些我們已經發現的根本性的限制。”
這些限制包括了擴展能力、金絲雀部署(Canary Deployments,通過路由策略選擇性地對部分用戶發布新功能)、資源分配(比如不同的模塊分配不同的內存)、分布式追蹤(distributed tracing)等等,這些都是目前產品的架構所無法滿足的。另一些限制則是和經典父子類加載器體系(parent-child classloader hierarchy)的使用相關,與之相反,如果你使用的是隔離的微服務應用架構,就可以使用扁平的加載器(flat classloader)。
為了解決這個類加載器的問題,現存的集成模塊和批處理模塊已經被重構,成為使用隔離扁平加載器(isolated flat classloaders)的可引導的Spring應用(Spring Boot apps)。 實際上,這個設計使得流處理和批處理應用以微服務的方式運行,而這些微服務可以獨立的演進。即使沒有Spring Cloud Data Flow,這些微服務模塊也可以獨立運行,因為本質上它們就是Java的Jar包,但data flow可以幫你解決很多乏味冗長的工作,比如屬性配置等。還有一些其它的好處,比如相比之前基于Zookeeper的XD容器架構,現在可以以更直接的 方式來編寫這些獨立模塊的單元測試程序。上面這些優點可能會開啟新的市場機會,并觸發更多的社區貢獻。
在可引導的模塊下面是兩個新的項目:Spring Cloud Stream和Spring Cloud Task,創建這兩個項目的目的是為Spring Integration和Spring Batch分別提供自動配置的能力。
為了能對這個編程模型有些理解,可以參考下面這段代碼,它來自Mark Fisher和Dave Syer的第二次演講,實現的是流入信道適配器,代碼使用了標準的Spring Integration注解(annotation),缺省情況下Spring Integration每秒鐘會去調用它:
<pre>@EnableBinding(Source.class) public class Greeter { @InboundChannelAdapter(Source.OUTPUT) public String greet() { return "hello world"; } }</pre> <p>@EnableBindings(Source.class)這個注解將會檢測你在類路徑(classpath)上實現了什么樣的綁定器 (binder),然后會用這個綁定器來創建信道適配器。它有一個接口類型的參數,Source、Sink和Processor是已經定義好的,你也可以 定義其它的。這個示例中,Source自身僅僅是一個消息信道接口: </p>public interface Source { @Output("output") MessageChannel output(); }<p>@Output注解用來標識輸出信道(離開這個模塊的消息),而@Input則用來標識輸入信道(進入這個模塊的消息)。信道可以被一個可選的名稱來參數化- 如果沒有這個信道名,那么就會用它的方法名來代替。 </p>
與Source對應的Sink是獨立的進程,我們本可以跑更多的這樣的進程,比如10。Sink會監聽與另一個中間件間的集成信道,并且當有消息時被激活:
<pre>@EnableBinding(Sink.class) public class Logger { @ServiceActivator(inputChannel=Sink.INPUT) public void log(String message) { System.out.println(message); }}</pre>
從示例來看,Spring Cloud Data Flow象粘合劑一樣,致力于將這些應用部分串到一起。目前,它的一個里程碑版本已經可以使用。
查看英文原文:SpringXD being Re-architected and Re-branded to Spring Cloud Data Flow
來自:http://www.infoq.com/cn/news/2015/10/spring-cloud-data-flow