天天逛微系统
来源:广州软件开发 编辑:广州软件开发公司 日期:2018-08-18
天天微逛系统总体技术方案
一、总体系统架构
天天微逛移动社交电商平台符合电商平台基本架构模式。将核心业务集中在中台核心业务系统,系统采用两个维度的划分策略:
按业务垂直拆分:便于将复杂的系统通过组件和模块化的思路简单化,并通过SOA的方式实现功能的整合。
按技术实现水平拆分:水平分层主要是将业务、技术分离,将千变万化的业务规则和稳定的业务逻辑分离,实现系统在业务和技术两个维度的可扩展性。
天天微逛总体系统架构如上图所示,系统采用三层架构模式:
-
中台主要负责核心业务逻辑和核心数据存取,包括用户中心、商品中心、分销中心、交易中心、促销中心、搜索引擎、推荐引擎等核心子系统。
-
前台为面向用户段的子系统,从使用模式分首页和管理后台,从业务功能划分分为:商品管理、店铺管理、分销管理、订单管理、结算管理、图片中心。前台系统之前承载面向用户的业务请求,包括从APP和浏览器过来的业务请求。
-
后台系统主要是面向运营、公司决策层和第三方接入的,其中运营平台相关系统前期可以考虑简单的开发实现,带后期规模比较大的时候再考虑购买第三方专业产品解决相关问题。
二、功能架构
功能架构主要以功能模块的方式对系统进行分解,定义各子系统的功能职责,一方面将业务进行集中维护,另一方面方便子系统之间的协作沟通。
核心业务系统主要以SOA的方式提供服务出去供业务子系统调用,核心系统内部各子系统之间尽量避免调用和依赖关系。
三、组件架构
组件架构从开发组件的角度定义各子系统的功能组件,明确系统的逻辑结构。
3.1、用户中心组件架构
用户系统组件架构分三层:数据存储层、核心业务层、业务应用层。
-
数据存储层采用mysql和mongodb结合的方式,由mysql负责数据的持久化存储,mongodb负责数据读取加速,解决数据层压力问题。
-
核心业务层分用户信息中心和group中心
-
用户信息中心主要负责用户数据保存、更新、删除、校验 等逻辑。
-
Group中心主要负责维护用户之间的关系,会员分销。
-
应用层包括:framework的sso;用户前台注册找回密码等逻辑;用户管理 三个部分。
-
Framework主要是sso登陆用
-
用户前台主要涉及到注册、找回密码等功能需要和用户中心交互。
-
用户管理模块主要是供应商、小B、消费者及运营人员维护管理自己和他人的账号信息。
User库采用主备复制,集群进行负载均衡策略,用户信息同时向mongodb进行同步,对用户数据读取起到加速和缓存作用。
用户库分成五个模块:用户信息、购买者扩展信息、小B扩展信息、供应商扩展信息和用户分组信息,分别对应t_user_info、t_user_c、t_user_b、t_user_supplier、t_user_group前缀,跨模块之间不可以进行连接查询。
3.2、商品中心组件架构
商品组件架构分三层:数据存储层、核心业务层、业务应用层。
商品中心主要包括:品牌管理、分类管理、SKU管理、商品信息管理,商品相关核心业务都集中在这三大组件里面,对外以dubbo的方式提供服务。
应用层主要包括商品展示和商品管理:
-
商品展示主要从商品中心获取商品数据并进行展示。
-
在供应商、运营同学后台都有商品管理的功能模块,主要负责商品信息维护。
item库采用主备复制,集群进行负载均衡策略,用户信息同时向mongodb进行同步,对商品数据读取起到加速和缓存作用。
用户库分成五个模块:商品分类、商品品牌、商品sku、商品信息,分别对应t_item_ctg、t_item_brand、t_item_sku、t_item_product前缀,跨模块之间不可以进行连接查询。
3.3、交易中心组件架构
交易组件架构分三层:数据存储层、核心业务层、业务应用层。
交易中心主要包括:订单中心、账目中心、支付中心,交易相关核心业务都集中在这三大组件里面,对外以dubbo的方式提供服务。
应用层主要包括订单管理、账目管理、支付管理:
trade库采用主备复制,集群进行负载均衡策略。
交易库反正三个模块:订单模块、财务单据模块、支付模块,分别对应t_trade_order、t_trade_finance、t_trade_pay前缀,跨模块之间不可以进行连接查询。
四、系统依赖关系
依赖关系上整体系统尽量避免水平依赖(同一层不同系统之间的调用),系统之间的垂直依赖(前台调用中台系统)是合理的,及应用层可以调用中台核心业务系统组件的SOA接口,客户端调用应用层http接口和系统进行交换。
后台主要是业务支撑层,其中运营平台负责整个系统的数据和业务规则的管理维护,BI系统负责数据分析,并引入些第三方系统为我们的系统提供支持比如支付、IM、短信 等。
4.1总体依赖关系
4.2中台核心系统依赖关系
4.3前台业务系统依赖关系
4.4后台管理系统依赖关系
五、主要业务流程
5.1、用户中心主要业务流程
1.用户注册
2.绑定手机号
3.绑定QQ号、微信号等第三方账号
4.第三方系统登陆
5.SSO登陆
5.2、商品中心主要业务流程
1.商品状态图
2.跨职能业务流程图
3.其它问题
供应商录入商品时普通商品属性和SKU商品属性录入?
用户购买商品时基于SKU选择商品时的界面罗列出所以种组合的SKU列表,不需要像淘宝搞的那么复杂难得实现
5.3、交易中心主要业务流程
1.订单购物状态图
2.财务单据状态图
财务单据分4种:
A、用户购物的财务单据
B、天天微逛打款给供应商的财务单据
C、天天微逛贷款给小B的财务单据
D、天天微逛退款给买家的财务单据
1、用户购物的财务单据状态图
2、天天微逛打款给供应商和小B的财务单据状态图
3、天天微逛退款给买家的财务单据状态图
3.支付记录状态图
4.用户下单业务流程图
5.用户付款业务流程
6.用户申请退款业务流程
7.确认收货业务流程
这里包括用户确认收货和系统自动确认收货
8.T+8定时任务业务流程
9.用户取消订单业务流程
10.用户申请退货退款业务流程
六、数据库设计
6.1、用户中心数据库设计
6.2、商品中心数据库设计
6.3、交易中心数据库设计
七、技术标准及开发规范
7.1、框架选型
解决的问题 |
组件名字 |
版本 |
备注 |
JDK |
JDK |
|
|
IOC |
Spring |
3.1.4.RELEASE |
|
MVC |
SpringMVC |
3.1.4.RELEASE |
|
ORM |
MyBatis |
3.2.7 |
|
Security |
OAuth |
|
|
JSON |
FastJson |
|
|
Log |
Logback |
|
|
单元测试 |
Test4j |
|
|
Mock |
JMock |
|
|
SOA |
Dubbo |
|
|
MQ |
RocketMQ |
3.1.5 |
|
Cache |
Redis |
|
|
Servlet 容器 |
Tomcat |
|
|
反向代理 |
Nginx |
|
|
数据存储 |
MySQL |
|
|
数据存储 |
MongoDB |
|
|
数据存储 |
OceanBase |
|
|
分库分表中间件 |
Cobar |
|
|
数据库连接处 |
Druid |
|
|
依赖关系管理 |
Maven |
|
|
应用打包 |
Jenkins |
|
|
代码质量管理平台 |
Sonar |
|
|
单元测试覆盖率 |
Cobertura |
|
EMMA、Clover |
持续集成 |
Hudson |
|
|
代码规范 |
Jalopy |
|
Checkstyle |
自动化部署 |
Ansible |
|
MooseFS、Salt |
配置平台 |
xfig |
|
|
监控检测及数据统计 |
Metrics |
|
|
日志集中化 |
Logstash |
|
|
分布式Trace |
Zipkin |
|
|
|
|
|
|
7.2、目录结构规范
目录结构、包命名、类命名、配置文件命名规范如下:
xxx
xxx.yyy.dao
xxx.yyy.service
xxx.yyy.impl
xxx.yyy.web
xxx.war
xxx.task
pom.xml
xxx.yyy.dao
src/main/java/com.ttwg.xxx.yyy.domain.User.java
src/main/java/com.ttwg.xxx.yyy.dao.UserDao.java
src/main/java/com.ttwg.xxx.yyy.dao.impl.UserDaoImpl.java
src/main/resources/com/ttwg/xxx/yyy/impl/UserDao.xml
src/main/resources/conf/xxx-yyy-spring-dao.xml
src/main/resources/conf/xxx-yyy-sqlmap-config.xml
src/test/resources/test4j.properties
src/test/resources/system.properties
src/test/resources/conf/xxx-yyy-spring-dao-test.xml
pom.xml
xxx.yyy.service
src/main/java/com.ttwg.xxx.yyy.beans.User.java
src/main/java/com.ttwg.xxx.yyy.service.UserService.java
pom.xml
xxx.yyy.impl
src/main/java/com.ttwg.xxx.yyy.service.impl.UserServiceImpl.java
src/main/resources/conf/xxx-yyy-spring-service.xml
src/test/java/com.ttwg.xxx.yyy.service.impl.UserServiceImplTest.java
src/test/resources/test4j.properties
src/test/resources/system.properties
src/test/resources/conf/xxx-yyy-spring-service-test.xml
pom.xml
xxx.yyy.web
src/main/java/com.ttwg.xxx.yyy.web.vo.User.java
src/main/java/com.ttwg.xxx.yyy.web.controller.UserController.java
src/main/resources/conf/xxx-yyy-spring-web.xml
src/test/java
src/test/resources
pom.xml
xxx.war
src/main/java
src/main/resources
src/main/webapp/WEB-INF/web.xml
src/test/java
src/test/resources/conf/xxx-application-context.xml
pom.xml
xxx.task
src/main/java/com.ttwg.xxx.yyy.task.service.UserStatService.java
src/main/java/com.ttwg.xxx.yyy.task.service.impl.UserStatServiceImpl.java
src/main/resources/conf/xxx-spring-task.xml
src/test/java/com.ttwg.xxx.yyy.task.service.impl.UserStatServiceImplTest.java
src/test/resources/test4j.properties
src/test/resources/system.properties
src/test/resources/conf/xxx-spring-task-test.xml
pom.xml |
说明:
-
采用工程集的方式组织每个应用的代码,实现高度的模块化
-
采用maven管理模块直接的依赖关系
-
xxx为顶层目录,里面包括父pom.xml文件和各子工程的文件目录
-
xxx.yyy.dao 子工程主要存放访问数据库的类和配置文件
-
xxx.yyy.service 子工程主要存放业务层的接口和领域模型,在做服务化的时候提供给第三方使用
-
xxx.yyy.impl 子工程是业务层的实现类和配置文件
-
xxx.yyy.web 子工程提供http协议的数据接口
-
xxx.war 子工程包含war包所需的jsp、web.xml 等
-
xxx.task 子工程主要是应用里面offline的业务操作,比如数据迁移、定时任务等业务逻辑
-
子工程可以根据各应用的情况具体增减
-
xxx代码应用名称,各应用需要使用自己的应用名称替换“xxx”,yyy代码模块名称,各模块需要使用自己的名称替换“yyy”,比较简单的应用如果没有多模块的划分可以省略yyy
7.3、命名规范
目录命名规范
-
子工程所在的目录名称使用“.”将应用名称、模块名称、组件后缀分开
-
目录名称都使用小写
-
每个子工程下面的资源分四个目录组织,分别是: src/main/java、src/main/resources、src/test/java、src/test/resources
-
应用名称、模块名称尽量简单,最长不超过8个字符
包命名规范
-
dao子工程中包的命名规范如下:
src/main/java/com.ttwg.xxx.yyy.domain.User.java
src/main/java/com.ttwg.xxx.yyy.dao.UserDao.java
src/main/java/com.ttwg.xxx.yyy.dao.impl.UserDaoImpl.java
src/main/resources/com/ttwg/xxx/yyy/dao/impl/UserDaoImpl.xml
src/main/resources/conf/xxx-yyy-spring-dao.xml
ORM中的Entity包名为:com.ttwg.%appname%.%modulename%.domain
DAO接口所在包为:com.ttwg.%appname%.%modulename%.dao
DAO接口实现类所在包为:com.ttwg.%appname%.%modulename%.dao.impl
DAO操作使用的SQL脚步文件所在目录为:com/ttwg/%appname%/%modulename%/dao/impl
DAO的配置文件所在目录为:src/main/resources/conf/
-
service子工程中包名规范如下:
src/main/java/com.ttwg.%appname%.%modulename%.beans.User.java
src/main/java/com.ttwg.%appname%.%modulename%.service.UserService.java
Service中的领域模型所在的包名为:com.ttwg.%appname%.%modulename%.beans
Service中的接口所在的包名为:com.ttwg.%appname%.%modulename%.service
-
impl子工程中包名规范如下:
src/main/java/com.ttwg.%appname%.%modulename%.service.impl.UserServiceImpl.java
src/main/resources/conf/xxx-yyy-spring-service.xml
src/test/java/com.ttwg.%appname%.%modulename%.service.impl.UserServiceImplTest.java
src/test/resources/test4j.properties
src/test/resources/system.properties
src/test/resources/conf/xxx-yyy-spring-service-test.xml
Impl中业务接口的实现所在的包名为:com.ttwg.%appname%.%modulename%.service.impl
Impl中业务实现的配置文件所在的目录为:src/main/resources/conf/
-
web子工程中包名规范如下:
src/main/java/com.ttwg.%appname%.%modulename%.web.vo.User.java
src/main/java/com.ttwg.%appname%.%modulename%.web.controller.UserController.java
src/main/resources/conf/xxx-yyy-spring-web.xml
Web层数据数据对象所在的包为:com.ttwg.%appname%.%modulename%.web.vo
Web层Controller所在的包为:com.ttwg.%appname%.%modulename%.web.controller
Web层配置文件所在的目录为:src/main/resources/conf/
-
war子工程中包名规范如下:
src/main/java
src/main/resources/conf/xxx-application-context.xml
src/main/webapp/WEB-INF/web.xml
Web层配置文件所在的目录为:src/main/resources/conf/
-
task子工程中包名规范如下:
src/main/java/com.ttwg.xxx.yyy.task.service.UserStatService.java
src/main/java/com.ttwg.xxx.yyy.task.service.impl.UserStatServiceImpl.java
src/main/resources/conf/xxx-spring-task.xml
src/test/java/com.ttwg.xxx.yyy.task.service.impl.UserStatServiceImplTest.java
src/test/resources/test4j.properties
src/test/resources/system.properties
src/test/resources/conf/xxx-spring-task-test.xml |
task中业务接口所在的包为:com.ttwg.%appname%.%modulename%.task.service
task中业务接口实现所在的包为:com.ttwg.%appname%.%modulename%.task.service.impl
task中配置文件所在的目录为:src/main/resources/conf/
-
单元测试的包名及目录规范:
单元测试类的包名和所测试类的包名一致,所在的目录为 src/test/java
系统配置文件system.properties及单元测试配置文件test4j.properties所在的目录为:src/test/resources
单元测试 spring 配置文件所在目录为:src/test/resources/conf
类的命名规范
DAO的接口命名为:XxxDao
DAO的实现类命名为:XxxDaoImpl
Service层接口命名为:XxxService
Service层接口实现类命名为:XxxServiceImpl
Web层controller的命名为:XxxController
单元测试类的命名为:XxxDaoImplTest、XxxControllerTest
注:Xxx 为对象名称
配置文件命名规范
DAO层配置文件命名为:xxx-yyy-spring-dao.xml、xxx-yyy-sqlmap-config.xml
Service层配置文件命名为:xxx-yyy-spring-service.xml
Web层的命名为:xxx-yyy-spring-web.xml
war包的命名为:xxx-application-context.xml
Task的配置文件命名为:xxx-spring-task.xml
系统配置文件命名为:system.properties
单元测试配置文件:test4j.properties、system.properties、xxx-yyy-spring-dao-test.xml、xxx-yyy-spring-service-test.xml、xxx-yyy-spring-web-test.xml、xxx-spring-task-test.xml
注:xxx 为应用名称、yyy为模块名称。
7.4、模块之间的依赖关系
为避免过多的module,dao层可以依赖service层。
八、部署架构
8.1、数据层分布式部署架构
主要业务数据依然采用MySQL存储,由于用户量大、用户数据大,需要采用分库分表的方式组织数据。采用Cobar中间件作为Proxy实现数据存储的分布式,数据库连接通过Proxy进行代理,对业务层来说,数据存储层的扩展和维护完全透明,从而实现数据存储的分布式可扩展性。
说明如下:
-
select、update、delete、insert SQL 都必须带上userId
-
每台服务器上部署8到16个实例实现数据预分片,防止以后需要将一个库裂变成多个库的麻烦。
-
采用一主一备一从的部署结构,备机主要承担主机宕机的接管工作,从机主要为BI系统数据抽离做准备。
8.2、业务层分布式部署架构
业务层采用基于dubbo实现的分布式架构设计,核心业务系统将自己提供的服务注册到zookeeper注册中心,业务前台从zookeeper注册中心拉取服务列表,后根据权重将dubbo调用落到不同的服务提供服务器上。当服务提供方和服务消费方应该新增大量PV需要增加服务器应对时,对另一方是毫无影响的,从而实现了分布式水平可扩展。
说明:
-
Dubbo注册中心采用zookeeper实现。
-
监控中心同时监控服务提供方和服务消费方的监控状况,一旦服务器压力过大可以增加服务器应对。
8.3、Web层分布式部署架构
Web层接受到用户的请求后通过Load Balance 组件实现将负载分摊到web服务器集群。Web服务器采用nginx作为接受服务的前置机,专门负责处理客户端连接请求。当nginx一个请求完成后将请求包丢给tomcat服务器进行业务处理,从而让tomcat更专注于web层逻辑的分发,将客户端线程连接等工作交给nginx去处理,避免tomcat内部大量线程阻塞的情况出现。
采用集中式session cache 的方式解决集群会话信息存储问题,避免session 丢失。同时尽量采用无状态的方式处理回话请求,不可以往session 里面存储太多相关信息。
8.4、静态资源部署方式
静态资源包括图片、html、css、js 等文件,将这些文件部署到CDN系统,用户通过CDN从最近的服务器节点加载资源,从而提高资源加载速度。
相关阅读