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访问请参考详细功能说明。