微服务和云原生架构教学案例项目,基于 Spring Boot 和 Kubernetes 技术栈
微服务和云原生架构是目前互联网行业的技术热点,相关资料文档很多,但是缺乏端到端的贴近生产的案例,这就使得很多互联网开发人员(包括架构师),虽然学习了很多微服务理论,但是在真正落地实施微服务云原生架构的时候,仍然会感到困惑。为此,我利用业余时间,通过改造一个叫Staffjoy的开源项目,开发了这个教学版的案例项目。整个项目采用微服务架构,并且可以一键部署到 Kubernetes 容器云环境。最近我和极客时间合作,基于这个案例项目开发了一门课程《Spring Boot 与 Kubernetes 云原生微服务实践 ~ 全面掌握云原生应用的架构设计与实现》,参考课程大纲。希望通过实际案例项目和课程的学习,让开发人员/架构师不仅能够深入理解微服务和云原生架构原理,同时能够在生产实践中真正地去落地实施微服务和云原生架构。也希望这个项目成为微服务云原生架构的一个参考模版,进一步可以作为类似项目的脚手架。
通过具体案例的形式,教大家使用 SpringBoot 框架,开发一个贴近生产的微服务应用,并一键部署到 Kubernetes 容器云环境,帮助大家:
Staffjoy 微服务间通讯,包括对外暴露 API,全部采用 JSON over HTTP 标准方式。
上图是经过调用链埋点监控后,在 Skywalking Dashboard 上实时呈现出来的服务依赖关系图,这个依赖图和总体架构设计保持一致。
Staffjoy 教学版所采用的技术栈都是目前行业主流,数量不多,如上面架构图所标示。所有微服务(绿色标注)采用Spring REST开发,有数据访问交互的采用Spring Data JPA,数据库使用MySQL。WWW 服务使用Spring MVC+Thymeleaf模版引擎开发。Faraday 也是一个SpringBoot应用,内部路由和安全等逻辑基于Servlet Filter实现。两个单页 SPA 应用(暗红色标注)都是采用ReactJs+Redux框架开发。整个应用支持一键部署到本地Docker Compose环境,也支持一键部署到Kubernetes容器云环境,所以 Staffjoy 的整体架构是支持云原生的微服务架构。
Staffjoy 教学版依赖一些私密配置,例如 sentry-dsn 和 aliyun-access-key 等等,这些私密配置不能 checkin 到 github 上,所以采用了 Spring 的一种私密配置机制,私密数据集中配置在config/application.yml中,这个文件在 gitignore 中,不会被 checkin 到 github。请参考 config 目录中的application.yml.example文件和格式,在 config 目录中添加一个appliction.yml文件,其中填写你自己的私密配置。如果你暂时没有这些配置,可以暂时用假数据,直接把 application.yml.example,改为 application.yml,这样应用可以运行起来。注意,如果 aliyun 相关配置不配,则无法发送邮件或短信,sentry 相关配置不配则无法发送异常数据到 sentry,intercom 不配则不能对接 intercom 客服系统,recaptcha 暂未用可以不配。
关于如何运行的进一步内容,请参考极客时间的视频课程,课程里头有step by step演示。
Staffjoy 的 mail-svc 依赖于阿里云的邮件推送(DirectMail)发送邮件,不少学员反应运行时邮件发送不成功,实际配置阿里云 DirectMail 是比较麻烦的,有一个简单办法可以绕开:邮件发送不成功的话,会报异常日志,日志里头有邮件内容,比如账号注册邮件发不成功,可以从异常日志里头找到激活链接,把链接贴到浏览器中,就可以激活账号了。后续考虑简化 mail-svc,支持 smtp 等简单方式配置和发送邮件。
Staffjoy曾经是美国硅谷的一家初创公司,成立于 2015 年,创始人是Philip I. Thomas,公司曾获得 Y Combinator 等知名机构的投资。Staffjoy 的主要业务是为小企业提供工时排班(Scheduling)软件解决方案,帮助企业提升雇员管理效率,主要面向零售、餐饮等服务行业。因业务发展和招聘等原因,Staffjoy 公司最终于 2017 年关闭,在关闭前,公司把核心产品大部分都开源贡献给了 Github 社区。Staffjoy V2是公司关闭前研发的最新一款 SaaS 版企业排班系统,目前在 Github 上有超过 1k 星,总体设计和代码质量较高,目前有不少企业在定制使用。Staffjoy V2 是一个小规模 SaaS 应用,采用微服务和前后分离架构,支持 Kubernetes/GKE 容器云环境一键部署,是学习现代 SaaS、微服务和云原生架构的一个模版项目。
Staffjoy 应用的业务功能相对简单,简单讲就是帮助小企业管理者管理雇员和排班,并以短信或者邮件等方式,将排班信息及时通知到雇员。具体讲,Staffjoy 主要支持两类用户角色和用例,一类是公司管理员(admin),他们可以通过 Staffjoy 管理公司(company)、员工目录(directory),团队(team)和雇员(worker),也可以创建任务(job),创建和发布班次(shift)信息;另一类是公司雇员,他们可以通过 Staffjoy 管理电话和邮件等个人信息,便于接收到对应的排班通知。Staffjoy 应用主要以共享版 SaaS 服务形式提供,也支持针对一些大客户的定制私有部署,这就要求 Staffjoy 应用易于部署和运维,要支持一键部署到 GKE 等容器云环境。另外,作为一款 SaaS 服务产品,良好的市场营销(Marketing)和客服是赢得用户的关键,所以 Staffjoy 需要提供营销友好的(Marketing Friendly)宣传和登录页(Landing Page),也要支持对接主流的在线客服系统如 Intercom。