Titan 框架開發快速入門數據庫
Titan Framework是經過Actor模型使用響應式消息傳輸模式,提供具備高性能、高響應、高可伸縮和高韌性的併發應用框架。併發
GNU/Linux是產品開發和運行的平臺。 Titan已在有2000個節點的GNU/Linux主機組成的集羣系統上獲得驗證。app
Win32平臺是做爲開發平臺支持的。框架
Linux和Windows所需軟件包括:異步
JavaTM1.8.x,必須安裝,建議選擇Sun公司發行的Java版本。maven
數據庫(基於業務系統開發須要)ide
Ø MySQL 5.x以上高併發
Ø Redis 3.x 以上性能
Ø MongDB 3.x以上測試
Ø HBase 2.7.x以上
CQRS自己是一個很是簡單的模式。它只規定了處理命令的應用程序的組件應該與處理查詢 的組件分離。雖然這種分離自己很是簡單,但它與其餘模式結合時提供了許多很是強大的功能。Titan Framework 提供的構建塊更容易實現不一樣的模式與CQRS的結合。
上圖左側顯示的是UI組件, 經過 兩種方式與應用程序的其他部分進行交互:它嚮應用程序發送命令 (顯示在頂端的部分), 並從應用程序中查詢信息 (顯示在底端的部分)。
Command(命令)一般用簡單的對象表示,這些對象包含命令處理器執行所需的全部數據。一個命令經過它的名字來表達它的意圖。在Java術語中,這意味着使用類名來肯定須要作什 麼,命令的字段提供了執行該操做所需的信息。
Command Bus接受命令並路由它們到命令處理器(Command handler) 。每一個命令處理器響應特定類型的命令,並根據命令的內容執行邏輯。 然而,在某些狀況下,你也但願不顧實際的命令類型去執行邏輯,如驗證、日誌或權限。
Command handler(命令處理器)從倉儲中恢復領域對象(聚合)並執行方法來改變它們的狀態。這些聚合一般包含真實的業務邏輯並負責維護自身的不變性。聚合的狀態變化致使了領域事件的產生,領域事件和聚合都從領域模型中來。
Repositories(倉儲)負責提供訪問聚合。一般狀況下,這些倉儲的優化設計是僅經過其惟一標識符來查找聚合。一些倉儲將存儲聚合自身的狀態(例如,使用對象關係映射,ORM), 而另外一些則存儲聚合的狀態的更改到Event Store中,倉儲還負責對其備份數據庫中的聚合進行更改。
API定義
Titan Framework 針對RESTful f風格基於Spring MVC 進行結構封裝,將請求轉化爲對應系統的Command(CreateCommand、PutCommand、DeleteCommand、PatchCommand、GetCommand),所以針對API的定義 只須要面向接收到的請求進行對象的轉換,並返回相應的Command 。
@RestController @RequestMapping("/demo") publicclass TplAppController extends FunctionalController { /** 自定義方法 **/ @RequestMapping(value = "/tpl/type", method = RequestMethod.POST) public String doType(@RequestParam("typecode") String typeCode) { System.out.println("Tpl App run function DOTYPE :" + typeCode); Result result = runEnvironment.run(new TplAppTypCommand<TplAppType>(newTplAppType())); return"ok" + result.toString(); } /** 系統默認 GET方法**/ protected Command<?> getGetCommand(String serviceName, String id) { TplAppEntity appEntity = new TplAppEntity(id); returnnew Get<TplAppEntity>(appEntity); } /** 系統默認 PUT方法 **/ @Override protected Command<?> getPutCommand(String serviceName, String id, String body) { TplAppEntity tplAppEntity = JsonParserFactory.getParser().getObject(body, TplAppEntity.class); returnnew Update<TplAppEntity>(tplAppEntity); } /** 系統默認POST方法**/ @Override protected Command<?> getCreateCommand(String serviceName, String body) { TplAppEntity tplAppEntity = JsonParserFactory.getParser().getObject(body, TplAppEntity.class); returnnew Create<TplAppEntity>(tplAppEntity); } /** 系統默認POST方法**/ @Override protected <T> Command<?> getCreateCommand(String serviceName, T body) { returnnull; } /** 系統默認PATCH方法**/ @Override protected Command<?> getPatchCommand(String serviceName, String id, String body) { returnnull; } /**系統默認DELETE方法**/ @Override protected Command<?> getDeleteCommand(String serviceName, String id) { returnnull; } /**系統默認GET方法**/ @Override protected Command<?> getQueryCommand(String serviceName, Object queryObject) { returnnull; } } |
注:
1.系統默認接收Json body ,基於JsonToEntity模式進行對象轉換,調用方法以下:
JsonParserFactory.getParser().getObject(body, TplAppEntity.class);
Command Handler定義
CommandHandler 是用來響應來至API(Controller的部分的請求),基於類上的註解在啓動時自動完成handler與Command的註冊過程。
@CmdHandler publicclass TPlAppTypeHandler implementsCommandHandler<Create<TplAppType>> { @Inject TplAppRepository tplAppRepository; @Override public Result handle(TplAppTypCommand<TplAppType> cmd) { TplAppDomain tplAppDomain = this.tplAppRepository.loadTo(); tplAppDomain.doTestApp(); returnnew Result(200, true); } } |
Repository定義
publicinterfaceTplAppRepository { TplAppDomain saveTo(TplAppDomain o); TplAppDomain loadTo(); } @Component publicclass JpaTplAppRepository extendsDomainRepository<TplEntity>implements TplAppRepository { @Override public TplAppDomain saveTo(TplAppDomain o) { returnthis.saveTo(o); } @Override public TplAppDomain loadTo() { this.load("testid"); } @Override protected String getTName() { return TplEntity.class.getSimpleName(); } } |
Deploy定義
Titan Framework 基於Maven進行項目管理,業務功能開發完成後,只須要單獨定義Deploy並基於maven將業務功成引入,並在additionalLauncher中初始化業務代碼,MVN編譯後便可發佈進行測試。
publicclass KitaTplApplication extends LaunchFrontApplication { publicstaticvoid main(String[] args) { KitaTplApplication app = new KitaTplApplication (); app.getDefLauncher().exec(args); additionalLauncher.exec(args); } static LaunchPlugin additionalLauncher = (args) -> { //DeployConfig.inited(TplConfig.props, args); }; } |
注: 1)多節點啓動,服務間會自動創建集羣關係,節點間基於Event事件進行相互的訪問;
2)更多關於節點的配置參考詳細功能說明;
3)事件定義參考以下Event定義;
Event 定義
異步事件處理能夠在應用處理的任何部分產生,能夠是本地的事件處理或者是其餘服務節點提供的事件處理(在集羣中自動完成負載、路由)。能夠是由結果的調用(有效時間內),也能夠是以通知的方式。
publicclassTplEvent extends DomainEvent { privatestaticfinallongserialVersionUID = 3238428528672245374L; ..... static public TplEvent generate(){ return new TplEvent() ; } } |
Event Handler 定義
EventHandler 是對Event的響應處理,經過註釋定義該Handler的訪問路徑Path=App.Role.Service ,在集羣運行是能夠直接經過該路徑進行異步事件處理。
@EvtHandler(Role = "kita", Service = "tpl", App = "") publicclassTplEventHandler implements EventHandler<TplEvent> { @Override public <E> void handle(E event) { TplEvent evt = (TplEvent)event ; Result result = ResultStatus.Ok; ... Feedback.Content(evt, result); } } |
Publish Event
Publish 提供以下模式
針對本App服務提供的EventHandler可基於Event Class 進行發送,調用以下
Result r = Publish.Send(Ways.Local(TplEvent.generate())).Retry(); |
另外一種調用模式是基於事件路徑(在集羣中自動完成路由)
Result r = Publish.Send(Ways.Remote("kita.tpl", TplEvent.generate())).Retry(); |
其餘的Pip及Parallel訪問請參考詳細功能說明。