本文主要对 Staffjoy 项目的架构做一个介绍和衍生,包括数据模型、各服务接口模型及框架选择等,希望能让大家对于项目有个整体的把握和判断,本文最后也列举了 Dubbo、Spring Cloud 和 K8s 三种微服务框架的异同~
目录
1 架构设计
1.1 总体架构设计
1.2 Skywalking 依赖监控图
1.3 教学版项目技术栈
2 数据和接口模型设计
2.1 账户服务/Account API
2.2 公司服务/Company API
2.3 公司管理员/Admin 服务接口模型
2.4 员工目录/Directory 服务接口模型
2.5 团队/Team 服务接口模型
2.6 雇员/Worker 服务接口模型
2.7 任务/Job 服务接口模型
2.8 班次/Shift 服务接口模型
3 Dubbo、Spring Cloud 和 K8s 对比选型
3.1 微服务公共关注点
3.2 横向比对
3.3 优劣比对
1 架构设计
1.1 总体架构设计
绿色标注就是框架的微服务,核心是 Account API 和 Company API 两服务,分别采用不同的数据库—符合微服务独立数据源的思想
- Account API:账户服务,提供用户登录、注册和用户信息管理等基本信息功能
- Company API:公司服务,提供团队、雇员、班次和任务核心领域的管理
- Bot API:消息转发服务,一方面作为消息队列,缓冲高峰期大量的通知消息,另一方面作为代理,屏蔽将来可能的通知方式的变更
- Mail Sender 和 SMS Sender:都是消息通知服务,分别支持邮件和短信通知方式,它们可以对接各种云服务,比如阿里云邮件或短信服务。
- WhoAmI API:支持前端应用获取当前登录用户的详情信息,包括公司和管理员身份,团队信息等,它也可以看作是一个用户会话(Session)信息服务
- App(也称 MyCompany):单页 SPA 应用,是整个 Staffjoy 应用的主界面,公司管理员通过它管理公司、雇员、任务和排班等信息
- MyAccount :单页 SPA 应用,它主要支持公司雇员管理个人信息,包括邮件和电话等,方便接收排班通知消息
- WWW 应用:前端 MVC 应用,它主要支持产品营销、公司介绍和用户注册登录/登出,这个应用也称为营销站点(Marketing Site)或者登录页(Landing Page)应用
- Faraday(法拉弟):反向代理(功能类似 nginx),也可以看作是一个网关(功能类似 zuul),它是用户访问 Staffjoy 微服务应用的流量入口,它既实现对前端应用和后端 API 的路由访问,也实现登录鉴权和访问控制等安全功能,Faraday 代理是 Staffjoy 微服务架构和前后分离架构的关键,并且它是唯一具有公网 IP 的服务
1.2 Skywalking 依赖监控图
上图是经过调用链埋点监控后,在 Skywalking Dashboard 上实时呈现出来的服务依赖关系图,这个依赖图和总体架构设计保持一致。
1.3 教学版项目技术栈
- Spring Boot
- Spring REST
- Spring Data JPA
- Spring MVC + Thymeleaf
- MySql
- ReactJs + Redux
- Docker Compose
- Kubernetes
本人将 Spring Data JPA 替换为 Mybatis-plus,然后采用较高的 Spring Boot 2.76 版本
SaaS 多租户设计:
普通用户可在 Staffjoy 上注册账户,首次注册提示创建公司--company,完成后该用户自动成为该公司的管理员,管理员之后登录 app 即可管理公司的雇员、任务和排班信息
2 数据和接口模型设计
接下来我们来剖析下它的账户服务和公司服务两核心服务的数据和接口模型设计~
2.1 账户服务/Account API
账户数据模型:
账户接口:
主要被前端及其他服务所调用~
2.2 公司服务/Company API
账户数据模型:
实体关系ER图(简化):
各数据表直接的联系,1 * 是指一对多的关系,1 1 是指一对一的关系,比如一个 company 有多个Team,一个 Worker 有一个 Account(账户)~
接口模型:
2.3 公司管理员/Admin 服务接口模型
2.4 员工目录/Directory 服务接口模型
2.5 团队/Team 服务接口模型
2.6 雇员/Worker 服务接口模型
2.7 任务/Job 服务接口模型
2.8 班次/Shift 服务接口模型
3 Dubbo、Spring Cloud 和 K8s 对比选型
3.1 微服务公共关注点
3.2 横向比对
3.3 优劣比对
至于到底选择哪个,首先理解微服务关注点,根据企业上下文综合考量,并尽量不要混搭,保持体系一致性,注意本项目采用 K8s + Spring Boot~
总结
大家如果有疑问都可以评论提出,有不足之处请大家批评指正,希望能多结识这方面的朋友,共同学习、共同进步。