Spring Cloud / Alibaba 微服务架构 | 2021年11月更文挑战(11)

140 阅读3分钟

这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

授权、鉴权中心微服务在我们的系统中最核心的功能是注册和授权。当然,也可以做任意的扩展,例如给用户赋予角色,不同的角色拥有不同的权限等。

授权、鉴权中心微服务功能设计

客户端的请求首先会到达网关(SpringCloud Gateway),由网关去和授权、鉴权中心微服务通信。我们需要实现用户注册、登录持久化、鉴权等功能。

一、用户登录持久化

登录持久化即保持用户登录状态,用户不需要每次都输入用户名密码来说明自己的身份,有两种方案。

方案一

Session数据持久化,将信息写入数据库或其它持久层,各种服务收到请求后,都向持久层请求数据。 这种方案的优点是架构清晰,缺点是工作量大,持久层服务如果挂了就无了。

方案二

服务器不保存Session数据,所有数据都保存在客户端,每次请求都会发回服务器,JWT就是该方案的一个代表,我们的项目就是使用JWT来实现。

二、用户注册、授权

注册和授权通过JWT Token来实现,授权就是将用户信息生成JWT Token返回给客户端,由于JWT Token在每一次用户与服务端交互中都存在,所以JWT Token中的用户数据不应该过多,一些私密的信息也不应该存储在里面。

三、鉴权

其实我们这个项目的鉴权部分没有放在这个微服务中,而是通过common util来实现(可以考虑中数据表层面做二次校验),可以简单认为这就是一个工具类,对客户端传过来的JWT解析鉴别用户身份。

之所以将鉴权部分单独提取出来,原因有两点:

原因一

JWT本身是通过算法计算得到的加密字符串,而且可以通过反向算法解析得到原来的字符串,所以它并不强依赖于某个框架,例如说它不依赖于Spring Boot或Spring Cloud这样的微服务框架。我们可以认为JWT的鉴权部分其实就是一个Java文件,有单独提取出来而不依赖于任何框架的前提。

原因二

我们的项目包含多个微服务,很显然每个微服务都需要鉴权的功能来获取用户信息,因为微服务中的调用是走HTTP请求,而引入工具类common util只是本地java的一个动作,性能提升肯定是几十倍的。为了高性能地去解决这个问题,所以将鉴权功能单独提取出来。

该Spring Cloud / Alibaba 微服务架构系列文章感谢张勤一老师的指导!