Flower既是壹個反應式編程框架,也是壹個分布式微服務框架。
Flower框架使開發人員能夠獲得壹個反應式系統,而無需關註反應式編程的細節。
快速開始
花卉框架的主要元素包括:花卉服務、花卉流程和流量容器。服務實現壹個細粒度的服務功能,服務通過消息關聯。前壹個服務的返回值(Message)必須是後壹個服務的輸入參數(Message)。服務按照業務邏輯編輯成流(流程),花容器負責將前壹個服務的返回消息傳遞給後壹個服務。
固定
專家
格拉德勒
SBT
常春藤
花朵初始化
Flower需要初始化後才能使用,這裏演示了最簡單的方法。
花朵初始化
定義花卉服務
服務類的開發必須實現Flower框架的服務接口或者繼承AbstractService基類,在流程方法內完成服務業務邏輯處理。
用戶服務a
用戶服務b
用戶服務C1
服務註冊
Flower提供了兩種服務註冊方式:配置文件方式和編程方式。
服務流程安排
Flower框架提供了兩種服務流程安排方式:配置文件方式和編程方式。
兩種安排的結果是壹樣的:
稱之為花的過程
定義了三個Flower服務,並安排了壹個名為flower_test的服務流。那麽怎麽用呢?
完整示例
在Flower中,消息是壹等公民,基於Flower的應用系統是面向消息的應用系統。消息由服務生成,是服務的返回值;同時,消息也是服務的輸入。前壹個服務的返回消息是下壹個服務的輸入消息,通過消息將解耦的服務關聯起來,形成壹個服務流程,最終構建壹個具有完整處理能力的應用系統。流程示例:
學期
花卉信息處理模式
除了將服務串聯起來形成壹個簡單的串行流程,消息還可以組合起來產生更強大的功能。
消息分叉
消息分叉是指壹個服務輸出的消息可能會被分叉分發到1或更多的其他服務。分叉後的消息有兩種處理方式,全分發和條件分發。
全部分發
將輸出消息分發給所有流程後續服務。收到消息後,後續服務並行執行它。這種模式主要用於可以並行執行的多個子任務。比如用戶註冊成功後,需要1將用戶數據寫入數據庫;2.向用戶發送激活電子郵件;3.向用戶發送通知消息;4.將新用戶註冊信息發送到相關產品進行開戶。上述四種服務可以采用消息分發模式,接受用戶註冊消息,並發完成上述四項任務。
要實現消息的完全分發,需要在流程中進行配置,所有需要接受前任服務外發消息的服務都要在流程中進行配置,比如
Service1是前身服務,service 2和service3是後繼服務。如果在實現service2和service3的類定義中的服務接口的聲明中指定了泛型,則泛型類型必須是service1或其父類的輸出類型。
服務1
服務2
服務3
條件分布
有時,根據消息內容和業務邏輯,前壹個服務生成的消息可能會交給後壹個服務處理,但不是所有的服務。比如用戶申請貸款,當前服務計算出用戶的信用等級後,需要根據信用等級來判斷采用什麽樣的貸款方式或者拒絕貸款。不同的貸款方式和拒絕貸款是不同的服務。這些服務在流程配置時需要配置為前任服務的後繼服務,但是在運行時根據條件決定將消息分發給特定的後繼服務。
條件分發和流程配置中的所有分發壹樣,所有可能的後續服務都要在流程中配置。實現條件分發有三種方式。
根據仿制藥進行分配
當後續服務實現接口時,它聲明不同的泛型類型。前任服務根據業務邏輯構造不同的消息類型。花會根據消息類型匹配相應的服務,只有匹配成功的消息才會發送過去。例如:
施工過程
聲明ServiceB接受的消息類型是MessageB。
服務a
ServiceB是ServiceA的後續服務。如果ServiceA接收到的消息是字符串“b”,則返回消息類型b,此時框架會將消息發送給ServiceB,而不是ServiceC。
在要分發的消息中指定後續服務的id。
preamble消息實現條件接口,並指定後續服務的id,例如:
壹般來說,服務是可重用的,可以在不同的流程中重用,但是後續的服務在不同的流程中可能是不同的,後續服務的id也是不同的。在服務中寫入後續服務的id顯然不利於服務重用。有兩種解決方案。壹種是在不同的流程中編寫壹個專門用於分發的服務,即處理業務邏輯的服務不關心消息的分發,只返回消息內容,但它的後繼服務是專門用於消息分發的服務。這個服務沒有業務邏輯,只實現條件接口,根據消息內容指定後繼服務。
另壹種是使用框架內置的服務ConditionService進行消息分發。
使用框架內置服務條件服務進行消息分發。
ConditionService是壹個通用的消息分發服務。
服務serviceE根據條件將消息分發給serviceF或serviceG。流程配置如上,中間增加了serviceCondition進行適配。serviceCondition的服務註冊方法是
Com.ly.train.flower.com mon . service . condition service是框架的內置服務。
這樣,仍然需要在serviceCondition的前置服務Serviceee中設置返回消息的條件,但不需要設置後續服務的id,只需要設置後續服務的序列號即可。
有關條件分布的幾個代碼示例,請參見/flower . sample/src/main/Java/com/ly/train/flower/common/sample/condition/sample . Java。
消息聚合
對於所有分布式消息分支,共同的目的是使多個服務能夠並行執行並加快處理速度。通常需要獲得這些並行處理服務的所有結果,以便進行後續處理。在Flower中,獲得多個並行處理服務的結果消息,稱為消息聚合。實現方法如下:在流程中,將待聚合的多個消息的後續服務配置為com.ly.train.flower.com mon . service . aggregate service,它是框架內置的服務,負責聚合多個並行服務生成的消息,封裝成集合對象返回。如流程
這裏,service5是壹個消息聚合服務,負責聚合並行service2和service3生成的消息,並將聚合後的Set消息發送給service4。服務配置如下,service5配置為框架內置服務AggregateService。
Service4負責接收和處理聚合的消息,從集合中取出消息並分別處理。
消息回復
花中的所有消息都是異步處理的,即服務之間不會互相阻塞和等待,從而實現低耦合、無阻塞、高並發的響應式系統。Flower進程的調用者發送請求消息後,該消息在進程中被處理,調用者可以繼續執行其他計算任務,而不會阻塞等待結果。
與傳統的命令式編程不同,通常流程的發起者並不是流程處理結果的最終接收者。例如,對於web開發,流程的發起者通常是servlet,但客戶端瀏覽器或App真正接受處理結果。流程中的服務可以將處理結果直接發送給客戶機,而不必通過servlet。也就是說,調用發起方servlet不需要等待流程服務的最終處理結果,向流程發送用戶請求後,不需要阻塞等待的處理,可以立即獲取另壹個用戶的請求繼續處理。
但是Flower也支持調用者阻塞等待消息處理的結果,消息回復模式使得流程調用者能夠得到流程處理的最終結果消息。參考代碼example/flower . sample/src/main/Java/com/ly/train/flower/common/sample/textflow/sample . Java。
花網發展模式
花卉集成服務3的Web開發模式
Flower支持Servlet3的異步模式,請求處理線程調用Flower進程並傳入AsyncContext對象後立即釋放。代碼示例參考/flower . sample/src/main/Java/com/ly/train/flower/common/sample/web/async/async servlet . Java。
開發支持Servlet3的Flower服務,需要實現框架的服務接口,在方法對象進程(t message,service context context)中拋出異常;Flower框架會傳入壹個Web對象,通過context.getWeb()獲取Web對象,獲取請求參數,輸出處理響應結果。
集成Spring boot的Flower開發模式
Flower支持Spring boot的開發,在項目中依托flower.web,在框架中實現了Service接口和InitController接口。初始化@BindController對需要的參數進行註釋,編譯時會由flower.web枚舉@BindController自動註釋,生成Spring boot需要的控制器。
註意:flower.web使用annotation生成spring boot所需的控制器類進行服務。這個生成過程在程序編譯時完成。如果IDE環境不支持熱編譯,您需要執行mvn install來在命令行上生成代碼。
有關代碼示例,請參考/flower . sample/src/main/Java/com/ly/train/flower/common/sample/spring boot。
使用花架的發展建議
花卉分布式部署架構
顯色法
1.啟動Flower.center註冊中心。
2.開發花卉服務,啟動業務服務花卉容器,並自動向註冊中心註冊服務。
3.開發Flowerweb Gateway,啟動Flower web Gateway服務,安排流程。
壹.登記中心
Flower.center是基於spring-boot開發的,打包成fat-jar後可以命令行啟動。
Flower註冊表啟動入口/flower . center/src/main/Java/com/ly/train/flower/center/center application . Java flower註冊表啟動命令Java-jar flower . center-0.1.2 . jar
2.啟動商務花卉容器
Flower部署支持Flower容器和Spring容器,下面的示例基於spring-boot演示。
2.1創建配置文件flower.yml
2.2配置FlowerFactory
2.3花卉服務的發展
2.4創建壹個啟動類
3.啟動網關服務器並安排流程。
3.1創建flower.yml
3.2配置FlowerFactory
3.3發展花卉服務
3.4開發網關控制器
3.5啟動類
項目詳情示例
Flower分布式實例/leeyazou/flower . showcase . git
核心概念
花卉工廠
使用默認的FlowerFactory。
按需創建自己的花廠。配置文件的默認路徑是classpath:flower.yml,配置文件的內容格式是yaml style。有關詳細信息,請參見配置信息。
獲得FlowerFactory後,您可以使用它提供的接口:
FlowRouter流程路由器,流程創建後可以通過FlowerFactory創建相應的路由器,然後就可以調用服務了。
分布的
Flower.yml配置信息
了解Flower的內部設計將有助於您更好地使用Flower來開發反應系統。
Flower核心模塊(進程內流微服務框架)的設計
花是基於Akka的Actor開發的,服務封裝在Actor中。參與者收到的消息作為調用的參數傳入服務,服務的輸出作為服務的輸入發送給後續的參與者。
花核心類
Flower初始化和調用計時
服務流程初始化
消息流處理
花的核心設計就是這麽多。但是由此延伸出來的應用方法和設計模式與Akka有很大的不同。
分布式流媒體微服務框架設計
傳統的分布式微服務框架通過遠程調用實現了服務的解耦和分布式部署,使得系統開發、維護、服務重用和集群部署更加方便靈活,但這種微服務仍然存在很多不足。
Flower是壹個流微服務框架,致力於構建新的微服務架構。利用流計算的架構思想,開發並實現了壹個輕量級、易於設計和開發、消息驅動、弱依賴和異步並發的微服務系統。
結構
部署模型
Flower統壹管理和控制整個應用系統集群,控制中心控制和管理集群的所有資源。
代理部署在集群中的每臺服務器上,負責加載服務實例並向控制中心報告狀態。
代碼倉庫負責管理服務的java包,包用assembly封裝。
控制中心和代理基於Akka開發,每個服務封裝在壹個actor中,actor負責消息的通信。
集群啟動和服務部署的時序模型
註冊服務數據結構
服務之間的依賴關系安排在控制中心。