1、什么是SAAS平台? 它的特点是什么?

1.1 SAAS(是什么):Software As A Service 软件即服务,供应商把软件向客户租赁,客户可根据需求租赁相应的服务,并按订购的服务数量和时间长短支付费用。
1.2 SAAS特点(核心):服务共享,数据隔离—->每个客户通过域名(IP)去访问服务,以便区分
1.3 SAAS优点(为什么使用):
1、节约租赁方公司的成本;
2、节约研发公司成本,服务公用;
3、方便升级维护,网络进行访问;
image.png
业界标杆:用友云OA系统
相关概念:Paas ,Platform As A Service 平台即服务,可参考阿里云;IAAS,Infrastructure As A Service ,基础设施即服务

2、餐掌柜各个平台的作用是什么?

  • 运营平台:运营商管理基础数据模块【统一权限、日志、图片、数字字典】以及商家管理的平台
  • 商家平台:点餐后台核心业务,提供员工、店铺、桌台、菜品、订单、结算等功能
  • 点餐平台:H5点餐平台,客户实现开桌、点餐、追加菜品等功能

image.png

3、说出餐掌柜项目的通用服务、核心业务、系统架构作用是什么? 分别用到的技术是什么?

3.1通用服务:各类型的项目都可以复用,电商类、资讯类等均可用
3.2网关
Nginx:反向代理,负载均衡(解决网关单点故障问题),路由承压力,使用keepalived解决Nginx高可用/Lvs+keepalived+Nginx
Gateway:前端访问统一入口,第二代网关服务,路由分发、权限鉴定, 使用Nginx解决网关的高可用。
3.3核心业务:
点餐平台:负责客户点餐业务,为Android、IOS、H5提供统一服务接口
商家平台:负责基础数据配置,同时提供店员及交易结算服务
运营平台:负责商家管理及运营报表系统
image.png

3.4技术栈
image.png

3.5项目技术具体应用
image.png
展现层:负载与用户的交互,分为Android、IOS、web应用,他们都是通过访问统一的gateway网关来实现业务数据的访问
代理层:选用高性能的nginx服务,通过域名与不同servrce的绑定,通过gateway路由到不同的服务器组
权限控制层:使用无状态的JWT认证,结合Spring Security实现统一的权限控制
服务治理:使用nacos注册中心,配置中心实现服务的治理
服务调用:使用Spring Cloud alibaba 的核心组件dubbo进行服务之间的调用
流量控制:使用 Sentinel把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性
缓冲层:spring cache 配合redis轻松无侵入的实现业务数据的缓冲
基础业务支撑:基于spring boot脚手架,轻松集成OSS图片存储、sharding-jdbc分库分表、mybatis-plus、docker、接口文档swagger2、分布式事务seata、MySQL、RocketMQ/RabbitMQ等组件

4、项目模块及核心项目模块职责?

image.png
主项目结构说明:

  1. |——restkeeper-super 负责整个项目的模块定义,依赖和插件管理
  2. |———— restkeeper-framework 核心组件模块,是对各个框架集成:mpseatajwtredis等等
  3. |———— restkeeper-gateway 网关对外统一接口,集成对日志client、鉴权clientknife4j组件
  4. |———— restkeeper-model-basic 基础服务模块,与业务无关的组件都在这里集成
  5. |———— restkeeper-model-report 报表模块提供统一的日志报表,对各个子系统报表提供接口支撑
  6. |———— restkeeper-model-security 统一鉴权模块,依赖spring-security
  7. |———— restkeeper-model-shop 商家中心模块:各个主业务功能的实现,并且提供H5点餐端
  8. |———— restkeeper-model-trading 交易平台,提供商家平台支付业务的结算功能

5、能够说出项目数据库表结构设计及分库设计

5.1表结构设计:
1、在遵循数据库设计的第三范式基础上,适当添加的部分冗余字段;
1.1、减少了关联多表查询,减少了使用join
1.2、服务独立化,查询单表化
2、表与表之间全部采用逻辑关联,不适用外键约束,提高查询效率;

5.2分库设计:
遵循领域模型设计【DDD】,我们按照功能模块领域垂直把数据库分为5个库,具体库的职能以及内部所含有的表详细情况如下图所示:
image.png

5.3为什么这么设计:

  • 解决业务层面的耦合,业务清晰
  • 能对不同业务的数据进行分级管理、维护、监控、扩展等
  • 高并发场景下,垂直分库一定程度的提升IO、数据库连接数、降低单机硬件资源的瓶颈

6、什么是微服务? 微服务的特点是什么?

6.1微服务可简单概括为:

  • 小:微服务体积小,2 pizza 团队。
  • 独:能够独立的部署和运行。
  • 轻:使用轻量级的通信机制和架构。
  • 松:为服务之间是松耦合的。

6.2微服务的特点:

  • 单一职责:微服务中每一个服务都对应唯一的业务能力,做到单一职责
  • 微:微服务的服务拆分粒度很小,例如一个用户管理就可以作为一个服务。每个服务虽小,但“五脏俱全”。
  • 面向服务:面向服务是说每个服务都要对外暴露RPC协议Dubbo服务接口API。并不关心服务的技术实现,做到与平台和语言无关,也不限定用什么技术实现,只要提供Rest的接口即可。
  • 自治:自治是说服务间互相独立,互不干扰
  • 团队独立:每个服务都是一个独立的开发团队,人数不能过多。
  • 技术独立:因为是面向服务,提供Rest接口,使用什么技术没有别人干涉
  • 前后端分离:采用前后端分离开发,提供统一Rest接口,后端不用再为PC、移动段开发不同接口
  • 数据库分离:每个服务都使用自己的数据源
  • 部署独立:服务间虽然有调用,但要做到服务重启不影响其它服务。有利于持续集成和持续交付。每个服务都是独立的组件,可复用,可替换,降低耦合,易维护

7、能够描述docker-compose文件创建的容器及容器启动的依赖关系?

  1. #mysql数据库脚本
  2. #容器服务名称,建议写的见名知意
  3. mysql:
  4. image: mysql:5.7 #镜像版本
  5. container_name: mysql #容器名称, 默认:docker-compose.yml所在文件夹名 + 容器服务名称 docker_mysql
  6. restart: always #自启动
  7. ports:
  8. - 3306:3306 #对外暴露端口 宿主机端口:容器端口, 宿主机端口 不要出现端口被占用情况
  9. volumes: # 数据卷:理解共享文件夹
  10. - ./mysql/mydir:/mydir
  11. - ./mysql/data:/var/lib/mysql
  12. - ./mysql/conf/my.cnf:/etc/my.cnf
  13. - ./mysql/source:/docker-entrypoint-initdb.d/ # **** 自动创建库表,自动/mysql/source下找sql脚本执行,sql第一行是建库使用库,创建表
  14. environment:
  15. MYSQL_ROOT_PASSWORD: pass # root用户的密码 pass
  16. networks:
  17. extnetwork:
  18. ipv4_address: 172.21.0.2 # 容器内部的虚拟IP,容器和容器内部的相互通信
  19. depends_on:
  20. - mysql # 要求容器的加载顺序 如nacos需读取mysql中的配置信息,则必须要在mysql正常启动之后才能启动

8、能够描述运营平台服务的调用链路?

image.png

9、能够说出basicXXX 的基础类的作用?

为什么:
根据阿里巴巴开发手册中的开发规范,所有的数据库中的表应当具有以下几个字段:
id created_time(主动创建) update_time(后续修改) ( enable_flag—是否有效

是什么:
1、— BasicPojo 基础类:对应的是数据库表中的 共有的字段实体类,即具有以下属性(id/created_time/update_time/enable_flag)
要求:所有的表对应的pojo都要继承当前 BasicPojo
2、—BasicVo 基础类:前端传过来的、向前端相应的实体类的基础父类,即具有以下属性(id/created_time/update_time/enable_flag)
要求:参数对象及响应对象都要继承当前 BasicPojo

设计目的:
1、减少代码重复度;
2、降低代码维护成本;

10、能够说出 Vo和POJO的作用范围?

pojo —- 数据库表一一实体类对应
vo —- 后端给前端响应的对象
dto —- 前端给后端提交参数对象
项目规定:本次项目中参数对象及响应对象都使用VO
原因:
1、 各种bean之间转换,影响项目的性能
2、降低项目对象转换难度
f9531ce36f3d6029bfa3b27245fd248.png

11、能够理解异常枚举类的作用?

数据库中的一张表对应的实体类都创建对应的异常枚举类,实现IBasicEnum接口,并设置相应的错误提醒,以便出现异常时,开发人员或运维人员可根据异常信息立刻就知道是哪个模块出现错误,可快速定位问题,即设计的目的如下:
1、给用户友好的提示信息;
2、统一记录日志,方便运维开发快速定位异常;

12、能够掌握业务开发模块间的调用链路(生产者、消费者的接口的定义)

f9531ce36f3d6029bfa3b27245fd248.png