微服务(Microservices)和云原生(Cloud-Native)是近年技术热点,相关资料很多,但是缺乏端到端的集成案例,使得开发人员(甚至一些架构师)无法理解现代应用开发的全貌。本项目试图弥补这一不足,我们将带领大家使用Spring Boot + JWT + React等主流技术,开发一个叫MovieApp的简单微服务应用,并且以云原生的方式,将应用一键部署到Kubernetes容器云中。
本项目帮助开发人员理解:
- 全栈架构和DevOps,传统意义上全栈(Full Stack)仅指同时会用前后端技术进行开发,但现代应用开发不仅包括前后端开发,还包括安全、测试、部署和监控等各个环节,如何让开发人员(尤其是新手)快速建立全栈和DevOps视角?
- 微服务架构,如何以微服务**设计应用?开发微服务应用需要考虑哪些架构要素?如何用主流技术实现微服务架构?
- 前后分离架构,应用架构为什么要做前后分离?如何利用微服务网关实现前后分离架构?
- 云原生架构,什么是云原生架构?学习K8s需要掌握哪些核心概念?如何将微服务应用一键部署到K8s?
上图是整个应用的架构,比较简单,其中只有两个服务:
- AuthSvc: 负责用户注册和登录,颁发JWT令牌等功能;
- MovieSvc: Movie数据的存取服务,相当于演示应用的业务逻辑部分。对Movie数据的访问需要具有合法的JWT令牌,该服务也实现JWT令牌的自校验。
上面两个服务都是使用Spring Boot开发,数据分别存储在独立的MySql数据库中,相当于演示微服务独立数据源的**。
MovieApp是应用前端,是由React开发的纯HTML/JS页面,MovieApp通过Ajax方式调用后台服务。
前后端之间有一个使用Spring Cloud Gateway开发的微服务网关,它是整个应用的单点入口,同时通过它实现应用的前后分离。
关于调用流程,上图红色箭头标注用户注册登录调用流,暗灰色箭头标注Movie存取调用流,虚线标注页面加载流。页面加载发生在浏览器第一次请求页面时,之后MovieApp就住在浏览器中,通过Gateway间接和后台API进行交互存取数据。
另外,应用使用一个叫OMDb(Open Movie Database) API的服务进行Movie查询,这个查询是浏览器中的MovieApp通过Ajax直接发起,架构图中使用暗黄色箭头标注调用流。
本项目使用的技术栈包括:
- Spring Boot ~ 后端开发框架,架构中的AuthSvc/MovieSvc/Spring Cloud Gateway服务使用Spring Boot开发。
- Spring Security ~ 后端安全框架,通过Spring Security+JWT的方式实现微服务安全。
- JWT ~ 令牌的生成和校验组件,实现无状态令牌校验。
- MyBatis ~ ORM框架
- MySQL ~ 后端存储,存放用户和Movie数据
- React ~ 前端组件框架,所有MovieApp的页面基于React/JS开发。
- Spring Cloud Gateway ~ 微服务网关,对API和静态页面进行反向代理,实现应用/API统一入口,实现前后分离架构。
- Docker Compose ~ 镜像构建和本地部署,通过Docker Compose一键构建微服务镜像,实现本地一键部署,方便本地集成测试。
- Kubernetes ~ 容器调度和部署,实现微服务应用一键部署,微服务应用全生命周期管理。
本项目代码开源在github上,地址: https://github.com/jskillcloud/MovieApp
- /auth-svc/ : 用户注册认证服务,Spring Boot + Maven项目
- /gateway/ : 网关服务,Spring Boot + Maven项目
- /k8s/testing/ : k8s部署文件for测试环境
- /movie-app/ : 前端React项目
- /movie-svc/ : Movie存取服务,Spring Boot + Maven项目
- /docker-compose.yml : 本地docker compose镜像构建和部署文件
Review源码时,Spring Boot应用建议可使用IntellJ IDEA打开,React应用建议可使用VS Code打开,MySQL数据库可使用MySQLWorkbench查看。
请关注我在CSDN上的博客