资管系统 项目架构
ApiGateway相当于网关,router由zookeeper实现,项目最终的界面:
资管系统,主要负责包括投资,交易,组合管理,资产配置,风险管理等资管领域业务;
资管相关系统学习了解,包括O32,TA,估值,重点是产品管理系统(投资,交易,交收,资金,产品,账户);
整个项目摈弃了传统的三层架构模型,采用的领域驱动模型(DDD模型)
领域模型的设计精髓在于面向对象分析,在于对事物的抽象能力。
领域驱动模型(bo,do,po)与传统的三层架构(controller,service,dao)的区别:
当前端页面的需求发生变化时,传统的三层架构需要从底层开始改,ddd模型只需要改bo层
用户展示层、应用层、业务层、基础架构层
代码架构图:(以合同提交功能为例)
1. interface
- FService (ample: com.pasc.fame.ample.product.application.facade.ContractFService)
- Bo(前端需要的新需求的bo)(ample: com.pasc.fame.ample.product.application.facade.bo.ContractBo)
- Controller(都在gateway里面) (gateway: com.pasc.fame.ample.product.web.controller.ContractController)
2. application(应用)
- Fservice的实现类(ample:com.pasc.fame.ample.product.application.facade.impl.ContractFServiceImpl)
- 提供服务的接口+impl (ample:com.pasc.fame.ample.product.application.service.ContractService; ample:com.pasc.fame.ample.product.application.service.impl.ContractServiceImpl)
3.domain(业务层)
- Do (ample: com.pasc.fame.ample.product.domain.model.ContractDo)
- 接口 (ample:com.pasc.fame.ample.product.domain.model.repository.ContractRepository)
4. infrastructure(基础架构)
- dao: 业务层接口的实现类(ample:com.pasc.fame.ample.product.infrastructure.dao.ContractRepositoryImpl)
- Po
初期启动时需要保留的模块:workflow,ample
sql语句存放的位置: D:\project2\ample\product\service\src\main\resources\sqlmap-ample-contract.xml
modelMapper:A,B类中如果有很多相同的属性值,通过这个方法可以把相同的属性值从A中赋给B。
接下来看 dubbo和activemq的调用
Dubbo在项目中的部署架构:
封装在底层,通过各种注解@PService来调用; 详细了解一下dubbo的原理;
ample-service-config.xml: D:\project2\ample\config\src\main\resources\META-INF\spring\ample-service-config.xml
集合产品信息:
Interface:
ProductController, ProductBo, ProductFService
application:
ProductFServiceImpl, ProductService, ProductServiceImpl
domain:
ProductDo, ProductRepository
infrastructure:
ProductPo, ProductRepositoryImpl, sqlmap-ample-product.xml
---------------------------------------面试--------------------------------------------------
为什么要用消息队列? 解耦、异步、削峰
1、 解耦
我们整个系统内部有很多模块,比如产品管理模块,支付模块,传真邮件模块。各个模块之间经常需要数据通信,各个模块严重耦合。通过消息队列,当产品管理模块里面新增一个产品时,我们可以将它放到MQ里面,哪个系统需要就自己去消息队列消费。
2、异步;
我们的产品管理模块需要调取资金模块和交收模块的信息,我们是直接从mq里面直接读取的,减少了等待时间
为什么要用activeMQ?
简单做下异步一般就activeMQ,成本低啊。如果有一些分布式事务可以用rocketMQ,流数据处理kafka。
activemq基于java开发,是已经很完备消息队列,非常稳定,大多数的解决方案网上都能找到,缺点就是吞吐量相比rocket,kafka还不够大,并且版本现在更新的很慢了,社区不活跃,rabbit用的erlang开发,并发超强,但不好定制化,出问题可能抓瞎。