前言
自从我和极客时间合作的课程《微服务架构和实践160讲》上线以来,陆续收到一些学员的反馈,包括:
- Spring Cloud OAuth2复杂难以理解
- OAuth2的四个流程到底是如何实现的?
- 课程缺乏项目架构设计和实战开发案例
- 波波老师实践中是如何做架构设计的?
基于学员的上述反馈和疑问,同时考虑到OAuth2是微服务架构的重要环节,我决定带领大家分析一个轻量级OAuth2服务器(项目名Gravitee)的设计和实现,让大家深入理解OAuth2服务的原理和实现,同时解答大家的一些疑问。
我这边Gravitee项目使用Golang语言实现,为啥使用Golang呢?原因如下:
- Golang语言简单,语法简洁受控,适合课程讲解
- Golang由Google公司开发支持,背书强大,社区生态好
- Golang语言是云原生基础语言,近年社区热门的开源产品,例如k8s/docker/etcd/istio等,都是使用Golang语言开发
- 微服务多语言(polygolot)开发的趋势,目前很多互联网公司会同时采用若干种语言开发业务和系统服务,互为补充
- OAuth2本身实现和具体语言无关,理解了Golang版代码,不难用其它语言(如Java)实现
注意!!!
- 本项目代码仅为课程讲解开发,不是生产级!!!如需生产化,则还需要做很多生产扩展+严格的测试,具体见项目扩展环节。同时,你若对本项目做了有价值生产扩展,欢迎提交pull requets到https://github.com/spring2go/gravitee
- 本项目源码主要参考RichardKnop的go-oauth2-server[附录1],感谢原作者!本项目对原项目主要做了如下修改:
- 数据库从postgresql改为mysql
- 配置简化为使用本地配置文件
- 依赖更新和使用glide[附录6]管理
架构和设计
总体架构和接口模型
Gravitee总体架构比较简单,使用mysql数据库做存储。数据库之上是数据访问模块,封装数据模型操作。中间层是OAuth2服务模块,这个是Gravitee核心