目录
一、需求分析 1
功能需求 1
质量需求 2
二、设计 2
业务逻辑设计 2
分布式架构设计 4
三、实现 9
业务逻辑实现 9
分布式架构实现 9
四、测试与节点估算 10
五、问题分析 11

  1. 代码解耦程度不够 11
  2. 可变数据的存储 11
  3. 消息推送的弹性设置 11
  4. 分布式数据库 11
    六、心得体会 11

一、需求分析
功能需求
用户系统
包括普通用户和司机的注册、登录、退出。

会员积分
普通用户支持按照打车里程进行积分,并升级为不同的会员等级。

约车服务
司机可以设置开始/结束接单,用户可以发起/取消约车请求

派单服务
系统向距离用户较近的若干个司机发送约车信息,司机自行选择接单。

订单服务
用户上车后形成订单,用户到达目的地,司机提交费用,用户支付后订单结束,订单可查询

评价服务
用户可以查看接单司机的评价,在订单完成后可以对接单司机进行评价。

消息推送服务
系统向用户推送司机接单消息 系统向司机推送用户约单消息。
质量需求
系统规模
一年内注册用户数可达5000万,日均订单800万,高峰时段每小时200万订单。

分布式需求
可以通过扩展部署多台服务器的方式达到预期容量需求

用户体验
95%的用户请求响应时间不超过1秒钟
二、设计
业务逻辑设计
数据库实体设计
实体设计较为简洁,包括顾客,请求订单,订单,司机,司机评价,司机请求订单。 顾客只有一个请求订单,本文转载自http://www.biyezuopin.vip/onews.asp?id=14918 可以有多个订单(订单列表)。 司机可有个司机评价,多个订单,多个请求订单。

package cn.bupt.driverserver.entity;import com.fasterxml.jackson.annotation.JsonView;import lombok.Data;import javax.persistence.*;import java.io.Serializable;import java.util.List;@Data@Entitypublic class Driver implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private long id;//@ManyToMany(fetch = FetchType.EAGER)//@JoinTable(name="driver_rOrder",joinColumns = {@JoinColumn(name = "d_id")},inverseJoinColumns = {@JoinColumn(name = "r_id")})//@ManyToMany(cascade = {CascadeType.REFRESH}, fetch = FetchType.EAGER)//private List requestOrderList;//private List requestOrderList = new ArrayList();@OneToMany(cascade = CascadeType.ALL)private List<OrderForUser> orderForUserList;//@JoinColumn(name = "driver_id")@OneToMany(cascade = CascadeType.ALL)private List<RequestOrderForDriver> requestOrderForDriverList;//private List orderList = new ArrayList();@OneToMany(cascade = CascadeType.ALL)@JoinColumn(name = "driver_id")private List<Comment> commentList;//private List commentList = new ArrayList();private int ifLogin;//private Order curOrder;private Long curOrderId;private String curCustomerName;@JsonView(Views.Public.class)private String driverName;@JsonView(Views.Internal.class)private String email;@JsonView(Views.Public.class)private String password;// 司机完成订单次数 完成订单总里程@JsonView(Views.Public.class)private int finishCount;@JsonView(Views.Public.class)private int finishDistance;@JsonView(Views.Public.class)private int serviceLevel;@JsonView(Views.Public.class)private int driverPoint;//@JsonView(Views.Public.class)//private int driverDistance;@JsonView(Views.Public.class)private int driverLevel;@JsonView(Views.Public.class)private double stars;//private String driverLevel;@JsonView(Views.Internal.class)private int ifBusy;@JsonView(Views.Internal.class)private int curX;@JsonView(Views.Internal.class)private int curY;@JsonView(Views.Internal.class)private int desX;@JsonView(Views.Internal.class)private int desY;//@JsonView(Views.Internal.class)//private double curX;//@JsonView(Views.Internal.class)//private double curY;//@JsonView(Views.Internal.class)//private double desX;//@JsonView(Views.Internal.class)//private double desY;//public Driver()//{//this.ifLogin = 0;//this.curCustomerName = "";//this.driverLevel = 0;//this.email = "";//this.password = "";//this.finishCount = 0;//this.finishDistance = 0;//this.serviceLevel = 0;//this.driverPoint =0;//this.driverLevel = 0;//this.stars = 0;//this.ifBusy=0;//this.curX = 25;//this.curY = 25;//this.desX = 25;//this.desY = 25;this.requestOrderList = new ArrayList();this.orderList = new ArrayList();this.commentList = new ArrayList();//}}