接上篇博文, 股票分仓交易系统需要实现独立证券账户、产品PB户拆分子账户,每个子账户拥有单独的交易账号及密码,清晰的资金数据和交易记录,与券商一致的操作方式。 实现了更加有效解决因为账户带来的问题,为用户提供更加良好的用户体验。
首先良好的架构与开发模式是保证软件质量与敏捷的基础,我们在这里采用微服务架构,利用CICD工具与K8S使开发,部署,测试,上线自动化. 具体的CICD工具看个人, 我们使用的是阿里云的云效, 截个图大家看看:
为了统一我们不妨把服务称为子系统, 每个子系统独立部署,再引用下这个代码片段:
type IService interface {
ICancelOrderService
IEntrustService
IFollowService
IMarketService
IOpsService
IOrderService
IOrderTaskService
IPositionService
ISessionService
ISettleService
IStatisticsService
ISysaccService
ISecurityTraderService
ISysSettleFlowService
ISystemService
ISysTradeService
ITradeService
IUserService
IUserGroupService
IZixuanService
IUserRegisterRecordService
IUserRegister1RecordService
IUserWithdrawRecordService
IAgentService
}
其中包含
* 撤单子系统
从撤单队列取出撤单任务然后执行撤单操作
* 委托子系统
从委托队列取出委托任务然后执行委托操作
委托管理,查询等
* 跟单子系统
从跟单队列取出跟单任务然后执行撤单操作
跟单管理,查询等
* 行情子系统
负责行情推送
* 运维子系统
监控,报警等运维功能
* 报表子系统
负责报表生成
* 持仓子系统
负责此仓管理与查询
* Session子系统
用户session管理
* 结算子系统
结算相关管理与查询
* 统计子系统
负责统计任务的管理与执行
* 系统管理子系统
负责后台接口
* 券商子系统
负责券商管理,资金池管理
* 资金流子系统
负责资金流管理与查询
* 用户子系统
负责用户管理与查询
* 用户组子系统
负责用户组管理与查询
* 自选子系统
负责自选管理与查询
* Agent子系统
负责Agent的管理与查询
上面的代码片段是Service(服务)的抽象,也是子系统的抽象, 对应的,为了系统的健壮性,我们需要单元测试, 单元测试对覆盖性有要求,覆盖不够全,那么就流于形式了, 但在实际对代码做单元测试时,会发现, Dummy很重要, 下面是Service配套的Dummy代码:
type DummyService struct {
DummyCancelOrderService
DummyEntrustService
DummyFollowService
DummyMarketService
DummyOpsService
DummyOrderService
DummyOrderTaskService
DummyPositionService
DummySessionService
DummySettleService
DummyStatisticsService
DummySysaccService
DummySecurityTraderService
DummySysSettleFlowService
DummySystemService
DummySysTradeService
DummyTradeService
DummyUserService
DummyUserGroupService
DummyZixuanService
}
具体为啥这么做,搞这么麻烦, 懂得自然懂,为了测试覆盖率,为了软件质量.
下面列一下Service之下,Repository的抽象, Repositiory是对数据的管理, 也就是Service->Repository->Database:
type IRepository interface {
IAuthRepository
ICancelOrderRepository
IEntrustRepository
IFollowRepository
IFollowManageRepository
IFollowTaskRepository
ILogRepository
IMainMarketRepository
IMarketRepository
IOrderRepository
IOrderTaskRepository
IPositionRepository
IRoleRepository
ISecurityTraderRepository
ISetRepository
ISettleRepository
ITradeRepository
IUserRepository
IUserGroupRepository
IZixuanRepository
IEventLogRepository
IUserRegisterRecordRepository
IUserRegister1RecordRepository
IUserWithdrawRecordRepository
IAgentRepository
}
同时还有对象的Dummy抽象:
type DummyRepository struct {
DummyAuthRepository
DummyCancelOrderRepository
DummyEntrustRepository
DummyFollowRepository
DummyFollowManageRepository
DummyFollowTaskRepository
DummyLogRepository
DummyMainMarketRepository
DummyMarketRepository
DummyOrderRepository
DummyOrderTaskRepository
DummyPositionRepository
DummyRoleRepository
DummySecurityTraderRepository
DummySetRepository
DummySettleRepository
DummyTradeRepository
DummyUserRepository
DummyUserGroupRepository
DummyZixuanRepository
DummyEventLogRepository
DummyUserRegisterRecordRepository
DummyUserRegister1RecordRepository
DummyUserWithdrawRecordRepository
DummyAgentRepository
}
介绍到这里其实已经把整个系统核心的架构给勾勒出来了,很直接明了,对不对.
下面用图片展示下后台功能, 其实可以与上面的服务抽象做个对应:
下篇文章会跳到后台,介绍下后台功能的实现方案, 本文介绍的是用golang实现,微服务架构,利用CICD工具,K8S管理服务生命周期。同时,再声明下,单元测试很重要,单元测试覆盖率很重要,虽然代码量会大很多,一切都是为了质量.